* [PATCH v16 1/7] drm/ttm: Provide a shmem backup implementation
2025-01-30 10:13 [PATCH v16 0/7] TTM shrinker helpers and xe buffer object shrinker Thomas Hellström
@ 2025-01-30 10:13 ` Thomas Hellström
2025-01-31 15:06 ` Christian König
2025-01-30 10:13 ` [PATCH v16 2/7] drm/ttm/pool, drm/ttm/tt: Provide a helper to shrink pages Thomas Hellström
` (13 subsequent siblings)
14 siblings, 1 reply; 26+ messages in thread
From: Thomas Hellström @ 2025-01-30 10:13 UTC (permalink / raw)
To: intel-xe
Cc: Thomas Hellström, Christian König,
Somalapuram Amaranath, Matthew Brost, dri-devel
Provide a standalone shmem backup implementation.
Given the ttm_backup interface, this could
later on be extended to providing other backup
implementation than shmem, with one use-case being
GPU swapout to a user-provided fd.
v5:
- Fix a UAF. (kernel test robot, Dan Carptenter)
v6:
- Rename ttm_backup_shmem_copy_page() function argument
(Matthew Brost)
- Add some missing documentation
v8:
- Use folio_file_page to get to the page we want to writeback
instead of using the first page of the folio.
v13:
- Remove the base class abstraction (Christian König)
- Include ttm_backup_bytes_avail().
v14:
- Fix kerneldoc for ttm_backup_bytes_avail() (0-day)
- Work around casting of __randomize_layout struct pointer (0-day)
v15:
- Return negative error code from ttm_backup_backup_page()
(Christian König)
- Doc fixes. (Christian König).
Cc: Christian König <christian.koenig@amd.com>
Cc: Somalapuram Amaranath <Amaranath.Somalapuram@amd.com>
Cc: Matthew Brost <matthew.brost@intel.com>
Cc: <dri-devel@lists.freedesktop.org>
Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Reviewed-by: Matthew Brost <matthew.brost@intel.com> #v13
---
drivers/gpu/drm/ttm/Makefile | 2 +-
drivers/gpu/drm/ttm/ttm_backup.c | 207 +++++++++++++++++++++++++++++++
include/drm/ttm/ttm_backup.h | 74 +++++++++++
3 files changed, 282 insertions(+), 1 deletion(-)
create mode 100644 drivers/gpu/drm/ttm/ttm_backup.c
create mode 100644 include/drm/ttm/ttm_backup.h
diff --git a/drivers/gpu/drm/ttm/Makefile b/drivers/gpu/drm/ttm/Makefile
index dad298127226..40d07a35293a 100644
--- a/drivers/gpu/drm/ttm/Makefile
+++ b/drivers/gpu/drm/ttm/Makefile
@@ -4,7 +4,7 @@
ttm-y := ttm_tt.o ttm_bo.o ttm_bo_util.o ttm_bo_vm.o ttm_module.o \
ttm_execbuf_util.o ttm_range_manager.o ttm_resource.o ttm_pool.o \
- ttm_device.o ttm_sys_manager.o
+ ttm_device.o ttm_sys_manager.o ttm_backup.o
ttm-$(CONFIG_AGP) += ttm_agp_backend.o
obj-$(CONFIG_DRM_TTM) += ttm.o
diff --git a/drivers/gpu/drm/ttm/ttm_backup.c b/drivers/gpu/drm/ttm/ttm_backup.c
new file mode 100644
index 000000000000..93c007f18855
--- /dev/null
+++ b/drivers/gpu/drm/ttm/ttm_backup.c
@@ -0,0 +1,207 @@
+// SPDX-License-Identifier: MIT
+/*
+ * Copyright © 2024 Intel Corporation
+ */
+
+#include <drm/ttm/ttm_backup.h>
+#include <linux/page-flags.h>
+#include <linux/swap.h>
+
+/*
+ * Casting from randomized struct file * to struct ttm_backup * is fine since
+ * struct ttm_backup is never defined nor dereferenced.
+ */
+static struct file *ttm_backup_to_file(struct ttm_backup *backup)
+{
+ return (void *)backup;
+}
+
+static struct ttm_backup *ttm_file_to_backup(struct file *file)
+{
+ return (void *)file;
+}
+
+/*
+ * Need to map shmem indices to handle since a handle value
+ * of 0 means error, following the swp_entry_t convention.
+ */
+static unsigned long ttm_backup_shmem_idx_to_handle(pgoff_t idx)
+{
+ return (unsigned long)idx + 1;
+}
+
+static pgoff_t ttm_backup_handle_to_shmem_idx(pgoff_t handle)
+{
+ return handle - 1;
+}
+
+/**
+ * ttm_backup_drop() - release memory associated with a handle
+ * @backup: The struct backup pointer used to obtain the handle
+ * @handle: The handle obtained from the @backup_page function.
+ */
+void ttm_backup_drop(struct ttm_backup *backup, pgoff_t handle)
+{
+ loff_t start = ttm_backup_handle_to_shmem_idx(handle);
+
+ start <<= PAGE_SHIFT;
+ shmem_truncate_range(file_inode(ttm_backup_to_file(backup)), start,
+ start + PAGE_SIZE - 1);
+}
+
+/**
+ * ttm_backup_copy_page() - Copy the contents of a previously backed
+ * up page
+ * @backup: The struct backup pointer used to back up the page.
+ * @dst: The struct page to copy into.
+ * @handle: The handle returned when the page was backed up.
+ * @intr: Try to perform waits interruptable or at least killable.
+ *
+ * Return: 0 on success, Negative error code on failure, notably
+ * -EINTR if @intr was set to true and a signal is pending.
+ */
+int ttm_backup_copy_page(struct ttm_backup *backup, struct page *dst,
+ pgoff_t handle, bool intr)
+{
+ struct file *filp = ttm_backup_to_file(backup);
+ struct address_space *mapping = filp->f_mapping;
+ struct folio *from_folio;
+ pgoff_t idx = ttm_backup_handle_to_shmem_idx(handle);
+
+ from_folio = shmem_read_folio(mapping, idx);
+ if (IS_ERR(from_folio))
+ return PTR_ERR(from_folio);
+
+ copy_highpage(dst, folio_file_page(from_folio, idx));
+ folio_put(from_folio);
+
+ return 0;
+}
+
+/**
+ * ttm_backup_backup_page() - Backup a page
+ * @backup: The struct backup pointer to use.
+ * @page: The page to back up.
+ * @writeback: Whether to perform immediate writeback of the page.
+ * This may have performance implications.
+ * @idx: A unique integer for each page and each struct backup.
+ * This allows the backup implementation to avoid managing
+ * its address space separately.
+ * @page_gfp: The gfp value used when the page was allocated.
+ * This is used for accounting purposes.
+ * @alloc_gfp: The gfp to be used when allocating memory.
+ *
+ * Context: If called from reclaim context, the caller needs to
+ * assert that the shrinker gfp has __GFP_FS set, to avoid
+ * deadlocking on lock_page(). If @writeback is set to true and
+ * called from reclaim context, the caller also needs to assert
+ * that the shrinker gfp has __GFP_IO set, since without it,
+ * we're not allowed to start backup IO.
+ *
+ * Return: A handle on success. Negative error code on failure.
+ *
+ * Note: This function could be extended to back up a folio and
+ * implementations would then split the folio internally if needed.
+ * Drawback is that the caller would then have to keep track of
+ * the folio size- and usage.
+ */
+s64
+ttm_backup_backup_page(struct ttm_backup *backup, struct page *page,
+ bool writeback, pgoff_t idx, gfp_t page_gfp,
+ gfp_t alloc_gfp)
+{
+ struct file *filp = ttm_backup_to_file(backup);
+ struct address_space *mapping = filp->f_mapping;
+ unsigned long handle = 0;
+ struct folio *to_folio;
+ int ret;
+
+ to_folio = shmem_read_folio_gfp(mapping, idx, alloc_gfp);
+ if (IS_ERR(to_folio))
+ return PTR_ERR(to_folio);
+
+ folio_mark_accessed(to_folio);
+ folio_lock(to_folio);
+ folio_mark_dirty(to_folio);
+ copy_highpage(folio_file_page(to_folio, idx), page);
+ handle = ttm_backup_shmem_idx_to_handle(idx);
+
+ if (writeback && !folio_mapped(to_folio) &&
+ folio_clear_dirty_for_io(to_folio)) {
+ struct writeback_control wbc = {
+ .sync_mode = WB_SYNC_NONE,
+ .nr_to_write = SWAP_CLUSTER_MAX,
+ .range_start = 0,
+ .range_end = LLONG_MAX,
+ .for_reclaim = 1,
+ };
+ folio_set_reclaim(to_folio);
+ ret = mapping->a_ops->writepage(folio_file_page(to_folio, idx), &wbc);
+ if (!folio_test_writeback(to_folio))
+ folio_clear_reclaim(to_folio);
+ /*
+ * If writepage succeeds, it unlocks the folio.
+ * writepage() errors are otherwise dropped, since writepage()
+ * is only best effort here.
+ */
+ if (ret)
+ folio_unlock(to_folio);
+ } else {
+ folio_unlock(to_folio);
+ }
+
+ folio_put(to_folio);
+
+ return handle;
+}
+
+/**
+ * ttm_backup_fini() - Free the struct backup resources after last use.
+ * @backup: Pointer to the struct backup whose resources to free.
+ *
+ * After a call to this function, it's illegal to use the @backup pointer.
+ */
+void ttm_backup_fini(struct ttm_backup *backup)
+{
+ fput(ttm_backup_to_file(backup));
+}
+
+/**
+ * ttm_backup_bytes_avail() - Report the approximate number of bytes of backup space
+ * left for backup.
+ *
+ * This function is intended also for driver use to indicate whether a
+ * backup attempt is meaningful.
+ *
+ * Return: An approximate size of backup space available.
+ */
+u64 ttm_backup_bytes_avail(void)
+{
+ /*
+ * The idea behind backing up to shmem is that shmem objects may
+ * eventually be swapped out. So no point swapping out if there
+ * is no or low swap-space available. But the accuracy of this
+ * number also depends on shmem actually swapping out backed-up
+ * shmem objects without too much buffering.
+ */
+ return (u64)get_nr_swap_pages() << PAGE_SHIFT;
+}
+EXPORT_SYMBOL_GPL(ttm_backup_bytes_avail);
+
+/**
+ * ttm_backup_shmem_create() - Create a shmem-based struct backup.
+ * @size: The maximum size (in bytes) to back up.
+ *
+ * Create a backup utilizing shmem objects.
+ *
+ * Return: A pointer to a struct ttm_backup on success,
+ * an error pointer on error.
+ */
+struct ttm_backup *ttm_backup_shmem_create(loff_t size)
+{
+ struct file *filp;
+
+ filp = shmem_file_setup("ttm shmem backup", size, 0);
+
+ return ttm_file_to_backup(filp);
+}
diff --git a/include/drm/ttm/ttm_backup.h b/include/drm/ttm/ttm_backup.h
new file mode 100644
index 000000000000..24ad120b8827
--- /dev/null
+++ b/include/drm/ttm/ttm_backup.h
@@ -0,0 +1,74 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright © 2024 Intel Corporation
+ */
+
+#ifndef _TTM_BACKUP_H_
+#define _TTM_BACKUP_H_
+
+#include <linux/mm_types.h>
+#include <linux/shmem_fs.h>
+
+struct ttm_backup;
+
+/**
+ * ttm_backup_handle_to_page_ptr() - Convert handle to struct page pointer
+ * @handle: The handle to convert.
+ *
+ * Converts an opaque handle received from the
+ * struct ttm_backoup_ops::backup_page() function to an (invalid)
+ * struct page pointer suitable for a struct page array.
+ *
+ * Return: An (invalid) struct page pointer.
+ */
+static inline struct page *
+ttm_backup_handle_to_page_ptr(unsigned long handle)
+{
+ return (struct page *)(handle << 1 | 1);
+}
+
+/**
+ * ttm_backup_page_ptr_is_handle() - Whether a struct page pointer is a handle
+ * @page: The struct page pointer to check.
+ *
+ * Return: true if the struct page pointer is a handld returned from
+ * ttm_backup_handle_to_page_ptr(). False otherwise.
+ */
+static inline bool ttm_backup_page_ptr_is_handle(const struct page *page)
+{
+ return (unsigned long)page & 1;
+}
+
+/**
+ * ttm_backup_page_ptr_to_handle() - Convert a struct page pointer to a handle
+ * @page: The struct page pointer to convert
+ *
+ * Return: The handle that was previously used in
+ * ttm_backup_handle_to_page_ptr() to obtain a struct page pointer, suitable
+ * for use as argument in the struct ttm_backup_ops drop() or
+ * copy_backed_up_page() functions.
+ */
+static inline unsigned long
+ttm_backup_page_ptr_to_handle(const struct page *page)
+{
+ WARN_ON(!ttm_backup_page_ptr_is_handle(page));
+ return (unsigned long)page >> 1;
+}
+
+void ttm_backup_drop(struct ttm_backup *backup, pgoff_t handle);
+
+int ttm_backup_copy_page(struct ttm_backup *backup, struct page *dst,
+ pgoff_t handle, bool intr);
+
+s64
+ttm_backup_backup_page(struct ttm_backup *backup, struct page *page,
+ bool writeback, pgoff_t idx, gfp_t page_gfp,
+ gfp_t alloc_gfp);
+
+void ttm_backup_fini(struct ttm_backup *backup);
+
+u64 ttm_backup_bytes_avail(void);
+
+struct ttm_backup *ttm_backup_shmem_create(loff_t size);
+
+#endif
--
2.48.1
^ permalink raw reply related [flat|nested] 26+ messages in thread* Re: [PATCH v16 1/7] drm/ttm: Provide a shmem backup implementation
2025-01-30 10:13 ` [PATCH v16 1/7] drm/ttm: Provide a shmem backup implementation Thomas Hellström
@ 2025-01-31 15:06 ` Christian König
0 siblings, 0 replies; 26+ messages in thread
From: Christian König @ 2025-01-31 15:06 UTC (permalink / raw)
To: Thomas Hellström, intel-xe
Cc: Somalapuram Amaranath, Matthew Brost, dri-devel
Am 30.01.25 um 11:13 schrieb Thomas Hellström:
> Provide a standalone shmem backup implementation.
> Given the ttm_backup interface, this could
> later on be extended to providing other backup
> implementation than shmem, with one use-case being
> GPU swapout to a user-provided fd.
>
> v5:
> - Fix a UAF. (kernel test robot, Dan Carptenter)
> v6:
> - Rename ttm_backup_shmem_copy_page() function argument
> (Matthew Brost)
> - Add some missing documentation
> v8:
> - Use folio_file_page to get to the page we want to writeback
> instead of using the first page of the folio.
> v13:
> - Remove the base class abstraction (Christian König)
> - Include ttm_backup_bytes_avail().
> v14:
> - Fix kerneldoc for ttm_backup_bytes_avail() (0-day)
> - Work around casting of __randomize_layout struct pointer (0-day)
> v15:
> - Return negative error code from ttm_backup_backup_page()
> (Christian König)
> - Doc fixes. (Christian König).
>
> Cc: Christian König <christian.koenig@amd.com>
> Cc: Somalapuram Amaranath <Amaranath.Somalapuram@amd.com>
> Cc: Matthew Brost <matthew.brost@intel.com>
> Cc: <dri-devel@lists.freedesktop.org>
> Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
> Reviewed-by: Matthew Brost <matthew.brost@intel.com> #v13
Reviewed-by: Christian König <christian.koenig@amd.com>
> ---
> drivers/gpu/drm/ttm/Makefile | 2 +-
> drivers/gpu/drm/ttm/ttm_backup.c | 207 +++++++++++++++++++++++++++++++
> include/drm/ttm/ttm_backup.h | 74 +++++++++++
> 3 files changed, 282 insertions(+), 1 deletion(-)
> create mode 100644 drivers/gpu/drm/ttm/ttm_backup.c
> create mode 100644 include/drm/ttm/ttm_backup.h
>
> diff --git a/drivers/gpu/drm/ttm/Makefile b/drivers/gpu/drm/ttm/Makefile
> index dad298127226..40d07a35293a 100644
> --- a/drivers/gpu/drm/ttm/Makefile
> +++ b/drivers/gpu/drm/ttm/Makefile
> @@ -4,7 +4,7 @@
>
> ttm-y := ttm_tt.o ttm_bo.o ttm_bo_util.o ttm_bo_vm.o ttm_module.o \
> ttm_execbuf_util.o ttm_range_manager.o ttm_resource.o ttm_pool.o \
> - ttm_device.o ttm_sys_manager.o
> + ttm_device.o ttm_sys_manager.o ttm_backup.o
> ttm-$(CONFIG_AGP) += ttm_agp_backend.o
>
> obj-$(CONFIG_DRM_TTM) += ttm.o
> diff --git a/drivers/gpu/drm/ttm/ttm_backup.c b/drivers/gpu/drm/ttm/ttm_backup.c
> new file mode 100644
> index 000000000000..93c007f18855
> --- /dev/null
> +++ b/drivers/gpu/drm/ttm/ttm_backup.c
> @@ -0,0 +1,207 @@
> +// SPDX-License-Identifier: MIT
> +/*
> + * Copyright © 2024 Intel Corporation
> + */
> +
> +#include <drm/ttm/ttm_backup.h>
> +#include <linux/page-flags.h>
> +#include <linux/swap.h>
> +
> +/*
> + * Casting from randomized struct file * to struct ttm_backup * is fine since
> + * struct ttm_backup is never defined nor dereferenced.
> + */
> +static struct file *ttm_backup_to_file(struct ttm_backup *backup)
> +{
> + return (void *)backup;
> +}
> +
> +static struct ttm_backup *ttm_file_to_backup(struct file *file)
> +{
> + return (void *)file;
> +}
> +
> +/*
> + * Need to map shmem indices to handle since a handle value
> + * of 0 means error, following the swp_entry_t convention.
> + */
> +static unsigned long ttm_backup_shmem_idx_to_handle(pgoff_t idx)
> +{
> + return (unsigned long)idx + 1;
> +}
> +
> +static pgoff_t ttm_backup_handle_to_shmem_idx(pgoff_t handle)
> +{
> + return handle - 1;
> +}
> +
> +/**
> + * ttm_backup_drop() - release memory associated with a handle
> + * @backup: The struct backup pointer used to obtain the handle
> + * @handle: The handle obtained from the @backup_page function.
> + */
> +void ttm_backup_drop(struct ttm_backup *backup, pgoff_t handle)
> +{
> + loff_t start = ttm_backup_handle_to_shmem_idx(handle);
> +
> + start <<= PAGE_SHIFT;
> + shmem_truncate_range(file_inode(ttm_backup_to_file(backup)), start,
> + start + PAGE_SIZE - 1);
> +}
> +
> +/**
> + * ttm_backup_copy_page() - Copy the contents of a previously backed
> + * up page
> + * @backup: The struct backup pointer used to back up the page.
> + * @dst: The struct page to copy into.
> + * @handle: The handle returned when the page was backed up.
> + * @intr: Try to perform waits interruptable or at least killable.
> + *
> + * Return: 0 on success, Negative error code on failure, notably
> + * -EINTR if @intr was set to true and a signal is pending.
> + */
> +int ttm_backup_copy_page(struct ttm_backup *backup, struct page *dst,
> + pgoff_t handle, bool intr)
> +{
> + struct file *filp = ttm_backup_to_file(backup);
> + struct address_space *mapping = filp->f_mapping;
> + struct folio *from_folio;
> + pgoff_t idx = ttm_backup_handle_to_shmem_idx(handle);
> +
> + from_folio = shmem_read_folio(mapping, idx);
> + if (IS_ERR(from_folio))
> + return PTR_ERR(from_folio);
> +
> + copy_highpage(dst, folio_file_page(from_folio, idx));
> + folio_put(from_folio);
> +
> + return 0;
> +}
> +
> +/**
> + * ttm_backup_backup_page() - Backup a page
> + * @backup: The struct backup pointer to use.
> + * @page: The page to back up.
> + * @writeback: Whether to perform immediate writeback of the page.
> + * This may have performance implications.
> + * @idx: A unique integer for each page and each struct backup.
> + * This allows the backup implementation to avoid managing
> + * its address space separately.
> + * @page_gfp: The gfp value used when the page was allocated.
> + * This is used for accounting purposes.
> + * @alloc_gfp: The gfp to be used when allocating memory.
> + *
> + * Context: If called from reclaim context, the caller needs to
> + * assert that the shrinker gfp has __GFP_FS set, to avoid
> + * deadlocking on lock_page(). If @writeback is set to true and
> + * called from reclaim context, the caller also needs to assert
> + * that the shrinker gfp has __GFP_IO set, since without it,
> + * we're not allowed to start backup IO.
> + *
> + * Return: A handle on success. Negative error code on failure.
> + *
> + * Note: This function could be extended to back up a folio and
> + * implementations would then split the folio internally if needed.
> + * Drawback is that the caller would then have to keep track of
> + * the folio size- and usage.
> + */
> +s64
> +ttm_backup_backup_page(struct ttm_backup *backup, struct page *page,
> + bool writeback, pgoff_t idx, gfp_t page_gfp,
> + gfp_t alloc_gfp)
> +{
> + struct file *filp = ttm_backup_to_file(backup);
> + struct address_space *mapping = filp->f_mapping;
> + unsigned long handle = 0;
> + struct folio *to_folio;
> + int ret;
> +
> + to_folio = shmem_read_folio_gfp(mapping, idx, alloc_gfp);
> + if (IS_ERR(to_folio))
> + return PTR_ERR(to_folio);
> +
> + folio_mark_accessed(to_folio);
> + folio_lock(to_folio);
> + folio_mark_dirty(to_folio);
> + copy_highpage(folio_file_page(to_folio, idx), page);
> + handle = ttm_backup_shmem_idx_to_handle(idx);
> +
> + if (writeback && !folio_mapped(to_folio) &&
> + folio_clear_dirty_for_io(to_folio)) {
> + struct writeback_control wbc = {
> + .sync_mode = WB_SYNC_NONE,
> + .nr_to_write = SWAP_CLUSTER_MAX,
> + .range_start = 0,
> + .range_end = LLONG_MAX,
> + .for_reclaim = 1,
> + };
> + folio_set_reclaim(to_folio);
> + ret = mapping->a_ops->writepage(folio_file_page(to_folio, idx), &wbc);
> + if (!folio_test_writeback(to_folio))
> + folio_clear_reclaim(to_folio);
> + /*
> + * If writepage succeeds, it unlocks the folio.
> + * writepage() errors are otherwise dropped, since writepage()
> + * is only best effort here.
> + */
> + if (ret)
> + folio_unlock(to_folio);
> + } else {
> + folio_unlock(to_folio);
> + }
> +
> + folio_put(to_folio);
> +
> + return handle;
> +}
> +
> +/**
> + * ttm_backup_fini() - Free the struct backup resources after last use.
> + * @backup: Pointer to the struct backup whose resources to free.
> + *
> + * After a call to this function, it's illegal to use the @backup pointer.
> + */
> +void ttm_backup_fini(struct ttm_backup *backup)
> +{
> + fput(ttm_backup_to_file(backup));
> +}
> +
> +/**
> + * ttm_backup_bytes_avail() - Report the approximate number of bytes of backup space
> + * left for backup.
> + *
> + * This function is intended also for driver use to indicate whether a
> + * backup attempt is meaningful.
> + *
> + * Return: An approximate size of backup space available.
> + */
> +u64 ttm_backup_bytes_avail(void)
> +{
> + /*
> + * The idea behind backing up to shmem is that shmem objects may
> + * eventually be swapped out. So no point swapping out if there
> + * is no or low swap-space available. But the accuracy of this
> + * number also depends on shmem actually swapping out backed-up
> + * shmem objects without too much buffering.
> + */
> + return (u64)get_nr_swap_pages() << PAGE_SHIFT;
> +}
> +EXPORT_SYMBOL_GPL(ttm_backup_bytes_avail);
> +
> +/**
> + * ttm_backup_shmem_create() - Create a shmem-based struct backup.
> + * @size: The maximum size (in bytes) to back up.
> + *
> + * Create a backup utilizing shmem objects.
> + *
> + * Return: A pointer to a struct ttm_backup on success,
> + * an error pointer on error.
> + */
> +struct ttm_backup *ttm_backup_shmem_create(loff_t size)
> +{
> + struct file *filp;
> +
> + filp = shmem_file_setup("ttm shmem backup", size, 0);
> +
> + return ttm_file_to_backup(filp);
> +}
> diff --git a/include/drm/ttm/ttm_backup.h b/include/drm/ttm/ttm_backup.h
> new file mode 100644
> index 000000000000..24ad120b8827
> --- /dev/null
> +++ b/include/drm/ttm/ttm_backup.h
> @@ -0,0 +1,74 @@
> +/* SPDX-License-Identifier: MIT */
> +/*
> + * Copyright © 2024 Intel Corporation
> + */
> +
> +#ifndef _TTM_BACKUP_H_
> +#define _TTM_BACKUP_H_
> +
> +#include <linux/mm_types.h>
> +#include <linux/shmem_fs.h>
> +
> +struct ttm_backup;
> +
> +/**
> + * ttm_backup_handle_to_page_ptr() - Convert handle to struct page pointer
> + * @handle: The handle to convert.
> + *
> + * Converts an opaque handle received from the
> + * struct ttm_backoup_ops::backup_page() function to an (invalid)
> + * struct page pointer suitable for a struct page array.
> + *
> + * Return: An (invalid) struct page pointer.
> + */
> +static inline struct page *
> +ttm_backup_handle_to_page_ptr(unsigned long handle)
> +{
> + return (struct page *)(handle << 1 | 1);
> +}
> +
> +/**
> + * ttm_backup_page_ptr_is_handle() - Whether a struct page pointer is a handle
> + * @page: The struct page pointer to check.
> + *
> + * Return: true if the struct page pointer is a handld returned from
> + * ttm_backup_handle_to_page_ptr(). False otherwise.
> + */
> +static inline bool ttm_backup_page_ptr_is_handle(const struct page *page)
> +{
> + return (unsigned long)page & 1;
> +}
> +
> +/**
> + * ttm_backup_page_ptr_to_handle() - Convert a struct page pointer to a handle
> + * @page: The struct page pointer to convert
> + *
> + * Return: The handle that was previously used in
> + * ttm_backup_handle_to_page_ptr() to obtain a struct page pointer, suitable
> + * for use as argument in the struct ttm_backup_ops drop() or
> + * copy_backed_up_page() functions.
> + */
> +static inline unsigned long
> +ttm_backup_page_ptr_to_handle(const struct page *page)
> +{
> + WARN_ON(!ttm_backup_page_ptr_is_handle(page));
> + return (unsigned long)page >> 1;
> +}
> +
> +void ttm_backup_drop(struct ttm_backup *backup, pgoff_t handle);
> +
> +int ttm_backup_copy_page(struct ttm_backup *backup, struct page *dst,
> + pgoff_t handle, bool intr);
> +
> +s64
> +ttm_backup_backup_page(struct ttm_backup *backup, struct page *page,
> + bool writeback, pgoff_t idx, gfp_t page_gfp,
> + gfp_t alloc_gfp);
> +
> +void ttm_backup_fini(struct ttm_backup *backup);
> +
> +u64 ttm_backup_bytes_avail(void);
> +
> +struct ttm_backup *ttm_backup_shmem_create(loff_t size);
> +
> +#endif
^ permalink raw reply [flat|nested] 26+ messages in thread
* [PATCH v16 2/7] drm/ttm/pool, drm/ttm/tt: Provide a helper to shrink pages
2025-01-30 10:13 [PATCH v16 0/7] TTM shrinker helpers and xe buffer object shrinker Thomas Hellström
2025-01-30 10:13 ` [PATCH v16 1/7] drm/ttm: Provide a shmem backup implementation Thomas Hellström
@ 2025-01-30 10:13 ` Thomas Hellström
2025-02-05 14:02 ` Christian König
2025-01-30 10:13 ` [PATCH v16 3/7] drm/ttm: Use fault-injection to test error paths Thomas Hellström
` (12 subsequent siblings)
14 siblings, 1 reply; 26+ messages in thread
From: Thomas Hellström @ 2025-01-30 10:13 UTC (permalink / raw)
To: intel-xe
Cc: Thomas Hellström, Christian König,
Somalapuram Amaranath, Matthew Brost, dri-devel
Provide a helper to shrink ttm_tt page-vectors on a per-page
basis. A ttm_backup backend could then in theory get away with
allocating a single temporary page for each struct ttm_tt.
This is accomplished by splitting larger pages before trying to
back them up.
In the future we could allow ttm_backup to handle backing up
large pages as well, but currently there's no benefit in
doing that, since the shmem backup backend would have to
split those anyway to avoid allocating too much temporary
memory, and if the backend instead inserts pages into the
swap-cache, those are split on reclaim by the core.
Due to potential backup- and recover errors, allow partially swapped
out struct ttm_tt's, although mark them as swapped out stopping them
from being swapped out a second time. More details in the ttm_pool.c
DOC section.
v2:
- A couple of cleanups and error fixes in ttm_pool_back_up_tt.
- s/back_up/backup/
- Add a writeback parameter to the exported interface.
v8:
- Use a struct for flags for readability (Matt Brost)
- Address misc other review comments (Matt Brost)
v9:
- Update the kerneldoc for the ttm_tt::backup field.
v10:
- Rebase.
v13:
- Rebase on ttm_backup interface change. Update kerneldoc.
- Rebase and adjust ttm_tt_is_swapped().
v15:
- Rebase on ttm_backup return value change.
- Rebase on previous restructuring of ttm_pool_alloc()
- Rework the ttm_pool backup interface (Christian König)
- Remove cond_resched() (Christian König)
- Get rid of the need to allocate an intermediate page array
when restoring a multi-order page (Christian König)
- Update documentation.
Cc: Christian König <christian.koenig@amd.com>
Cc: Somalapuram Amaranath <Amaranath.Somalapuram@amd.com>
Cc: Matthew Brost <matthew.brost@intel.com>
Cc: <dri-devel@lists.freedesktop.org>
Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Reviewed-by: Matthew Brost <matthew.brost@intel.com>
---
drivers/gpu/drm/ttm/ttm_pool.c | 554 +++++++++++++++++++++++++++++----
drivers/gpu/drm/ttm/ttm_tt.c | 54 ++++
include/drm/ttm/ttm_pool.h | 8 +
include/drm/ttm/ttm_tt.h | 67 +++-
4 files changed, 629 insertions(+), 54 deletions(-)
diff --git a/drivers/gpu/drm/ttm/ttm_pool.c b/drivers/gpu/drm/ttm/ttm_pool.c
index c9eba76d5143..ffb7abf52bab 100644
--- a/drivers/gpu/drm/ttm/ttm_pool.c
+++ b/drivers/gpu/drm/ttm/ttm_pool.c
@@ -41,6 +41,7 @@
#include <asm/set_memory.h>
#endif
+#include <drm/ttm/ttm_backup.h>
#include <drm/ttm/ttm_pool.h>
#include <drm/ttm/ttm_tt.h>
#include <drm/ttm/ttm_bo.h>
@@ -75,6 +76,35 @@ struct ttm_pool_alloc_state {
enum ttm_caching tt_caching;
};
+/**
+ * struct ttm_pool_tt_restore - State representing restore from backup
+ * @pool: The pool used for page allocation while restoring.
+ * @snapshot_alloc: A snapshot of the most recent struct ttm_pool_alloc_state.
+ * @alloced_page: Pointer to the page most recently allocated from a pool or system.
+ * @first_dma: The dma address corresponding to @alloced_page if dma_mapping
+ * is requested.
+ * @alloced_pages: The number of allocated pages present in the struct ttm_tt
+ * page vector from this restore session.
+ * @restored_pages: The number of 4K pages restored for @alloced_page (which
+ * is typically a multi-order page).
+ * @page_caching: The struct ttm_tt requested caching
+ * @order: The order of @alloced_page.
+ *
+ * Recovery from backup might fail when we've recovered less than the
+ * full ttm_tt. In order not to loose any data (yet), keep information
+ * around that allows us to restart a failed ttm backup recovery.
+ */
+struct ttm_pool_tt_restore {
+ struct ttm_pool *pool;
+ struct ttm_pool_alloc_state snapshot_alloc;
+ struct page *alloced_page;
+ dma_addr_t first_dma;
+ pgoff_t alloced_pages;
+ pgoff_t restored_pages;
+ enum ttm_caching page_caching;
+ unsigned int order;
+};
+
static unsigned long page_pool_size;
MODULE_PARM_DESC(page_pool_size, "Number of pages in the WC/UC/DMA pool");
@@ -199,12 +229,11 @@ static int ttm_pool_apply_caching(struct ttm_pool_alloc_state *alloc)
return 0;
}
-/* Map pages of 1 << order size and fill the DMA address array */
+/* DMA Map pages of 1 << order size and return the resulting dma_address. */
static int ttm_pool_map(struct ttm_pool *pool, unsigned int order,
- struct page *p, dma_addr_t **dma_addr)
+ struct page *p, dma_addr_t *dma_addr)
{
dma_addr_t addr;
- unsigned int i;
if (pool->use_dma_alloc) {
struct ttm_pool_dma *dma = (void *)p->private;
@@ -218,10 +247,7 @@ static int ttm_pool_map(struct ttm_pool *pool, unsigned int order,
return -EFAULT;
}
- for (i = 1 << order; i ; --i) {
- *(*dma_addr)++ = addr;
- addr += PAGE_SIZE;
- }
+ *dma_addr = addr;
return 0;
}
@@ -371,6 +397,190 @@ static unsigned int ttm_pool_page_order(struct ttm_pool *pool, struct page *p)
return p->private;
}
+/*
+ * Split larger pages so that we can free each PAGE_SIZE page as soon
+ * as it has been backed up, in order to avoid memory pressure during
+ * reclaim.
+ */
+static void ttm_pool_split_for_swap(struct ttm_pool *pool, struct page *p)
+{
+ unsigned int order = ttm_pool_page_order(pool, p);
+ pgoff_t nr;
+
+ if (!order)
+ return;
+
+ split_page(p, order);
+ nr = 1UL << order;
+ while (nr--)
+ (p++)->private = 0;
+}
+
+/**
+ * DOC: Partial backup and restoration of a struct ttm_tt.
+ *
+ * Swapout using ttm_backup_backup_page() and swapin using
+ * ttm_backup_copy_page() may fail.
+ * The former most likely due to lack of swap-space or memory, the latter due
+ * to lack of memory or because of signal interruption during waits.
+ *
+ * Backup failure is easily handled by using a ttm_tt pages vector that holds
+ * both backup handles and page pointers. This has to be taken into account when
+ * restoring such a ttm_tt from backup, and when freeing it while backed up.
+ * When restoring, for simplicity, new pages are actually allocated from the
+ * pool and the contents of any old pages are copied in and then the old pages
+ * are released.
+ *
+ * For restoration failures, the struct ttm_pool_tt_restore holds sufficient state
+ * to be able to resume an interrupted restore, and that structure is freed once
+ * the restoration is complete. If the struct ttm_tt is destroyed while there
+ * is a valid struct ttm_pool_tt_restore attached, that is also properly taken
+ * care of.
+ */
+
+/* Is restore ongoing for the currently allocated page? */
+static bool ttm_pool_restore_valid(const struct ttm_pool_tt_restore *restore)
+{
+ return restore && restore->restored_pages < (1 << restore->order);
+}
+
+/* DMA unmap and free a multi-order page, either to the relevant pool or to system. */
+static pgoff_t ttm_pool_unmap_and_free(struct ttm_pool *pool, struct page *page,
+ const dma_addr_t *dma_addr, enum ttm_caching caching)
+{
+ struct ttm_pool_type *pt = NULL;
+ unsigned int order;
+ pgoff_t nr;
+
+ if (pool) {
+ order = ttm_pool_page_order(pool, page);
+ nr = (1UL << order);
+ if (dma_addr)
+ ttm_pool_unmap(pool, *dma_addr, nr);
+
+ pt = ttm_pool_select_type(pool, caching, order);
+ } else {
+ order = page->private;
+ nr = (1UL << order);
+ }
+
+ if (pt)
+ ttm_pool_type_give(pt, page);
+ else
+ ttm_pool_free_page(pool, caching, order, page);
+
+ return nr;
+}
+
+/* Populate the page-array using the most recent allocated multi-order page. */
+static void ttm_pool_allocated_page_commit(struct page *allocated,
+ dma_addr_t first_dma,
+ struct ttm_pool_alloc_state *alloc,
+ pgoff_t nr)
+{
+ pgoff_t i;
+
+ for (i = 0; i < nr; ++i)
+ *alloc->pages++ = allocated++;
+
+ alloc->remaining_pages -= nr;
+
+ if (!alloc->dma_addr)
+ return;
+
+ for (i = 0; i < nr; ++i) {
+ *alloc->dma_addr++ = first_dma;
+ first_dma += PAGE_SIZE;
+ }
+}
+
+/*
+ * When restoring, restore backed-up content to the newly allocated page and
+ * if successful, populate the page-table and dma-address arrays.
+ */
+static int ttm_pool_restore_commit(struct ttm_pool_tt_restore *restore,
+ struct ttm_backup *backup,
+ const struct ttm_operation_ctx *ctx,
+ struct ttm_pool_alloc_state *alloc)
+
+{
+ pgoff_t i, nr = 1UL << restore->order;
+ struct page **first_page = alloc->pages;
+ struct page *p;
+ int ret = 0;
+
+ for (i = restore->restored_pages; i < nr; ++i) {
+ p = first_page[i];
+ if (ttm_backup_page_ptr_is_handle(p)) {
+ unsigned long handle = ttm_backup_page_ptr_to_handle(p);
+
+ if (handle == 0) {
+ restore->restored_pages++;
+ continue;
+ }
+
+ ret = ttm_backup_copy_page(backup, restore->alloced_page + i,
+ handle, ctx->interruptible);
+ if (ret)
+ break;
+
+ ttm_backup_drop(backup, handle);
+ } else if (p) {
+ /*
+ * We could probably avoid splitting the old page
+ * using clever logic, but ATM we don't care, as
+ * we prioritize releasing memory ASAP. Note that
+ * here, the old retained page is always write-back
+ * cached.
+ */
+ ttm_pool_split_for_swap(restore->pool, p);
+ copy_highpage(restore->alloced_page + i, p);
+ __free_pages(p, 0);
+ }
+
+ restore->restored_pages++;
+ first_page[i] = ttm_backup_handle_to_page_ptr(0);
+ }
+
+ if (ret) {
+ if (!restore->restored_pages) {
+ dma_addr_t *dma_addr = alloc->dma_addr ? &restore->first_dma : NULL;
+
+ ttm_pool_unmap_and_free(restore->pool, restore->alloced_page,
+ dma_addr, restore->page_caching);
+ restore->restored_pages = nr;
+ }
+ return ret;
+ }
+
+ ttm_pool_allocated_page_commit(restore->alloced_page, restore->first_dma,
+ alloc, nr);
+ if (restore->page_caching == alloc->tt_caching || PageHighMem(restore->alloced_page))
+ alloc->caching_divide = alloc->pages;
+ restore->snapshot_alloc = *alloc;
+ restore->alloced_pages += nr;
+
+ return 0;
+}
+
+/* If restoring, save information needed for ttm_pool_restore_commit(). */
+static void
+ttm_pool_page_allocated_restore(struct ttm_pool *pool, unsigned int order,
+ struct page *p,
+ enum ttm_caching page_caching,
+ dma_addr_t first_dma,
+ struct ttm_pool_tt_restore *restore,
+ const struct ttm_pool_alloc_state *alloc)
+{
+ restore->pool = pool;
+ restore->order = order;
+ restore->restored_pages = 0;
+ restore->page_caching = page_caching;
+ restore->first_dma = first_dma;
+ restore->alloced_page = p;
+ restore->snapshot_alloc = *alloc;
+}
+
/*
* Called when we got a page, either from a pool or newly allocated.
* if needed, dma map the page and populate the dma address array.
@@ -380,10 +590,11 @@ static unsigned int ttm_pool_page_order(struct ttm_pool *pool, struct page *p)
*/
static int ttm_pool_page_allocated(struct ttm_pool *pool, unsigned int order,
struct page *p, enum ttm_caching page_caching,
- struct ttm_pool_alloc_state *alloc)
+ struct ttm_pool_alloc_state *alloc,
+ struct ttm_pool_tt_restore *restore)
{
- pgoff_t i, nr = 1UL << order;
bool caching_consistent;
+ dma_addr_t first_dma;
int r = 0;
caching_consistent = (page_caching == alloc->tt_caching) || PageHighMem(p);
@@ -395,17 +606,20 @@ static int ttm_pool_page_allocated(struct ttm_pool *pool, unsigned int order,
}
if (alloc->dma_addr) {
- r = ttm_pool_map(pool, order, p, &alloc->dma_addr);
+ r = ttm_pool_map(pool, order, p, &first_dma);
if (r)
return r;
}
- alloc->remaining_pages -= nr;
- for (i = 0; i < nr; ++i)
- *alloc->pages++ = p++;
+ if (restore) {
+ ttm_pool_page_allocated_restore(pool, order, p, page_caching,
+ first_dma, restore, alloc);
+ } else {
+ ttm_pool_allocated_page_commit(p, first_dma, alloc, 1UL << order);
- if (caching_consistent)
- alloc->caching_divide = alloc->pages;
+ if (caching_consistent)
+ alloc->caching_divide = alloc->pages;
+ }
return 0;
}
@@ -428,22 +642,24 @@ static void ttm_pool_free_range(struct ttm_pool *pool, struct ttm_tt *tt,
pgoff_t start_page, pgoff_t end_page)
{
struct page **pages = &tt->pages[start_page];
- unsigned int order;
+ struct ttm_backup *backup = tt->backup;
pgoff_t i, nr;
for (i = start_page; i < end_page; i += nr, pages += nr) {
- struct ttm_pool_type *pt = NULL;
+ struct page *p = *pages;
- order = ttm_pool_page_order(pool, *pages);
- nr = (1UL << order);
- if (tt->dma_address)
- ttm_pool_unmap(pool, tt->dma_address[i], nr);
+ nr = 1;
+ if (ttm_backup_page_ptr_is_handle(p)) {
+ unsigned long handle = ttm_backup_page_ptr_to_handle(p);
- pt = ttm_pool_select_type(pool, caching, order);
- if (pt)
- ttm_pool_type_give(pt, *pages);
- else
- ttm_pool_free_page(pool, caching, order, *pages);
+ if (handle != 0)
+ ttm_backup_drop(backup, handle);
+ } else if (p) {
+ dma_addr_t *dma_addr = tt->dma_address ?
+ tt->dma_address + i : NULL;
+
+ nr = ttm_pool_unmap_and_free(pool, p, dma_addr, caching);
+ }
}
}
@@ -467,22 +683,11 @@ static unsigned int ttm_pool_alloc_find_order(unsigned int highest,
return min_t(unsigned int, highest, __fls(alloc->remaining_pages));
}
-/**
- * ttm_pool_alloc - Fill a ttm_tt object
- *
- * @pool: ttm_pool to use
- * @tt: ttm_tt object to fill
- * @ctx: operation context
- *
- * Fill the ttm_tt object with pages and also make sure to DMA map them when
- * necessary.
- *
- * Returns: 0 on successe, negative error code otherwise.
- */
-int ttm_pool_alloc(struct ttm_pool *pool, struct ttm_tt *tt,
- struct ttm_operation_ctx *ctx)
+static int __ttm_pool_alloc(struct ttm_pool *pool, struct ttm_tt *tt,
+ const struct ttm_operation_ctx *ctx,
+ struct ttm_pool_alloc_state *alloc,
+ struct ttm_pool_tt_restore *restore)
{
- struct ttm_pool_alloc_state alloc;
enum ttm_caching page_caching;
gfp_t gfp_flags = GFP_USER;
pgoff_t caching_divide;
@@ -491,10 +696,8 @@ int ttm_pool_alloc(struct ttm_pool *pool, struct ttm_tt *tt,
struct page *p;
int r;
- ttm_pool_alloc_state_init(tt, &alloc);
-
- WARN_ON(!alloc.remaining_pages || ttm_tt_is_populated(tt));
- WARN_ON(alloc.dma_addr && !pool->dev);
+ WARN_ON(!alloc->remaining_pages || ttm_tt_is_populated(tt));
+ WARN_ON(alloc->dma_addr && !pool->dev);
if (tt->page_flags & TTM_TT_FLAG_ZERO_ALLOC)
gfp_flags |= __GFP_ZERO;
@@ -509,9 +712,9 @@ int ttm_pool_alloc(struct ttm_pool *pool, struct ttm_tt *tt,
page_caching = tt->caching;
allow_pools = true;
- for (order = ttm_pool_alloc_find_order(MAX_PAGE_ORDER, &alloc);
- alloc.remaining_pages;
- order = ttm_pool_alloc_find_order(order, &alloc)) {
+ for (order = ttm_pool_alloc_find_order(MAX_PAGE_ORDER, alloc);
+ alloc->remaining_pages;
+ order = ttm_pool_alloc_find_order(order, alloc)) {
struct ttm_pool_type *pt;
/* First, try to allocate a page from a pool if one exists. */
@@ -541,30 +744,120 @@ int ttm_pool_alloc(struct ttm_pool *pool, struct ttm_tt *tt,
r = -ENOMEM;
goto error_free_all;
}
- r = ttm_pool_page_allocated(pool, order, p, page_caching, &alloc);
+ r = ttm_pool_page_allocated(pool, order, p, page_caching, alloc,
+ restore);
if (r)
goto error_free_page;
+
+ if (ttm_pool_restore_valid(restore)) {
+ r = ttm_pool_restore_commit(restore, tt->backup, ctx, alloc);
+ if (r)
+ goto error_free_all;
+ }
}
- r = ttm_pool_apply_caching(&alloc);
+ r = ttm_pool_apply_caching(alloc);
if (r)
goto error_free_all;
+ kfree(tt->restore);
+ tt->restore = NULL;
+
return 0;
error_free_page:
ttm_pool_free_page(pool, page_caching, order, p);
error_free_all:
- caching_divide = alloc.caching_divide - tt->pages;
+ if (tt->restore)
+ return r;
+
+ caching_divide = alloc->caching_divide - tt->pages;
ttm_pool_free_range(pool, tt, tt->caching, 0, caching_divide);
ttm_pool_free_range(pool, tt, ttm_cached, caching_divide,
- tt->num_pages - alloc.remaining_pages);
+ tt->num_pages - alloc->remaining_pages);
return r;
}
+
+/**
+ * ttm_pool_alloc - Fill a ttm_tt object
+ *
+ * @pool: ttm_pool to use
+ * @tt: ttm_tt object to fill
+ * @ctx: operation context
+ *
+ * Fill the ttm_tt object with pages and also make sure to DMA map them when
+ * necessary.
+ *
+ * Returns: 0 on successe, negative error code otherwise.
+ */
+int ttm_pool_alloc(struct ttm_pool *pool, struct ttm_tt *tt,
+ struct ttm_operation_ctx *ctx)
+{
+ struct ttm_pool_alloc_state alloc;
+
+ if (WARN_ON(ttm_tt_is_backed_up(tt)))
+ return -EINVAL;
+
+ ttm_pool_alloc_state_init(tt, &alloc);
+
+ return __ttm_pool_alloc(pool, tt, ctx, &alloc, NULL);
+}
EXPORT_SYMBOL(ttm_pool_alloc);
+/**
+ * ttm_pool_restore_and_alloc - Fill a ttm_tt, restoring previously backed-up
+ * content.
+ *
+ * @pool: ttm_pool to use
+ * @tt: ttm_tt object to fill
+ * @ctx: operation context
+ *
+ * Fill the ttm_tt object with pages and also make sure to DMA map them when
+ * necessary. Read in backed-up content.
+ *
+ * Returns: 0 on successe, negative error code otherwise.
+ */
+int ttm_pool_restore_and_alloc(struct ttm_pool *pool, struct ttm_tt *tt,
+ const struct ttm_operation_ctx *ctx)
+{
+ struct ttm_pool_alloc_state alloc;
+
+ if (WARN_ON(!ttm_tt_is_backed_up(tt)))
+ return -EINVAL;
+
+ if (!tt->restore) {
+ gfp_t gfp = GFP_KERNEL | __GFP_NOWARN;
+
+ ttm_pool_alloc_state_init(tt, &alloc);
+ if (ctx->gfp_retry_mayfail)
+ gfp |= __GFP_RETRY_MAYFAIL;
+
+ tt->restore = kzalloc(sizeof(*tt->restore), gfp);
+ if (!tt->restore)
+ return -ENOMEM;
+
+ tt->restore->snapshot_alloc = alloc;
+ tt->restore->pool = pool;
+ tt->restore->restored_pages = 1;
+ } else {
+ struct ttm_pool_tt_restore *restore = tt->restore;
+ int ret;
+
+ alloc = restore->snapshot_alloc;
+ if (ttm_pool_restore_valid(tt->restore)) {
+ ret = ttm_pool_restore_commit(restore, tt->backup, ctx, &alloc);
+ if (ret)
+ return ret;
+ }
+ if (!alloc.remaining_pages)
+ return 0;
+ }
+
+ return __ttm_pool_alloc(pool, tt, ctx, &alloc, tt->restore);
+}
+
/**
* ttm_pool_free - Free the backing pages from a ttm_tt object
*
@@ -582,6 +875,163 @@ void ttm_pool_free(struct ttm_pool *pool, struct ttm_tt *tt)
}
EXPORT_SYMBOL(ttm_pool_free);
+/**
+ * ttm_pool_drop_backed_up() - Release content of a swapped-out struct ttm_tt
+ * @tt: The struct ttm_tt.
+ *
+ * Release handles with associated content or any remaining pages of
+ * a backed-up struct ttm_tt.
+ */
+void ttm_pool_drop_backed_up(struct ttm_tt *tt)
+{
+ struct ttm_pool_tt_restore *restore;
+ pgoff_t start_page = 0;
+
+ WARN_ON(!ttm_tt_is_backed_up(tt));
+
+ restore = tt->restore;
+
+ /*
+ * Unmap and free any uncommitted restore page.
+ * any tt page-array backup entries already read back has
+ * been cleared already
+ */
+ if (ttm_pool_restore_valid(restore)) {
+ dma_addr_t *dma_addr = tt->dma_address ? &restore->first_dma : NULL;
+
+ ttm_pool_unmap_and_free(restore->pool, restore->alloced_page,
+ dma_addr, restore->page_caching);
+ restore->restored_pages = 1UL << restore->order;
+ }
+
+ /*
+ * If a restore is ongoing, part of the tt pages may have a
+ * caching different than writeback.
+ */
+ if (restore) {
+ pgoff_t mid = restore->snapshot_alloc.caching_divide - tt->pages;
+
+ start_page = restore->alloced_pages;
+ WARN_ON(mid > start_page);
+ /* Pages that might be dma-mapped and non-cached */
+ ttm_pool_free_range(restore->pool, tt, tt->caching,
+ 0, mid);
+ /* Pages that might be dma-mapped but cached */
+ ttm_pool_free_range(restore->pool, tt, ttm_cached,
+ mid, restore->alloced_pages);
+ kfree(restore);
+ tt->restore = NULL;
+ }
+
+ ttm_pool_free_range(NULL, tt, ttm_cached, start_page, tt->num_pages);
+}
+
+/**
+ * ttm_pool_backup() - Back up or purge a struct ttm_tt
+ * @pool: The pool used when allocating the struct ttm_tt.
+ * @tt: The struct ttm_tt.
+ * @flags: Flags to govern the backup behaviour.
+ *
+ * Back up or purge a struct ttm_tt. If @purge is true, then
+ * all pages will be freed directly to the system rather than to the pool
+ * they were allocated from, making the function behave similarly to
+ * ttm_pool_free(). If @purge is false the pages will be backed up instead,
+ * exchanged for handles.
+ * A subsequent call to ttm_pool_restore_and_alloc() will then read back the content and
+ * a subsequent call to ttm_pool_drop_backed_up() will drop it.
+ * If backup of a page fails for whatever reason, @ttm will still be
+ * partially backed up, retaining those pages for which backup fails.
+ * In that case, this function can be retried, possibly after freeing up
+ * memory resources.
+ *
+ * Return: Number of pages actually backed up or freed, or negative
+ * error code on error.
+ */
+long ttm_pool_backup(struct ttm_pool *pool, struct ttm_tt *tt,
+ const struct ttm_backup_flags *flags)
+{
+ struct ttm_backup *backup = tt->backup;
+ struct page *page;
+ unsigned long handle;
+ gfp_t alloc_gfp;
+ gfp_t gfp;
+ int ret = 0;
+ pgoff_t shrunken = 0;
+ pgoff_t i, num_pages;
+
+ if (WARN_ON(ttm_tt_is_backed_up(tt)))
+ return -EINVAL;
+
+ if ((!ttm_backup_bytes_avail() && !flags->purge) ||
+ pool->use_dma_alloc || ttm_tt_is_backed_up(tt))
+ return -EBUSY;
+
+#ifdef CONFIG_X86
+ /* Anything returned to the system needs to be cached. */
+ if (tt->caching != ttm_cached)
+ set_pages_array_wb(tt->pages, tt->num_pages);
+#endif
+
+ if (tt->dma_address || flags->purge) {
+ for (i = 0; i < tt->num_pages; i += num_pages) {
+ unsigned int order;
+
+ page = tt->pages[i];
+ if (unlikely(!page)) {
+ num_pages = 1;
+ continue;
+ }
+
+ order = ttm_pool_page_order(pool, page);
+ num_pages = 1UL << order;
+ if (tt->dma_address)
+ ttm_pool_unmap(pool, tt->dma_address[i],
+ num_pages);
+ if (flags->purge) {
+ shrunken += num_pages;
+ page->private = 0;
+ __free_pages(page, order);
+ memset(tt->pages + i, 0,
+ num_pages * sizeof(*tt->pages));
+ }
+ }
+ }
+
+ if (flags->purge)
+ return shrunken;
+
+ if (pool->use_dma32)
+ gfp = GFP_DMA32;
+ else
+ gfp = GFP_HIGHUSER;
+
+ alloc_gfp = GFP_KERNEL | __GFP_HIGH | __GFP_NOWARN | __GFP_RETRY_MAYFAIL;
+
+ for (i = 0; i < tt->num_pages; ++i) {
+ s64 shandle;
+
+ page = tt->pages[i];
+ if (unlikely(!page))
+ continue;
+
+ ttm_pool_split_for_swap(pool, page);
+
+ shandle = ttm_backup_backup_page(backup, page, flags->writeback, i,
+ gfp, alloc_gfp);
+ if (shandle < 0) {
+ /* We allow partially shrunken tts */
+ ret = shandle;
+ break;
+ }
+ handle = shandle;
+ tt->pages[i] = ttm_backup_handle_to_page_ptr(handle);
+ put_page(page);
+ shrunken++;
+ }
+
+ return shrunken ? shrunken : ret;
+}
+
/**
* ttm_pool_init - Initialize a pool
*
diff --git a/drivers/gpu/drm/ttm/ttm_tt.c b/drivers/gpu/drm/ttm/ttm_tt.c
index 3baf215eca23..00b7c28f2329 100644
--- a/drivers/gpu/drm/ttm/ttm_tt.c
+++ b/drivers/gpu/drm/ttm/ttm_tt.c
@@ -40,6 +40,7 @@
#include <drm/drm_cache.h>
#include <drm/drm_device.h>
#include <drm/drm_util.h>
+#include <drm/ttm/ttm_backup.h>
#include <drm/ttm/ttm_bo.h>
#include <drm/ttm/ttm_tt.h>
@@ -158,6 +159,8 @@ static void ttm_tt_init_fields(struct ttm_tt *ttm,
ttm->swap_storage = NULL;
ttm->sg = bo->sg;
ttm->caching = caching;
+ ttm->restore = NULL;
+ ttm->backup = NULL;
}
int ttm_tt_init(struct ttm_tt *ttm, struct ttm_buffer_object *bo,
@@ -182,6 +185,13 @@ void ttm_tt_fini(struct ttm_tt *ttm)
fput(ttm->swap_storage);
ttm->swap_storage = NULL;
+ if (ttm_tt_is_backed_up(ttm))
+ ttm_pool_drop_backed_up(ttm);
+ if (ttm->backup) {
+ ttm_backup_fini(ttm->backup);
+ ttm->backup = NULL;
+ }
+
if (ttm->pages)
kvfree(ttm->pages);
else
@@ -253,6 +263,49 @@ int ttm_tt_swapin(struct ttm_tt *ttm)
}
EXPORT_SYMBOL_FOR_TESTS_ONLY(ttm_tt_swapin);
+/**
+ * ttm_tt_backup() - Helper to back up a struct ttm_tt.
+ * @bdev: The TTM device.
+ * @tt: The struct ttm_tt.
+ * @flags: Flags that govern the backup behaviour.
+ *
+ * Update the page accounting and call ttm_pool_shrink_tt to free pages
+ * or back them up.
+ *
+ * Return: Number of pages freed or swapped out, or negative error code on
+ * error.
+ */
+long ttm_tt_backup(struct ttm_device *bdev, struct ttm_tt *tt,
+ const struct ttm_backup_flags flags)
+{
+ long ret;
+
+ if (WARN_ON(IS_ERR_OR_NULL(tt->backup)))
+ return 0;
+
+ ret = ttm_pool_backup(&bdev->pool, tt, &flags);
+ if (ret > 0) {
+ tt->page_flags &= ~TTM_TT_FLAG_PRIV_POPULATED;
+ tt->page_flags |= TTM_TT_FLAG_BACKED_UP;
+ }
+
+ return ret;
+}
+
+int ttm_tt_restore(struct ttm_device *bdev, struct ttm_tt *tt,
+ const struct ttm_operation_ctx *ctx)
+{
+ int ret = ttm_pool_restore_and_alloc(&bdev->pool, tt, ctx);
+
+ if (ret)
+ return ret;
+
+ tt->page_flags &= ~TTM_TT_FLAG_BACKED_UP;
+
+ return 0;
+}
+EXPORT_SYMBOL(ttm_tt_restore);
+
/**
* ttm_tt_swapout - swap out tt object
*
@@ -348,6 +401,7 @@ int ttm_tt_populate(struct ttm_device *bdev,
goto error;
ttm->page_flags |= TTM_TT_FLAG_PRIV_POPULATED;
+ ttm->page_flags &= ~TTM_TT_FLAG_BACKED_UP;
if (unlikely(ttm->page_flags & TTM_TT_FLAG_SWAPPED)) {
ret = ttm_tt_swapin(ttm);
if (unlikely(ret != 0)) {
diff --git a/include/drm/ttm/ttm_pool.h b/include/drm/ttm/ttm_pool.h
index 160d954a261e..54cd34a6e4c0 100644
--- a/include/drm/ttm/ttm_pool.h
+++ b/include/drm/ttm/ttm_pool.h
@@ -33,6 +33,7 @@
struct device;
struct seq_file;
+struct ttm_backup_flags;
struct ttm_operation_ctx;
struct ttm_pool;
struct ttm_tt;
@@ -89,6 +90,13 @@ void ttm_pool_fini(struct ttm_pool *pool);
int ttm_pool_debugfs(struct ttm_pool *pool, struct seq_file *m);
+void ttm_pool_drop_backed_up(struct ttm_tt *tt);
+
+long ttm_pool_backup(struct ttm_pool *pool, struct ttm_tt *ttm,
+ const struct ttm_backup_flags *flags);
+int ttm_pool_restore_and_alloc(struct ttm_pool *pool, struct ttm_tt *tt,
+ const struct ttm_operation_ctx *ctx);
+
int ttm_pool_mgr_init(unsigned long num_pages);
void ttm_pool_mgr_fini(void);
diff --git a/include/drm/ttm/ttm_tt.h b/include/drm/ttm/ttm_tt.h
index 991edafdb2dd..c736c01ac2ca 100644
--- a/include/drm/ttm/ttm_tt.h
+++ b/include/drm/ttm/ttm_tt.h
@@ -32,11 +32,13 @@
#include <drm/ttm/ttm_caching.h>
#include <drm/ttm/ttm_kmap_iter.h>
+struct ttm_backup;
struct ttm_device;
struct ttm_tt;
struct ttm_resource;
struct ttm_buffer_object;
struct ttm_operation_ctx;
+struct ttm_pool_tt_restore;
/**
* struct ttm_tt - This is a structure holding the pages, caching- and aperture
@@ -85,17 +87,22 @@ struct ttm_tt {
* fault handling abuses the DMA api a bit and dma_map_attrs can't be
* used to assure pgprot always matches.
*
+ * TTM_TT_FLAG_BACKED_UP: TTM internal only. This is set if the
+ * struct ttm_tt has been (possibly partially) backed up.
+ *
* TTM_TT_FLAG_PRIV_POPULATED: TTM internal only. DO NOT USE. This is
* set by TTM after ttm_tt_populate() has successfully returned, and is
* then unset when TTM calls ttm_tt_unpopulate().
+ *
*/
#define TTM_TT_FLAG_SWAPPED BIT(0)
#define TTM_TT_FLAG_ZERO_ALLOC BIT(1)
#define TTM_TT_FLAG_EXTERNAL BIT(2)
#define TTM_TT_FLAG_EXTERNAL_MAPPABLE BIT(3)
#define TTM_TT_FLAG_DECRYPTED BIT(4)
+#define TTM_TT_FLAG_BACKED_UP BIT(5)
-#define TTM_TT_FLAG_PRIV_POPULATED BIT(5)
+#define TTM_TT_FLAG_PRIV_POPULATED BIT(6)
uint32_t page_flags;
/** @num_pages: Number of pages in the page array. */
uint32_t num_pages;
@@ -105,11 +112,20 @@ struct ttm_tt {
dma_addr_t *dma_address;
/** @swap_storage: Pointer to shmem struct file for swap storage. */
struct file *swap_storage;
+ /**
+ * @backup: Pointer to backup struct for backed up tts.
+ * Could be unified with @swap_storage. Meanwhile, the driver's
+ * ttm_tt_create() callback is responsible for assigning
+ * this field.
+ */
+ struct ttm_backup *backup;
/**
* @caching: The current caching state of the pages, see enum
* ttm_caching.
*/
enum ttm_caching caching;
+ /** @restore: Partial restoration from backup state. TTM private */
+ struct ttm_pool_tt_restore *restore;
};
/**
@@ -129,9 +145,38 @@ static inline bool ttm_tt_is_populated(struct ttm_tt *tt)
return tt->page_flags & TTM_TT_FLAG_PRIV_POPULATED;
}
+/**
+ * ttm_tt_is_swapped() - Whether the ttm_tt is swapped out or backed up
+ * @tt: The struct ttm_tt.
+ *
+ * Return: true if swapped or backed up, false otherwise.
+ */
static inline bool ttm_tt_is_swapped(const struct ttm_tt *tt)
{
- return tt->page_flags & TTM_TT_FLAG_SWAPPED;
+ return tt->page_flags & (TTM_TT_FLAG_SWAPPED | TTM_TT_FLAG_BACKED_UP);
+}
+
+/**
+ * ttm_tt_is_backed_up() - Whether the ttm_tt backed up
+ * @tt: The struct ttm_tt.
+ *
+ * Return: true if swapped or backed up, false otherwise.
+ */
+static inline bool ttm_tt_is_backed_up(const struct ttm_tt *tt)
+{
+ return tt->page_flags & TTM_TT_FLAG_BACKED_UP;
+}
+
+/**
+ * ttm_tt_clear_backed_up() - Clear the ttm_tt backed-up status
+ * @tt: The struct ttm_tt.
+ *
+ * Drivers can use this functionto clear the backed-up status,
+ * for example before destroying or re-validating a purged tt.
+ */
+static inline void ttm_tt_clear_backed_up(struct ttm_tt *tt)
+{
+ tt->page_flags &= ~TTM_TT_FLAG_BACKED_UP;
}
/**
@@ -235,6 +280,24 @@ void ttm_tt_mgr_init(unsigned long num_pages, unsigned long num_dma32_pages);
struct ttm_kmap_iter *ttm_kmap_iter_tt_init(struct ttm_kmap_iter_tt *iter_tt,
struct ttm_tt *tt);
unsigned long ttm_tt_pages_limit(void);
+
+/**
+ * struct ttm_backup_flags - Flags to govern backup behaviour.
+ * @purge: Free pages without backing up. Bypass pools.
+ * @writeback: Attempt to copy contents directly to swap space, even
+ * if that means blocking on writes to external memory.
+ */
+struct ttm_backup_flags {
+ u32 purge : 1;
+ u32 writeback : 1;
+};
+
+long ttm_tt_backup(struct ttm_device *bdev, struct ttm_tt *tt,
+ const struct ttm_backup_flags flags);
+
+int ttm_tt_restore(struct ttm_device *bdev, struct ttm_tt *tt,
+ const struct ttm_operation_ctx *ctx);
+
#if IS_ENABLED(CONFIG_AGP)
#include <linux/agp_backend.h>
--
2.48.1
^ permalink raw reply related [flat|nested] 26+ messages in thread* Re: [PATCH v16 2/7] drm/ttm/pool, drm/ttm/tt: Provide a helper to shrink pages
2025-01-30 10:13 ` [PATCH v16 2/7] drm/ttm/pool, drm/ttm/tt: Provide a helper to shrink pages Thomas Hellström
@ 2025-02-05 14:02 ` Christian König
2025-02-18 15:40 ` Thomas Hellström
0 siblings, 1 reply; 26+ messages in thread
From: Christian König @ 2025-02-05 14:02 UTC (permalink / raw)
To: Thomas Hellström, intel-xe
Cc: Somalapuram Amaranath, Matthew Brost, dri-devel
Am 30.01.25 um 11:13 schrieb Thomas Hellström:
> Provide a helper to shrink ttm_tt page-vectors on a per-page
> basis. A ttm_backup backend could then in theory get away with
> allocating a single temporary page for each struct ttm_tt.
>
> This is accomplished by splitting larger pages before trying to
> back them up.
>
> In the future we could allow ttm_backup to handle backing up
> large pages as well, but currently there's no benefit in
> doing that, since the shmem backup backend would have to
> split those anyway to avoid allocating too much temporary
> memory, and if the backend instead inserts pages into the
> swap-cache, those are split on reclaim by the core.
>
> Due to potential backup- and recover errors, allow partially swapped
> out struct ttm_tt's, although mark them as swapped out stopping them
> from being swapped out a second time. More details in the ttm_pool.c
> DOC section.
>
> v2:
> - A couple of cleanups and error fixes in ttm_pool_back_up_tt.
> - s/back_up/backup/
> - Add a writeback parameter to the exported interface.
> v8:
> - Use a struct for flags for readability (Matt Brost)
> - Address misc other review comments (Matt Brost)
> v9:
> - Update the kerneldoc for the ttm_tt::backup field.
> v10:
> - Rebase.
> v13:
> - Rebase on ttm_backup interface change. Update kerneldoc.
> - Rebase and adjust ttm_tt_is_swapped().
> v15:
> - Rebase on ttm_backup return value change.
> - Rebase on previous restructuring of ttm_pool_alloc()
> - Rework the ttm_pool backup interface (Christian König)
> - Remove cond_resched() (Christian König)
> - Get rid of the need to allocate an intermediate page array
> when restoring a multi-order page (Christian König)
> - Update documentation.
>
> Cc: Christian König <christian.koenig@amd.com>
> Cc: Somalapuram Amaranath <Amaranath.Somalapuram@amd.com>
> Cc: Matthew Brost <matthew.brost@intel.com>
> Cc: <dri-devel@lists.freedesktop.org>
> Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
> Reviewed-by: Matthew Brost <matthew.brost@intel.com>
I've tried to wrap my head around all of this like twenty times in the
last three month, but was always interrupted at some point.
Feel free to add Acked-by: Christian Koenig <christian.koenig@amd.com>.
Sorry,
Christian.
> ---
> drivers/gpu/drm/ttm/ttm_pool.c | 554 +++++++++++++++++++++++++++++----
> drivers/gpu/drm/ttm/ttm_tt.c | 54 ++++
> include/drm/ttm/ttm_pool.h | 8 +
> include/drm/ttm/ttm_tt.h | 67 +++-
> 4 files changed, 629 insertions(+), 54 deletions(-)
>
> diff --git a/drivers/gpu/drm/ttm/ttm_pool.c b/drivers/gpu/drm/ttm/ttm_pool.c
> index c9eba76d5143..ffb7abf52bab 100644
> --- a/drivers/gpu/drm/ttm/ttm_pool.c
> +++ b/drivers/gpu/drm/ttm/ttm_pool.c
> @@ -41,6 +41,7 @@
> #include <asm/set_memory.h>
> #endif
>
> +#include <drm/ttm/ttm_backup.h>
> #include <drm/ttm/ttm_pool.h>
> #include <drm/ttm/ttm_tt.h>
> #include <drm/ttm/ttm_bo.h>
> @@ -75,6 +76,35 @@ struct ttm_pool_alloc_state {
> enum ttm_caching tt_caching;
> };
>
> +/**
> + * struct ttm_pool_tt_restore - State representing restore from backup
> + * @pool: The pool used for page allocation while restoring.
> + * @snapshot_alloc: A snapshot of the most recent struct ttm_pool_alloc_state.
> + * @alloced_page: Pointer to the page most recently allocated from a pool or system.
> + * @first_dma: The dma address corresponding to @alloced_page if dma_mapping
> + * is requested.
> + * @alloced_pages: The number of allocated pages present in the struct ttm_tt
> + * page vector from this restore session.
> + * @restored_pages: The number of 4K pages restored for @alloced_page (which
> + * is typically a multi-order page).
> + * @page_caching: The struct ttm_tt requested caching
> + * @order: The order of @alloced_page.
> + *
> + * Recovery from backup might fail when we've recovered less than the
> + * full ttm_tt. In order not to loose any data (yet), keep information
> + * around that allows us to restart a failed ttm backup recovery.
> + */
> +struct ttm_pool_tt_restore {
> + struct ttm_pool *pool;
> + struct ttm_pool_alloc_state snapshot_alloc;
> + struct page *alloced_page;
> + dma_addr_t first_dma;
> + pgoff_t alloced_pages;
> + pgoff_t restored_pages;
> + enum ttm_caching page_caching;
> + unsigned int order;
> +};
> +
> static unsigned long page_pool_size;
>
> MODULE_PARM_DESC(page_pool_size, "Number of pages in the WC/UC/DMA pool");
> @@ -199,12 +229,11 @@ static int ttm_pool_apply_caching(struct ttm_pool_alloc_state *alloc)
> return 0;
> }
>
> -/* Map pages of 1 << order size and fill the DMA address array */
> +/* DMA Map pages of 1 << order size and return the resulting dma_address. */
> static int ttm_pool_map(struct ttm_pool *pool, unsigned int order,
> - struct page *p, dma_addr_t **dma_addr)
> + struct page *p, dma_addr_t *dma_addr)
> {
> dma_addr_t addr;
> - unsigned int i;
>
> if (pool->use_dma_alloc) {
> struct ttm_pool_dma *dma = (void *)p->private;
> @@ -218,10 +247,7 @@ static int ttm_pool_map(struct ttm_pool *pool, unsigned int order,
> return -EFAULT;
> }
>
> - for (i = 1 << order; i ; --i) {
> - *(*dma_addr)++ = addr;
> - addr += PAGE_SIZE;
> - }
> + *dma_addr = addr;
>
> return 0;
> }
> @@ -371,6 +397,190 @@ static unsigned int ttm_pool_page_order(struct ttm_pool *pool, struct page *p)
> return p->private;
> }
>
> +/*
> + * Split larger pages so that we can free each PAGE_SIZE page as soon
> + * as it has been backed up, in order to avoid memory pressure during
> + * reclaim.
> + */
> +static void ttm_pool_split_for_swap(struct ttm_pool *pool, struct page *p)
> +{
> + unsigned int order = ttm_pool_page_order(pool, p);
> + pgoff_t nr;
> +
> + if (!order)
> + return;
> +
> + split_page(p, order);
> + nr = 1UL << order;
> + while (nr--)
> + (p++)->private = 0;
> +}
> +
> +/**
> + * DOC: Partial backup and restoration of a struct ttm_tt.
> + *
> + * Swapout using ttm_backup_backup_page() and swapin using
> + * ttm_backup_copy_page() may fail.
> + * The former most likely due to lack of swap-space or memory, the latter due
> + * to lack of memory or because of signal interruption during waits.
> + *
> + * Backup failure is easily handled by using a ttm_tt pages vector that holds
> + * both backup handles and page pointers. This has to be taken into account when
> + * restoring such a ttm_tt from backup, and when freeing it while backed up.
> + * When restoring, for simplicity, new pages are actually allocated from the
> + * pool and the contents of any old pages are copied in and then the old pages
> + * are released.
> + *
> + * For restoration failures, the struct ttm_pool_tt_restore holds sufficient state
> + * to be able to resume an interrupted restore, and that structure is freed once
> + * the restoration is complete. If the struct ttm_tt is destroyed while there
> + * is a valid struct ttm_pool_tt_restore attached, that is also properly taken
> + * care of.
> + */
> +
> +/* Is restore ongoing for the currently allocated page? */
> +static bool ttm_pool_restore_valid(const struct ttm_pool_tt_restore *restore)
> +{
> + return restore && restore->restored_pages < (1 << restore->order);
> +}
> +
> +/* DMA unmap and free a multi-order page, either to the relevant pool or to system. */
> +static pgoff_t ttm_pool_unmap_and_free(struct ttm_pool *pool, struct page *page,
> + const dma_addr_t *dma_addr, enum ttm_caching caching)
> +{
> + struct ttm_pool_type *pt = NULL;
> + unsigned int order;
> + pgoff_t nr;
> +
> + if (pool) {
> + order = ttm_pool_page_order(pool, page);
> + nr = (1UL << order);
> + if (dma_addr)
> + ttm_pool_unmap(pool, *dma_addr, nr);
> +
> + pt = ttm_pool_select_type(pool, caching, order);
> + } else {
> + order = page->private;
> + nr = (1UL << order);
> + }
> +
> + if (pt)
> + ttm_pool_type_give(pt, page);
> + else
> + ttm_pool_free_page(pool, caching, order, page);
> +
> + return nr;
> +}
> +
> +/* Populate the page-array using the most recent allocated multi-order page. */
> +static void ttm_pool_allocated_page_commit(struct page *allocated,
> + dma_addr_t first_dma,
> + struct ttm_pool_alloc_state *alloc,
> + pgoff_t nr)
> +{
> + pgoff_t i;
> +
> + for (i = 0; i < nr; ++i)
> + *alloc->pages++ = allocated++;
> +
> + alloc->remaining_pages -= nr;
> +
> + if (!alloc->dma_addr)
> + return;
> +
> + for (i = 0; i < nr; ++i) {
> + *alloc->dma_addr++ = first_dma;
> + first_dma += PAGE_SIZE;
> + }
> +}
> +
> +/*
> + * When restoring, restore backed-up content to the newly allocated page and
> + * if successful, populate the page-table and dma-address arrays.
> + */
> +static int ttm_pool_restore_commit(struct ttm_pool_tt_restore *restore,
> + struct ttm_backup *backup,
> + const struct ttm_operation_ctx *ctx,
> + struct ttm_pool_alloc_state *alloc)
> +
> +{
> + pgoff_t i, nr = 1UL << restore->order;
> + struct page **first_page = alloc->pages;
> + struct page *p;
> + int ret = 0;
> +
> + for (i = restore->restored_pages; i < nr; ++i) {
> + p = first_page[i];
> + if (ttm_backup_page_ptr_is_handle(p)) {
> + unsigned long handle = ttm_backup_page_ptr_to_handle(p);
> +
> + if (handle == 0) {
> + restore->restored_pages++;
> + continue;
> + }
> +
> + ret = ttm_backup_copy_page(backup, restore->alloced_page + i,
> + handle, ctx->interruptible);
> + if (ret)
> + break;
> +
> + ttm_backup_drop(backup, handle);
> + } else if (p) {
> + /*
> + * We could probably avoid splitting the old page
> + * using clever logic, but ATM we don't care, as
> + * we prioritize releasing memory ASAP. Note that
> + * here, the old retained page is always write-back
> + * cached.
> + */
> + ttm_pool_split_for_swap(restore->pool, p);
> + copy_highpage(restore->alloced_page + i, p);
> + __free_pages(p, 0);
> + }
> +
> + restore->restored_pages++;
> + first_page[i] = ttm_backup_handle_to_page_ptr(0);
> + }
> +
> + if (ret) {
> + if (!restore->restored_pages) {
> + dma_addr_t *dma_addr = alloc->dma_addr ? &restore->first_dma : NULL;
> +
> + ttm_pool_unmap_and_free(restore->pool, restore->alloced_page,
> + dma_addr, restore->page_caching);
> + restore->restored_pages = nr;
> + }
> + return ret;
> + }
> +
> + ttm_pool_allocated_page_commit(restore->alloced_page, restore->first_dma,
> + alloc, nr);
> + if (restore->page_caching == alloc->tt_caching || PageHighMem(restore->alloced_page))
> + alloc->caching_divide = alloc->pages;
> + restore->snapshot_alloc = *alloc;
> + restore->alloced_pages += nr;
> +
> + return 0;
> +}
> +
> +/* If restoring, save information needed for ttm_pool_restore_commit(). */
> +static void
> +ttm_pool_page_allocated_restore(struct ttm_pool *pool, unsigned int order,
> + struct page *p,
> + enum ttm_caching page_caching,
> + dma_addr_t first_dma,
> + struct ttm_pool_tt_restore *restore,
> + const struct ttm_pool_alloc_state *alloc)
> +{
> + restore->pool = pool;
> + restore->order = order;
> + restore->restored_pages = 0;
> + restore->page_caching = page_caching;
> + restore->first_dma = first_dma;
> + restore->alloced_page = p;
> + restore->snapshot_alloc = *alloc;
> +}
> +
> /*
> * Called when we got a page, either from a pool or newly allocated.
> * if needed, dma map the page and populate the dma address array.
> @@ -380,10 +590,11 @@ static unsigned int ttm_pool_page_order(struct ttm_pool *pool, struct page *p)
> */
> static int ttm_pool_page_allocated(struct ttm_pool *pool, unsigned int order,
> struct page *p, enum ttm_caching page_caching,
> - struct ttm_pool_alloc_state *alloc)
> + struct ttm_pool_alloc_state *alloc,
> + struct ttm_pool_tt_restore *restore)
> {
> - pgoff_t i, nr = 1UL << order;
> bool caching_consistent;
> + dma_addr_t first_dma;
> int r = 0;
>
> caching_consistent = (page_caching == alloc->tt_caching) || PageHighMem(p);
> @@ -395,17 +606,20 @@ static int ttm_pool_page_allocated(struct ttm_pool *pool, unsigned int order,
> }
>
> if (alloc->dma_addr) {
> - r = ttm_pool_map(pool, order, p, &alloc->dma_addr);
> + r = ttm_pool_map(pool, order, p, &first_dma);
> if (r)
> return r;
> }
>
> - alloc->remaining_pages -= nr;
> - for (i = 0; i < nr; ++i)
> - *alloc->pages++ = p++;
> + if (restore) {
> + ttm_pool_page_allocated_restore(pool, order, p, page_caching,
> + first_dma, restore, alloc);
> + } else {
> + ttm_pool_allocated_page_commit(p, first_dma, alloc, 1UL << order);
>
> - if (caching_consistent)
> - alloc->caching_divide = alloc->pages;
> + if (caching_consistent)
> + alloc->caching_divide = alloc->pages;
> + }
>
> return 0;
> }
> @@ -428,22 +642,24 @@ static void ttm_pool_free_range(struct ttm_pool *pool, struct ttm_tt *tt,
> pgoff_t start_page, pgoff_t end_page)
> {
> struct page **pages = &tt->pages[start_page];
> - unsigned int order;
> + struct ttm_backup *backup = tt->backup;
> pgoff_t i, nr;
>
> for (i = start_page; i < end_page; i += nr, pages += nr) {
> - struct ttm_pool_type *pt = NULL;
> + struct page *p = *pages;
>
> - order = ttm_pool_page_order(pool, *pages);
> - nr = (1UL << order);
> - if (tt->dma_address)
> - ttm_pool_unmap(pool, tt->dma_address[i], nr);
> + nr = 1;
> + if (ttm_backup_page_ptr_is_handle(p)) {
> + unsigned long handle = ttm_backup_page_ptr_to_handle(p);
>
> - pt = ttm_pool_select_type(pool, caching, order);
> - if (pt)
> - ttm_pool_type_give(pt, *pages);
> - else
> - ttm_pool_free_page(pool, caching, order, *pages);
> + if (handle != 0)
> + ttm_backup_drop(backup, handle);
> + } else if (p) {
> + dma_addr_t *dma_addr = tt->dma_address ?
> + tt->dma_address + i : NULL;
> +
> + nr = ttm_pool_unmap_and_free(pool, p, dma_addr, caching);
> + }
> }
> }
>
> @@ -467,22 +683,11 @@ static unsigned int ttm_pool_alloc_find_order(unsigned int highest,
> return min_t(unsigned int, highest, __fls(alloc->remaining_pages));
> }
>
> -/**
> - * ttm_pool_alloc - Fill a ttm_tt object
> - *
> - * @pool: ttm_pool to use
> - * @tt: ttm_tt object to fill
> - * @ctx: operation context
> - *
> - * Fill the ttm_tt object with pages and also make sure to DMA map them when
> - * necessary.
> - *
> - * Returns: 0 on successe, negative error code otherwise.
> - */
> -int ttm_pool_alloc(struct ttm_pool *pool, struct ttm_tt *tt,
> - struct ttm_operation_ctx *ctx)
> +static int __ttm_pool_alloc(struct ttm_pool *pool, struct ttm_tt *tt,
> + const struct ttm_operation_ctx *ctx,
> + struct ttm_pool_alloc_state *alloc,
> + struct ttm_pool_tt_restore *restore)
> {
> - struct ttm_pool_alloc_state alloc;
> enum ttm_caching page_caching;
> gfp_t gfp_flags = GFP_USER;
> pgoff_t caching_divide;
> @@ -491,10 +696,8 @@ int ttm_pool_alloc(struct ttm_pool *pool, struct ttm_tt *tt,
> struct page *p;
> int r;
>
> - ttm_pool_alloc_state_init(tt, &alloc);
> -
> - WARN_ON(!alloc.remaining_pages || ttm_tt_is_populated(tt));
> - WARN_ON(alloc.dma_addr && !pool->dev);
> + WARN_ON(!alloc->remaining_pages || ttm_tt_is_populated(tt));
> + WARN_ON(alloc->dma_addr && !pool->dev);
>
> if (tt->page_flags & TTM_TT_FLAG_ZERO_ALLOC)
> gfp_flags |= __GFP_ZERO;
> @@ -509,9 +712,9 @@ int ttm_pool_alloc(struct ttm_pool *pool, struct ttm_tt *tt,
>
> page_caching = tt->caching;
> allow_pools = true;
> - for (order = ttm_pool_alloc_find_order(MAX_PAGE_ORDER, &alloc);
> - alloc.remaining_pages;
> - order = ttm_pool_alloc_find_order(order, &alloc)) {
> + for (order = ttm_pool_alloc_find_order(MAX_PAGE_ORDER, alloc);
> + alloc->remaining_pages;
> + order = ttm_pool_alloc_find_order(order, alloc)) {
> struct ttm_pool_type *pt;
>
> /* First, try to allocate a page from a pool if one exists. */
> @@ -541,30 +744,120 @@ int ttm_pool_alloc(struct ttm_pool *pool, struct ttm_tt *tt,
> r = -ENOMEM;
> goto error_free_all;
> }
> - r = ttm_pool_page_allocated(pool, order, p, page_caching, &alloc);
> + r = ttm_pool_page_allocated(pool, order, p, page_caching, alloc,
> + restore);
> if (r)
> goto error_free_page;
> +
> + if (ttm_pool_restore_valid(restore)) {
> + r = ttm_pool_restore_commit(restore, tt->backup, ctx, alloc);
> + if (r)
> + goto error_free_all;
> + }
> }
>
> - r = ttm_pool_apply_caching(&alloc);
> + r = ttm_pool_apply_caching(alloc);
> if (r)
> goto error_free_all;
>
> + kfree(tt->restore);
> + tt->restore = NULL;
> +
> return 0;
>
> error_free_page:
> ttm_pool_free_page(pool, page_caching, order, p);
>
> error_free_all:
> - caching_divide = alloc.caching_divide - tt->pages;
> + if (tt->restore)
> + return r;
> +
> + caching_divide = alloc->caching_divide - tt->pages;
> ttm_pool_free_range(pool, tt, tt->caching, 0, caching_divide);
> ttm_pool_free_range(pool, tt, ttm_cached, caching_divide,
> - tt->num_pages - alloc.remaining_pages);
> + tt->num_pages - alloc->remaining_pages);
>
> return r;
> }
> +
> +/**
> + * ttm_pool_alloc - Fill a ttm_tt object
> + *
> + * @pool: ttm_pool to use
> + * @tt: ttm_tt object to fill
> + * @ctx: operation context
> + *
> + * Fill the ttm_tt object with pages and also make sure to DMA map them when
> + * necessary.
> + *
> + * Returns: 0 on successe, negative error code otherwise.
> + */
> +int ttm_pool_alloc(struct ttm_pool *pool, struct ttm_tt *tt,
> + struct ttm_operation_ctx *ctx)
> +{
> + struct ttm_pool_alloc_state alloc;
> +
> + if (WARN_ON(ttm_tt_is_backed_up(tt)))
> + return -EINVAL;
> +
> + ttm_pool_alloc_state_init(tt, &alloc);
> +
> + return __ttm_pool_alloc(pool, tt, ctx, &alloc, NULL);
> +}
> EXPORT_SYMBOL(ttm_pool_alloc);
>
> +/**
> + * ttm_pool_restore_and_alloc - Fill a ttm_tt, restoring previously backed-up
> + * content.
> + *
> + * @pool: ttm_pool to use
> + * @tt: ttm_tt object to fill
> + * @ctx: operation context
> + *
> + * Fill the ttm_tt object with pages and also make sure to DMA map them when
> + * necessary. Read in backed-up content.
> + *
> + * Returns: 0 on successe, negative error code otherwise.
> + */
> +int ttm_pool_restore_and_alloc(struct ttm_pool *pool, struct ttm_tt *tt,
> + const struct ttm_operation_ctx *ctx)
> +{
> + struct ttm_pool_alloc_state alloc;
> +
> + if (WARN_ON(!ttm_tt_is_backed_up(tt)))
> + return -EINVAL;
> +
> + if (!tt->restore) {
> + gfp_t gfp = GFP_KERNEL | __GFP_NOWARN;
> +
> + ttm_pool_alloc_state_init(tt, &alloc);
> + if (ctx->gfp_retry_mayfail)
> + gfp |= __GFP_RETRY_MAYFAIL;
> +
> + tt->restore = kzalloc(sizeof(*tt->restore), gfp);
> + if (!tt->restore)
> + return -ENOMEM;
> +
> + tt->restore->snapshot_alloc = alloc;
> + tt->restore->pool = pool;
> + tt->restore->restored_pages = 1;
> + } else {
> + struct ttm_pool_tt_restore *restore = tt->restore;
> + int ret;
> +
> + alloc = restore->snapshot_alloc;
> + if (ttm_pool_restore_valid(tt->restore)) {
> + ret = ttm_pool_restore_commit(restore, tt->backup, ctx, &alloc);
> + if (ret)
> + return ret;
> + }
> + if (!alloc.remaining_pages)
> + return 0;
> + }
> +
> + return __ttm_pool_alloc(pool, tt, ctx, &alloc, tt->restore);
> +}
> +
> /**
> * ttm_pool_free - Free the backing pages from a ttm_tt object
> *
> @@ -582,6 +875,163 @@ void ttm_pool_free(struct ttm_pool *pool, struct ttm_tt *tt)
> }
> EXPORT_SYMBOL(ttm_pool_free);
>
> +/**
> + * ttm_pool_drop_backed_up() - Release content of a swapped-out struct ttm_tt
> + * @tt: The struct ttm_tt.
> + *
> + * Release handles with associated content or any remaining pages of
> + * a backed-up struct ttm_tt.
> + */
> +void ttm_pool_drop_backed_up(struct ttm_tt *tt)
> +{
> + struct ttm_pool_tt_restore *restore;
> + pgoff_t start_page = 0;
> +
> + WARN_ON(!ttm_tt_is_backed_up(tt));
> +
> + restore = tt->restore;
> +
> + /*
> + * Unmap and free any uncommitted restore page.
> + * any tt page-array backup entries already read back has
> + * been cleared already
> + */
> + if (ttm_pool_restore_valid(restore)) {
> + dma_addr_t *dma_addr = tt->dma_address ? &restore->first_dma : NULL;
> +
> + ttm_pool_unmap_and_free(restore->pool, restore->alloced_page,
> + dma_addr, restore->page_caching);
> + restore->restored_pages = 1UL << restore->order;
> + }
> +
> + /*
> + * If a restore is ongoing, part of the tt pages may have a
> + * caching different than writeback.
> + */
> + if (restore) {
> + pgoff_t mid = restore->snapshot_alloc.caching_divide - tt->pages;
> +
> + start_page = restore->alloced_pages;
> + WARN_ON(mid > start_page);
> + /* Pages that might be dma-mapped and non-cached */
> + ttm_pool_free_range(restore->pool, tt, tt->caching,
> + 0, mid);
> + /* Pages that might be dma-mapped but cached */
> + ttm_pool_free_range(restore->pool, tt, ttm_cached,
> + mid, restore->alloced_pages);
> + kfree(restore);
> + tt->restore = NULL;
> + }
> +
> + ttm_pool_free_range(NULL, tt, ttm_cached, start_page, tt->num_pages);
> +}
> +
> +/**
> + * ttm_pool_backup() - Back up or purge a struct ttm_tt
> + * @pool: The pool used when allocating the struct ttm_tt.
> + * @tt: The struct ttm_tt.
> + * @flags: Flags to govern the backup behaviour.
> + *
> + * Back up or purge a struct ttm_tt. If @purge is true, then
> + * all pages will be freed directly to the system rather than to the pool
> + * they were allocated from, making the function behave similarly to
> + * ttm_pool_free(). If @purge is false the pages will be backed up instead,
> + * exchanged for handles.
> + * A subsequent call to ttm_pool_restore_and_alloc() will then read back the content and
> + * a subsequent call to ttm_pool_drop_backed_up() will drop it.
> + * If backup of a page fails for whatever reason, @ttm will still be
> + * partially backed up, retaining those pages for which backup fails.
> + * In that case, this function can be retried, possibly after freeing up
> + * memory resources.
> + *
> + * Return: Number of pages actually backed up or freed, or negative
> + * error code on error.
> + */
> +long ttm_pool_backup(struct ttm_pool *pool, struct ttm_tt *tt,
> + const struct ttm_backup_flags *flags)
> +{
> + struct ttm_backup *backup = tt->backup;
> + struct page *page;
> + unsigned long handle;
> + gfp_t alloc_gfp;
> + gfp_t gfp;
> + int ret = 0;
> + pgoff_t shrunken = 0;
> + pgoff_t i, num_pages;
> +
> + if (WARN_ON(ttm_tt_is_backed_up(tt)))
> + return -EINVAL;
> +
> + if ((!ttm_backup_bytes_avail() && !flags->purge) ||
> + pool->use_dma_alloc || ttm_tt_is_backed_up(tt))
> + return -EBUSY;
> +
> +#ifdef CONFIG_X86
> + /* Anything returned to the system needs to be cached. */
> + if (tt->caching != ttm_cached)
> + set_pages_array_wb(tt->pages, tt->num_pages);
> +#endif
> +
> + if (tt->dma_address || flags->purge) {
> + for (i = 0; i < tt->num_pages; i += num_pages) {
> + unsigned int order;
> +
> + page = tt->pages[i];
> + if (unlikely(!page)) {
> + num_pages = 1;
> + continue;
> + }
> +
> + order = ttm_pool_page_order(pool, page);
> + num_pages = 1UL << order;
> + if (tt->dma_address)
> + ttm_pool_unmap(pool, tt->dma_address[i],
> + num_pages);
> + if (flags->purge) {
> + shrunken += num_pages;
> + page->private = 0;
> + __free_pages(page, order);
> + memset(tt->pages + i, 0,
> + num_pages * sizeof(*tt->pages));
> + }
> + }
> + }
> +
> + if (flags->purge)
> + return shrunken;
> +
> + if (pool->use_dma32)
> + gfp = GFP_DMA32;
> + else
> + gfp = GFP_HIGHUSER;
> +
> + alloc_gfp = GFP_KERNEL | __GFP_HIGH | __GFP_NOWARN | __GFP_RETRY_MAYFAIL;
> +
> + for (i = 0; i < tt->num_pages; ++i) {
> + s64 shandle;
> +
> + page = tt->pages[i];
> + if (unlikely(!page))
> + continue;
> +
> + ttm_pool_split_for_swap(pool, page);
> +
> + shandle = ttm_backup_backup_page(backup, page, flags->writeback, i,
> + gfp, alloc_gfp);
> + if (shandle < 0) {
> + /* We allow partially shrunken tts */
> + ret = shandle;
> + break;
> + }
> + handle = shandle;
> + tt->pages[i] = ttm_backup_handle_to_page_ptr(handle);
> + put_page(page);
> + shrunken++;
> + }
> +
> + return shrunken ? shrunken : ret;
> +}
> +
> /**
> * ttm_pool_init - Initialize a pool
> *
> diff --git a/drivers/gpu/drm/ttm/ttm_tt.c b/drivers/gpu/drm/ttm/ttm_tt.c
> index 3baf215eca23..00b7c28f2329 100644
> --- a/drivers/gpu/drm/ttm/ttm_tt.c
> +++ b/drivers/gpu/drm/ttm/ttm_tt.c
> @@ -40,6 +40,7 @@
> #include <drm/drm_cache.h>
> #include <drm/drm_device.h>
> #include <drm/drm_util.h>
> +#include <drm/ttm/ttm_backup.h>
> #include <drm/ttm/ttm_bo.h>
> #include <drm/ttm/ttm_tt.h>
>
> @@ -158,6 +159,8 @@ static void ttm_tt_init_fields(struct ttm_tt *ttm,
> ttm->swap_storage = NULL;
> ttm->sg = bo->sg;
> ttm->caching = caching;
> + ttm->restore = NULL;
> + ttm->backup = NULL;
> }
>
> int ttm_tt_init(struct ttm_tt *ttm, struct ttm_buffer_object *bo,
> @@ -182,6 +185,13 @@ void ttm_tt_fini(struct ttm_tt *ttm)
> fput(ttm->swap_storage);
> ttm->swap_storage = NULL;
>
> + if (ttm_tt_is_backed_up(ttm))
> + ttm_pool_drop_backed_up(ttm);
> + if (ttm->backup) {
> + ttm_backup_fini(ttm->backup);
> + ttm->backup = NULL;
> + }
> +
> if (ttm->pages)
> kvfree(ttm->pages);
> else
> @@ -253,6 +263,49 @@ int ttm_tt_swapin(struct ttm_tt *ttm)
> }
> EXPORT_SYMBOL_FOR_TESTS_ONLY(ttm_tt_swapin);
>
> +/**
> + * ttm_tt_backup() - Helper to back up a struct ttm_tt.
> + * @bdev: The TTM device.
> + * @tt: The struct ttm_tt.
> + * @flags: Flags that govern the backup behaviour.
> + *
> + * Update the page accounting and call ttm_pool_shrink_tt to free pages
> + * or back them up.
> + *
> + * Return: Number of pages freed or swapped out, or negative error code on
> + * error.
> + */
> +long ttm_tt_backup(struct ttm_device *bdev, struct ttm_tt *tt,
> + const struct ttm_backup_flags flags)
> +{
> + long ret;
> +
> + if (WARN_ON(IS_ERR_OR_NULL(tt->backup)))
> + return 0;
> +
> + ret = ttm_pool_backup(&bdev->pool, tt, &flags);
> + if (ret > 0) {
> + tt->page_flags &= ~TTM_TT_FLAG_PRIV_POPULATED;
> + tt->page_flags |= TTM_TT_FLAG_BACKED_UP;
> + }
> +
> + return ret;
> +}
> +
> +int ttm_tt_restore(struct ttm_device *bdev, struct ttm_tt *tt,
> + const struct ttm_operation_ctx *ctx)
> +{
> + int ret = ttm_pool_restore_and_alloc(&bdev->pool, tt, ctx);
> +
> + if (ret)
> + return ret;
> +
> + tt->page_flags &= ~TTM_TT_FLAG_BACKED_UP;
> +
> + return 0;
> +}
> +EXPORT_SYMBOL(ttm_tt_restore);
> +
> /**
> * ttm_tt_swapout - swap out tt object
> *
> @@ -348,6 +401,7 @@ int ttm_tt_populate(struct ttm_device *bdev,
> goto error;
>
> ttm->page_flags |= TTM_TT_FLAG_PRIV_POPULATED;
> + ttm->page_flags &= ~TTM_TT_FLAG_BACKED_UP;
> if (unlikely(ttm->page_flags & TTM_TT_FLAG_SWAPPED)) {
> ret = ttm_tt_swapin(ttm);
> if (unlikely(ret != 0)) {
> diff --git a/include/drm/ttm/ttm_pool.h b/include/drm/ttm/ttm_pool.h
> index 160d954a261e..54cd34a6e4c0 100644
> --- a/include/drm/ttm/ttm_pool.h
> +++ b/include/drm/ttm/ttm_pool.h
> @@ -33,6 +33,7 @@
>
> struct device;
> struct seq_file;
> +struct ttm_backup_flags;
> struct ttm_operation_ctx;
> struct ttm_pool;
> struct ttm_tt;
> @@ -89,6 +90,13 @@ void ttm_pool_fini(struct ttm_pool *pool);
>
> int ttm_pool_debugfs(struct ttm_pool *pool, struct seq_file *m);
>
> +void ttm_pool_drop_backed_up(struct ttm_tt *tt);
> +
> +long ttm_pool_backup(struct ttm_pool *pool, struct ttm_tt *ttm,
> + const struct ttm_backup_flags *flags);
> +int ttm_pool_restore_and_alloc(struct ttm_pool *pool, struct ttm_tt *tt,
> + const struct ttm_operation_ctx *ctx);
> +
> int ttm_pool_mgr_init(unsigned long num_pages);
> void ttm_pool_mgr_fini(void);
>
> diff --git a/include/drm/ttm/ttm_tt.h b/include/drm/ttm/ttm_tt.h
> index 991edafdb2dd..c736c01ac2ca 100644
> --- a/include/drm/ttm/ttm_tt.h
> +++ b/include/drm/ttm/ttm_tt.h
> @@ -32,11 +32,13 @@
> #include <drm/ttm/ttm_caching.h>
> #include <drm/ttm/ttm_kmap_iter.h>
>
> +struct ttm_backup;
> struct ttm_device;
> struct ttm_tt;
> struct ttm_resource;
> struct ttm_buffer_object;
> struct ttm_operation_ctx;
> +struct ttm_pool_tt_restore;
>
> /**
> * struct ttm_tt - This is a structure holding the pages, caching- and aperture
> @@ -85,17 +87,22 @@ struct ttm_tt {
> * fault handling abuses the DMA api a bit and dma_map_attrs can't be
> * used to assure pgprot always matches.
> *
> + * TTM_TT_FLAG_BACKED_UP: TTM internal only. This is set if the
> + * struct ttm_tt has been (possibly partially) backed up.
> + *
> * TTM_TT_FLAG_PRIV_POPULATED: TTM internal only. DO NOT USE. This is
> * set by TTM after ttm_tt_populate() has successfully returned, and is
> * then unset when TTM calls ttm_tt_unpopulate().
> + *
> */
> #define TTM_TT_FLAG_SWAPPED BIT(0)
> #define TTM_TT_FLAG_ZERO_ALLOC BIT(1)
> #define TTM_TT_FLAG_EXTERNAL BIT(2)
> #define TTM_TT_FLAG_EXTERNAL_MAPPABLE BIT(3)
> #define TTM_TT_FLAG_DECRYPTED BIT(4)
> +#define TTM_TT_FLAG_BACKED_UP BIT(5)
>
> -#define TTM_TT_FLAG_PRIV_POPULATED BIT(5)
> +#define TTM_TT_FLAG_PRIV_POPULATED BIT(6)
> uint32_t page_flags;
> /** @num_pages: Number of pages in the page array. */
> uint32_t num_pages;
> @@ -105,11 +112,20 @@ struct ttm_tt {
> dma_addr_t *dma_address;
> /** @swap_storage: Pointer to shmem struct file for swap storage. */
> struct file *swap_storage;
> + /**
> + * @backup: Pointer to backup struct for backed up tts.
> + * Could be unified with @swap_storage. Meanwhile, the driver's
> + * ttm_tt_create() callback is responsible for assigning
> + * this field.
> + */
> + struct ttm_backup *backup;
> /**
> * @caching: The current caching state of the pages, see enum
> * ttm_caching.
> */
> enum ttm_caching caching;
> + /** @restore: Partial restoration from backup state. TTM private */
> + struct ttm_pool_tt_restore *restore;
> };
>
> /**
> @@ -129,9 +145,38 @@ static inline bool ttm_tt_is_populated(struct ttm_tt *tt)
> return tt->page_flags & TTM_TT_FLAG_PRIV_POPULATED;
> }
>
> +/**
> + * ttm_tt_is_swapped() - Whether the ttm_tt is swapped out or backed up
> + * @tt: The struct ttm_tt.
> + *
> + * Return: true if swapped or backed up, false otherwise.
> + */
> static inline bool ttm_tt_is_swapped(const struct ttm_tt *tt)
> {
> - return tt->page_flags & TTM_TT_FLAG_SWAPPED;
> + return tt->page_flags & (TTM_TT_FLAG_SWAPPED | TTM_TT_FLAG_BACKED_UP);
> +}
> +
> +/**
> + * ttm_tt_is_backed_up() - Whether the ttm_tt backed up
> + * @tt: The struct ttm_tt.
> + *
> + * Return: true if swapped or backed up, false otherwise.
> + */
> +static inline bool ttm_tt_is_backed_up(const struct ttm_tt *tt)
> +{
> + return tt->page_flags & TTM_TT_FLAG_BACKED_UP;
> +}
> +
> +/**
> + * ttm_tt_clear_backed_up() - Clear the ttm_tt backed-up status
> + * @tt: The struct ttm_tt.
> + *
> + * Drivers can use this functionto clear the backed-up status,
> + * for example before destroying or re-validating a purged tt.
> + */
> +static inline void ttm_tt_clear_backed_up(struct ttm_tt *tt)
> +{
> + tt->page_flags &= ~TTM_TT_FLAG_BACKED_UP;
> }
>
> /**
> @@ -235,6 +280,24 @@ void ttm_tt_mgr_init(unsigned long num_pages, unsigned long num_dma32_pages);
> struct ttm_kmap_iter *ttm_kmap_iter_tt_init(struct ttm_kmap_iter_tt *iter_tt,
> struct ttm_tt *tt);
> unsigned long ttm_tt_pages_limit(void);
> +
> +/**
> + * struct ttm_backup_flags - Flags to govern backup behaviour.
> + * @purge: Free pages without backing up. Bypass pools.
> + * @writeback: Attempt to copy contents directly to swap space, even
> + * if that means blocking on writes to external memory.
> + */
> +struct ttm_backup_flags {
> + u32 purge : 1;
> + u32 writeback : 1;
> +};
> +
> +long ttm_tt_backup(struct ttm_device *bdev, struct ttm_tt *tt,
> + const struct ttm_backup_flags flags);
> +
> +int ttm_tt_restore(struct ttm_device *bdev, struct ttm_tt *tt,
> + const struct ttm_operation_ctx *ctx);
> +
> #if IS_ENABLED(CONFIG_AGP)
> #include <linux/agp_backend.h>
>
^ permalink raw reply [flat|nested] 26+ messages in thread* Re: [PATCH v16 2/7] drm/ttm/pool, drm/ttm/tt: Provide a helper to shrink pages
2025-02-05 14:02 ` Christian König
@ 2025-02-18 15:40 ` Thomas Hellström
2025-02-25 8:26 ` RESEND " Thomas Hellström
0 siblings, 1 reply; 26+ messages in thread
From: Thomas Hellström @ 2025-02-18 15:40 UTC (permalink / raw)
To: Christian König, intel-xe
Cc: Somalapuram Amaranath, Matthew Brost, dri-devel
Hi, Christian,
On Wed, 2025-02-05 at 15:02 +0100, Christian König wrote:
> Am 30.01.25 um 11:13 schrieb Thomas Hellström:
> > Provide a helper to shrink ttm_tt page-vectors on a per-page
> > basis. A ttm_backup backend could then in theory get away with
> > allocating a single temporary page for each struct ttm_tt.
> >
> > This is accomplished by splitting larger pages before trying to
> > back them up.
> >
> > In the future we could allow ttm_backup to handle backing up
> > large pages as well, but currently there's no benefit in
> > doing that, since the shmem backup backend would have to
> > split those anyway to avoid allocating too much temporary
> > memory, and if the backend instead inserts pages into the
> > swap-cache, those are split on reclaim by the core.
> >
> > Due to potential backup- and recover errors, allow partially
> > swapped
> > out struct ttm_tt's, although mark them as swapped out stopping
> > them
> > from being swapped out a second time. More details in the
> > ttm_pool.c
> > DOC section.
> >
> > v2:
> > - A couple of cleanups and error fixes in ttm_pool_back_up_tt.
> > - s/back_up/backup/
> > - Add a writeback parameter to the exported interface.
> > v8:
> > - Use a struct for flags for readability (Matt Brost)
> > - Address misc other review comments (Matt Brost)
> > v9:
> > - Update the kerneldoc for the ttm_tt::backup field.
> > v10:
> > - Rebase.
> > v13:
> > - Rebase on ttm_backup interface change. Update kerneldoc.
> > - Rebase and adjust ttm_tt_is_swapped().
> > v15:
> > - Rebase on ttm_backup return value change.
> > - Rebase on previous restructuring of ttm_pool_alloc()
> > - Rework the ttm_pool backup interface (Christian König)
> > - Remove cond_resched() (Christian König)
> > - Get rid of the need to allocate an intermediate page array
> > when restoring a multi-order page (Christian König)
> > - Update documentation.
> >
> > Cc: Christian König <christian.koenig@amd.com>
> > Cc: Somalapuram Amaranath <Amaranath.Somalapuram@amd.com>
> > Cc: Matthew Brost <matthew.brost@intel.com>
> > Cc: <dri-devel@lists.freedesktop.org>
> > Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
> > Reviewed-by: Matthew Brost <matthew.brost@intel.com>
>
> I've tried to wrap my head around all of this like twenty times in
> the
> last three month, but was always interrupted at some point.
>
> Feel free to add Acked-by: Christian Koenig
> <christian.koenig@amd.com>.
>
> Sorry,
> Christian.
Thanks a lot for all reviewing and comments so far. There are two TTM
patches left in the series that don't have an ack by you:
https://patchwork.freedesktop.org/patch/634715/?series=131815&rev=17
and
https://patchwork.freedesktop.org/patch/634716/?series=131815&rev=17
None of them particularly big considering the amount of doc text.
It'd be great if those could have an ack as well so we could finally
merge this series.
Thanks,
Thomas
>
> > ---
> > drivers/gpu/drm/ttm/ttm_pool.c | 554
> > +++++++++++++++++++++++++++++----
> > drivers/gpu/drm/ttm/ttm_tt.c | 54 ++++
> > include/drm/ttm/ttm_pool.h | 8 +
> > include/drm/ttm/ttm_tt.h | 67 +++-
> > 4 files changed, 629 insertions(+), 54 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/ttm/ttm_pool.c
> > b/drivers/gpu/drm/ttm/ttm_pool.c
> > index c9eba76d5143..ffb7abf52bab 100644
> > --- a/drivers/gpu/drm/ttm/ttm_pool.c
> > +++ b/drivers/gpu/drm/ttm/ttm_pool.c
> > @@ -41,6 +41,7 @@
> > #include <asm/set_memory.h>
> > #endif
> >
> > +#include <drm/ttm/ttm_backup.h>
> > #include <drm/ttm/ttm_pool.h>
> > #include <drm/ttm/ttm_tt.h>
> > #include <drm/ttm/ttm_bo.h>
> > @@ -75,6 +76,35 @@ struct ttm_pool_alloc_state {
> > enum ttm_caching tt_caching;
> > };
> >
> > +/**
> > + * struct ttm_pool_tt_restore - State representing restore from
> > backup
> > + * @pool: The pool used for page allocation while restoring.
> > + * @snapshot_alloc: A snapshot of the most recent struct
> > ttm_pool_alloc_state.
> > + * @alloced_page: Pointer to the page most recently allocated from
> > a pool or system.
> > + * @first_dma: The dma address corresponding to @alloced_page if
> > dma_mapping
> > + * is requested.
> > + * @alloced_pages: The number of allocated pages present in the
> > struct ttm_tt
> > + * page vector from this restore session.
> > + * @restored_pages: The number of 4K pages restored for
> > @alloced_page (which
> > + * is typically a multi-order page).
> > + * @page_caching: The struct ttm_tt requested caching
> > + * @order: The order of @alloced_page.
> > + *
> > + * Recovery from backup might fail when we've recovered less than
> > the
> > + * full ttm_tt. In order not to loose any data (yet), keep
> > information
> > + * around that allows us to restart a failed ttm backup recovery.
> > + */
> > +struct ttm_pool_tt_restore {
> > + struct ttm_pool *pool;
> > + struct ttm_pool_alloc_state snapshot_alloc;
> > + struct page *alloced_page;
> > + dma_addr_t first_dma;
> > + pgoff_t alloced_pages;
> > + pgoff_t restored_pages;
> > + enum ttm_caching page_caching;
> > + unsigned int order;
> > +};
> > +
> > static unsigned long page_pool_size;
> >
> > MODULE_PARM_DESC(page_pool_size, "Number of pages in the
> > WC/UC/DMA pool");
> > @@ -199,12 +229,11 @@ static int ttm_pool_apply_caching(struct
> > ttm_pool_alloc_state *alloc)
> > return 0;
> > }
> >
> > -/* Map pages of 1 << order size and fill the DMA address array */
> > +/* DMA Map pages of 1 << order size and return the resulting
> > dma_address. */
> > static int ttm_pool_map(struct ttm_pool *pool, unsigned int
> > order,
> > - struct page *p, dma_addr_t **dma_addr)
> > + struct page *p, dma_addr_t *dma_addr)
> > {
> > dma_addr_t addr;
> > - unsigned int i;
> >
> > if (pool->use_dma_alloc) {
> > struct ttm_pool_dma *dma = (void *)p->private;
> > @@ -218,10 +247,7 @@ static int ttm_pool_map(struct ttm_pool *pool,
> > unsigned int order,
> > return -EFAULT;
> > }
> >
> > - for (i = 1 << order; i ; --i) {
> > - *(*dma_addr)++ = addr;
> > - addr += PAGE_SIZE;
> > - }
> > + *dma_addr = addr;
> >
> > return 0;
> > }
> > @@ -371,6 +397,190 @@ static unsigned int
> > ttm_pool_page_order(struct ttm_pool *pool, struct page *p)
> > return p->private;
> > }
> >
> > +/*
> > + * Split larger pages so that we can free each PAGE_SIZE page as
> > soon
> > + * as it has been backed up, in order to avoid memory pressure
> > during
> > + * reclaim.
> > + */
> > +static void ttm_pool_split_for_swap(struct ttm_pool *pool, struct
> > page *p)
> > +{
> > + unsigned int order = ttm_pool_page_order(pool, p);
> > + pgoff_t nr;
> > +
> > + if (!order)
> > + return;
> > +
> > + split_page(p, order);
> > + nr = 1UL << order;
> > + while (nr--)
> > + (p++)->private = 0;
> > +}
> > +
> > +/**
> > + * DOC: Partial backup and restoration of a struct ttm_tt.
> > + *
> > + * Swapout using ttm_backup_backup_page() and swapin using
> > + * ttm_backup_copy_page() may fail.
> > + * The former most likely due to lack of swap-space or memory, the
> > latter due
> > + * to lack of memory or because of signal interruption during
> > waits.
> > + *
> > + * Backup failure is easily handled by using a ttm_tt pages vector
> > that holds
> > + * both backup handles and page pointers. This has to be taken
> > into account when
> > + * restoring such a ttm_tt from backup, and when freeing it while
> > backed up.
> > + * When restoring, for simplicity, new pages are actually
> > allocated from the
> > + * pool and the contents of any old pages are copied in and then
> > the old pages
> > + * are released.
> > + *
> > + * For restoration failures, the struct ttm_pool_tt_restore holds
> > sufficient state
> > + * to be able to resume an interrupted restore, and that structure
> > is freed once
> > + * the restoration is complete. If the struct ttm_tt is destroyed
> > while there
> > + * is a valid struct ttm_pool_tt_restore attached, that is also
> > properly taken
> > + * care of.
> > + */
> > +
> > +/* Is restore ongoing for the currently allocated page? */
> > +static bool ttm_pool_restore_valid(const struct
> > ttm_pool_tt_restore *restore)
> > +{
> > + return restore && restore->restored_pages < (1 << restore-
> > >order);
> > +}
> > +
> > +/* DMA unmap and free a multi-order page, either to the relevant
> > pool or to system. */
> > +static pgoff_t ttm_pool_unmap_and_free(struct ttm_pool *pool,
> > struct page *page,
> > + const dma_addr_t *dma_addr,
> > enum ttm_caching caching)
> > +{
> > + struct ttm_pool_type *pt = NULL;
> > + unsigned int order;
> > + pgoff_t nr;
> > +
> > + if (pool) {
> > + order = ttm_pool_page_order(pool, page);
> > + nr = (1UL << order);
> > + if (dma_addr)
> > + ttm_pool_unmap(pool, *dma_addr, nr);
> > +
> > + pt = ttm_pool_select_type(pool, caching, order);
> > + } else {
> > + order = page->private;
> > + nr = (1UL << order);
> > + }
> > +
> > + if (pt)
> > + ttm_pool_type_give(pt, page);
> > + else
> > + ttm_pool_free_page(pool, caching, order, page);
> > +
> > + return nr;
> > +}
> > +
> > +/* Populate the page-array using the most recent allocated multi-
> > order page. */
> > +static void ttm_pool_allocated_page_commit(struct page *allocated,
> > + dma_addr_t first_dma,
> > + struct
> > ttm_pool_alloc_state *alloc,
> > + pgoff_t nr)
> > +{
> > + pgoff_t i;
> > +
> > + for (i = 0; i < nr; ++i)
> > + *alloc->pages++ = allocated++;
> > +
> > + alloc->remaining_pages -= nr;
> > +
> > + if (!alloc->dma_addr)
> > + return;
> > +
> > + for (i = 0; i < nr; ++i) {
> > + *alloc->dma_addr++ = first_dma;
> > + first_dma += PAGE_SIZE;
> > + }
> > +}
> > +
> > +/*
> > + * When restoring, restore backed-up content to the newly
> > allocated page and
> > + * if successful, populate the page-table and dma-address arrays.
> > + */
> > +static int ttm_pool_restore_commit(struct ttm_pool_tt_restore
> > *restore,
> > + struct ttm_backup *backup,
> > + const struct ttm_operation_ctx
> > *ctx,
> > + struct ttm_pool_alloc_state
> > *alloc)
> > +
> > +{
> > + pgoff_t i, nr = 1UL << restore->order;
> > + struct page **first_page = alloc->pages;
> > + struct page *p;
> > + int ret = 0;
> > +
> > + for (i = restore->restored_pages; i < nr; ++i) {
> > + p = first_page[i];
> > + if (ttm_backup_page_ptr_is_handle(p)) {
> > + unsigned long handle =
> > ttm_backup_page_ptr_to_handle(p);
> > +
> > + if (handle == 0) {
> > + restore->restored_pages++;
> > + continue;
> > + }
> > +
> > + ret = ttm_backup_copy_page(backup,
> > restore->alloced_page + i,
> > + handle, ctx-
> > >interruptible);
> > + if (ret)
> > + break;
> > +
> > + ttm_backup_drop(backup, handle);
> > + } else if (p) {
> > + /*
> > + * We could probably avoid splitting the
> > old page
> > + * using clever logic, but ATM we don't
> > care, as
> > + * we prioritize releasing memory ASAP.
> > Note that
> > + * here, the old retained page is always
> > write-back
> > + * cached.
> > + */
> > + ttm_pool_split_for_swap(restore->pool, p);
> > + copy_highpage(restore->alloced_page + i,
> > p);
> > + __free_pages(p, 0);
> > + }
> > +
> > + restore->restored_pages++;
> > + first_page[i] = ttm_backup_handle_to_page_ptr(0);
> > + }
> > +
> > + if (ret) {
> > + if (!restore->restored_pages) {
> > + dma_addr_t *dma_addr = alloc->dma_addr ?
> > &restore->first_dma : NULL;
> > +
> > + ttm_pool_unmap_and_free(restore->pool,
> > restore->alloced_page,
> > + dma_addr, restore-
> > >page_caching);
> > + restore->restored_pages = nr;
> > + }
> > + return ret;
> > + }
> > +
> > + ttm_pool_allocated_page_commit(restore->alloced_page,
> > restore->first_dma,
> > + alloc, nr);
> > + if (restore->page_caching == alloc->tt_caching ||
> > PageHighMem(restore->alloced_page))
> > + alloc->caching_divide = alloc->pages;
> > + restore->snapshot_alloc = *alloc;
> > + restore->alloced_pages += nr;
> > +
> > + return 0;
> > +}
> > +
> > +/* If restoring, save information needed for
> > ttm_pool_restore_commit(). */
> > +static void
> > +ttm_pool_page_allocated_restore(struct ttm_pool *pool, unsigned
> > int order,
> > + struct page *p,
> > + enum ttm_caching page_caching,
> > + dma_addr_t first_dma,
> > + struct ttm_pool_tt_restore
> > *restore,
> > + const struct ttm_pool_alloc_state
> > *alloc)
> > +{
> > + restore->pool = pool;
> > + restore->order = order;
> > + restore->restored_pages = 0;
> > + restore->page_caching = page_caching;
> > + restore->first_dma = first_dma;
> > + restore->alloced_page = p;
> > + restore->snapshot_alloc = *alloc;
> > +}
> > +
> > /*
> > * Called when we got a page, either from a pool or newly
> > allocated.
> > * if needed, dma map the page and populate the dma address
> > array.
> > @@ -380,10 +590,11 @@ static unsigned int
> > ttm_pool_page_order(struct ttm_pool *pool, struct page *p)
> > */
> > static int ttm_pool_page_allocated(struct ttm_pool *pool,
> > unsigned int order,
> > struct page *p, enum
> > ttm_caching page_caching,
> > - struct ttm_pool_alloc_state
> > *alloc)
> > + struct ttm_pool_alloc_state
> > *alloc,
> > + struct ttm_pool_tt_restore
> > *restore)
> > {
> > - pgoff_t i, nr = 1UL << order;
> > bool caching_consistent;
> > + dma_addr_t first_dma;
> > int r = 0;
> >
> > caching_consistent = (page_caching == alloc->tt_caching)
> > || PageHighMem(p);
> > @@ -395,17 +606,20 @@ static int ttm_pool_page_allocated(struct
> > ttm_pool *pool, unsigned int order,
> > }
> >
> > if (alloc->dma_addr) {
> > - r = ttm_pool_map(pool, order, p, &alloc-
> > >dma_addr);
> > + r = ttm_pool_map(pool, order, p, &first_dma);
> > if (r)
> > return r;
> > }
> >
> > - alloc->remaining_pages -= nr;
> > - for (i = 0; i < nr; ++i)
> > - *alloc->pages++ = p++;
> > + if (restore) {
> > + ttm_pool_page_allocated_restore(pool, order, p,
> > page_caching,
> > + first_dma,
> > restore, alloc);
> > + } else {
> > + ttm_pool_allocated_page_commit(p, first_dma,
> > alloc, 1UL << order);
> >
> > - if (caching_consistent)
> > - alloc->caching_divide = alloc->pages;
> > + if (caching_consistent)
> > + alloc->caching_divide = alloc->pages;
> > + }
> >
> > return 0;
> > }
> > @@ -428,22 +642,24 @@ static void ttm_pool_free_range(struct
> > ttm_pool *pool, struct ttm_tt *tt,
> > pgoff_t start_page, pgoff_t
> > end_page)
> > {
> > struct page **pages = &tt->pages[start_page];
> > - unsigned int order;
> > + struct ttm_backup *backup = tt->backup;
> > pgoff_t i, nr;
> >
> > for (i = start_page; i < end_page; i += nr, pages += nr) {
> > - struct ttm_pool_type *pt = NULL;
> > + struct page *p = *pages;
> >
> > - order = ttm_pool_page_order(pool, *pages);
> > - nr = (1UL << order);
> > - if (tt->dma_address)
> > - ttm_pool_unmap(pool, tt->dma_address[i],
> > nr);
> > + nr = 1;
> > + if (ttm_backup_page_ptr_is_handle(p)) {
> > + unsigned long handle =
> > ttm_backup_page_ptr_to_handle(p);
> >
> > - pt = ttm_pool_select_type(pool, caching, order);
> > - if (pt)
> > - ttm_pool_type_give(pt, *pages);
> > - else
> > - ttm_pool_free_page(pool, caching, order,
> > *pages);
> > + if (handle != 0)
> > + ttm_backup_drop(backup, handle);
> > + } else if (p) {
> > + dma_addr_t *dma_addr = tt->dma_address ?
> > + tt->dma_address + i : NULL;
> > +
> > + nr = ttm_pool_unmap_and_free(pool, p,
> > dma_addr, caching);
> > + }
> > }
> > }
> >
> > @@ -467,22 +683,11 @@ static unsigned int
> > ttm_pool_alloc_find_order(unsigned int highest,
> > return min_t(unsigned int, highest, __fls(alloc-
> > >remaining_pages));
> > }
> >
> > -/**
> > - * ttm_pool_alloc - Fill a ttm_tt object
> > - *
> > - * @pool: ttm_pool to use
> > - * @tt: ttm_tt object to fill
> > - * @ctx: operation context
> > - *
> > - * Fill the ttm_tt object with pages and also make sure to DMA map
> > them when
> > - * necessary.
> > - *
> > - * Returns: 0 on successe, negative error code otherwise.
> > - */
> > -int ttm_pool_alloc(struct ttm_pool *pool, struct ttm_tt *tt,
> > - struct ttm_operation_ctx *ctx)
> > +static int __ttm_pool_alloc(struct ttm_pool *pool, struct ttm_tt
> > *tt,
> > + const struct ttm_operation_ctx *ctx,
> > + struct ttm_pool_alloc_state *alloc,
> > + struct ttm_pool_tt_restore *restore)
> > {
> > - struct ttm_pool_alloc_state alloc;
> > enum ttm_caching page_caching;
> > gfp_t gfp_flags = GFP_USER;
> > pgoff_t caching_divide;
> > @@ -491,10 +696,8 @@ int ttm_pool_alloc(struct ttm_pool *pool,
> > struct ttm_tt *tt,
> > struct page *p;
> > int r;
> >
> > - ttm_pool_alloc_state_init(tt, &alloc);
> > -
> > - WARN_ON(!alloc.remaining_pages ||
> > ttm_tt_is_populated(tt));
> > - WARN_ON(alloc.dma_addr && !pool->dev);
> > + WARN_ON(!alloc->remaining_pages ||
> > ttm_tt_is_populated(tt));
> > + WARN_ON(alloc->dma_addr && !pool->dev);
> >
> > if (tt->page_flags & TTM_TT_FLAG_ZERO_ALLOC)
> > gfp_flags |= __GFP_ZERO;
> > @@ -509,9 +712,9 @@ int ttm_pool_alloc(struct ttm_pool *pool,
> > struct ttm_tt *tt,
> >
> > page_caching = tt->caching;
> > allow_pools = true;
> > - for (order = ttm_pool_alloc_find_order(MAX_PAGE_ORDER,
> > &alloc);
> > - alloc.remaining_pages;
> > - order = ttm_pool_alloc_find_order(order, &alloc)) {
> > + for (order = ttm_pool_alloc_find_order(MAX_PAGE_ORDER,
> > alloc);
> > + alloc->remaining_pages;
> > + order = ttm_pool_alloc_find_order(order, alloc)) {
> > struct ttm_pool_type *pt;
> >
> > /* First, try to allocate a page from a pool if
> > one exists. */
> > @@ -541,30 +744,120 @@ int ttm_pool_alloc(struct ttm_pool *pool,
> > struct ttm_tt *tt,
> > r = -ENOMEM;
> > goto error_free_all;
> > }
> > - r = ttm_pool_page_allocated(pool, order, p,
> > page_caching, &alloc);
> > + r = ttm_pool_page_allocated(pool, order, p,
> > page_caching, alloc,
> > + restore);
> > if (r)
> > goto error_free_page;
> > +
> > + if (ttm_pool_restore_valid(restore)) {
> > + r = ttm_pool_restore_commit(restore, tt-
> > >backup, ctx, alloc);
> > + if (r)
> > + goto error_free_all;
> > + }
> > }
> >
> > - r = ttm_pool_apply_caching(&alloc);
> > + r = ttm_pool_apply_caching(alloc);
> > if (r)
> > goto error_free_all;
> >
> > + kfree(tt->restore);
> > + tt->restore = NULL;
> > +
> > return 0;
> >
> > error_free_page:
> > ttm_pool_free_page(pool, page_caching, order, p);
> >
> > error_free_all:
> > - caching_divide = alloc.caching_divide - tt->pages;
> > + if (tt->restore)
> > + return r;
> > +
> > + caching_divide = alloc->caching_divide - tt->pages;
> > ttm_pool_free_range(pool, tt, tt->caching, 0,
> > caching_divide);
> > ttm_pool_free_range(pool, tt, ttm_cached, caching_divide,
> > - tt->num_pages -
> > alloc.remaining_pages);
> > + tt->num_pages - alloc-
> > >remaining_pages);
> >
> > return r;
> > }
> > +
> > +/**
> > + * ttm_pool_alloc - Fill a ttm_tt object
> > + *
> > + * @pool: ttm_pool to use
> > + * @tt: ttm_tt object to fill
> > + * @ctx: operation context
> > + *
> > + * Fill the ttm_tt object with pages and also make sure to DMA map
> > them when
> > + * necessary.
> > + *
> > + * Returns: 0 on successe, negative error code otherwise.
> > + */
> > +int ttm_pool_alloc(struct ttm_pool *pool, struct ttm_tt *tt,
> > + struct ttm_operation_ctx *ctx)
> > +{
> > + struct ttm_pool_alloc_state alloc;
> > +
> > + if (WARN_ON(ttm_tt_is_backed_up(tt)))
> > + return -EINVAL;
> > +
> > + ttm_pool_alloc_state_init(tt, &alloc);
> > +
> > + return __ttm_pool_alloc(pool, tt, ctx, &alloc, NULL);
> > +}
> > EXPORT_SYMBOL(ttm_pool_alloc);
> >
> > +/**
> > + * ttm_pool_restore_and_alloc - Fill a ttm_tt, restoring
> > previously backed-up
> > + * content.
> > + *
> > + * @pool: ttm_pool to use
> > + * @tt: ttm_tt object to fill
> > + * @ctx: operation context
> > + *
> > + * Fill the ttm_tt object with pages and also make sure to DMA map
> > them when
> > + * necessary. Read in backed-up content.
> > + *
> > + * Returns: 0 on successe, negative error code otherwise.
> > + */
> > +int ttm_pool_restore_and_alloc(struct ttm_pool *pool, struct
> > ttm_tt *tt,
> > + const struct ttm_operation_ctx
> > *ctx)
> > +{
> > + struct ttm_pool_alloc_state alloc;
> > +
> > + if (WARN_ON(!ttm_tt_is_backed_up(tt)))
> > + return -EINVAL;
> > +
> > + if (!tt->restore) {
> > + gfp_t gfp = GFP_KERNEL | __GFP_NOWARN;
> > +
> > + ttm_pool_alloc_state_init(tt, &alloc);
> > + if (ctx->gfp_retry_mayfail)
> > + gfp |= __GFP_RETRY_MAYFAIL;
> > +
> > + tt->restore = kzalloc(sizeof(*tt->restore), gfp);
> > + if (!tt->restore)
> > + return -ENOMEM;
> > +
> > + tt->restore->snapshot_alloc = alloc;
> > + tt->restore->pool = pool;
> > + tt->restore->restored_pages = 1;
> > + } else {
> > + struct ttm_pool_tt_restore *restore = tt->restore;
> > + int ret;
> > +
> > + alloc = restore->snapshot_alloc;
> > + if (ttm_pool_restore_valid(tt->restore)) {
> > + ret = ttm_pool_restore_commit(restore, tt-
> > >backup, ctx, &alloc);
> > + if (ret)
> > + return ret;
> > + }
> > + if (!alloc.remaining_pages)
> > + return 0;
> > + }
> > +
> > + return __ttm_pool_alloc(pool, tt, ctx, &alloc, tt-
> > >restore);
> > +}
> > +
> > /**
> > * ttm_pool_free - Free the backing pages from a ttm_tt object
> > *
> > @@ -582,6 +875,163 @@ void ttm_pool_free(struct ttm_pool *pool,
> > struct ttm_tt *tt)
> > }
> > EXPORT_SYMBOL(ttm_pool_free);
> >
> > +/**
> > + * ttm_pool_drop_backed_up() - Release content of a swapped-out
> > struct ttm_tt
> > + * @tt: The struct ttm_tt.
> > + *
> > + * Release handles with associated content or any remaining pages
> > of
> > + * a backed-up struct ttm_tt.
> > + */
> > +void ttm_pool_drop_backed_up(struct ttm_tt *tt)
> > +{
> > + struct ttm_pool_tt_restore *restore;
> > + pgoff_t start_page = 0;
> > +
> > + WARN_ON(!ttm_tt_is_backed_up(tt));
> > +
> > + restore = tt->restore;
> > +
> > + /*
> > + * Unmap and free any uncommitted restore page.
> > + * any tt page-array backup entries already read back has
> > + * been cleared already
> > + */
> > + if (ttm_pool_restore_valid(restore)) {
> > + dma_addr_t *dma_addr = tt->dma_address ? &restore-
> > >first_dma : NULL;
> > +
> > + ttm_pool_unmap_and_free(restore->pool, restore-
> > >alloced_page,
> > + dma_addr, restore-
> > >page_caching);
> > + restore->restored_pages = 1UL << restore->order;
> > + }
> > +
> > + /*
> > + * If a restore is ongoing, part of the tt pages may have
> > a
> > + * caching different than writeback.
> > + */
> > + if (restore) {
> > + pgoff_t mid = restore-
> > >snapshot_alloc.caching_divide - tt->pages;
> > +
> > + start_page = restore->alloced_pages;
> > + WARN_ON(mid > start_page);
> > + /* Pages that might be dma-mapped and non-cached
> > */
> > + ttm_pool_free_range(restore->pool, tt, tt-
> > >caching,
> > + 0, mid);
> > + /* Pages that might be dma-mapped but cached */
> > + ttm_pool_free_range(restore->pool, tt, ttm_cached,
> > + mid, restore->alloced_pages);
> > + kfree(restore);
> > + tt->restore = NULL;
> > + }
> > +
> > + ttm_pool_free_range(NULL, tt, ttm_cached, start_page, tt-
> > >num_pages);
> > +}
> > +
> > +/**
> > + * ttm_pool_backup() - Back up or purge a struct ttm_tt
> > + * @pool: The pool used when allocating the struct ttm_tt.
> > + * @tt: The struct ttm_tt.
> > + * @flags: Flags to govern the backup behaviour.
> > + *
> > + * Back up or purge a struct ttm_tt. If @purge is true, then
> > + * all pages will be freed directly to the system rather than to
> > the pool
> > + * they were allocated from, making the function behave similarly
> > to
> > + * ttm_pool_free(). If @purge is false the pages will be backed up
> > instead,
> > + * exchanged for handles.
> > + * A subsequent call to ttm_pool_restore_and_alloc() will then
> > read back the content and
> > + * a subsequent call to ttm_pool_drop_backed_up() will drop it.
> > + * If backup of a page fails for whatever reason, @ttm will still
> > be
> > + * partially backed up, retaining those pages for which backup
> > fails.
> > + * In that case, this function can be retried, possibly after
> > freeing up
> > + * memory resources.
> > + *
> > + * Return: Number of pages actually backed up or freed, or
> > negative
> > + * error code on error.
> > + */
> > +long ttm_pool_backup(struct ttm_pool *pool, struct ttm_tt *tt,
> > + const struct ttm_backup_flags *flags)
> > +{
> > + struct ttm_backup *backup = tt->backup;
> > + struct page *page;
> > + unsigned long handle;
> > + gfp_t alloc_gfp;
> > + gfp_t gfp;
> > + int ret = 0;
> > + pgoff_t shrunken = 0;
> > + pgoff_t i, num_pages;
> > +
> > + if (WARN_ON(ttm_tt_is_backed_up(tt)))
> > + return -EINVAL;
> > +
> > + if ((!ttm_backup_bytes_avail() && !flags->purge) ||
> > + pool->use_dma_alloc || ttm_tt_is_backed_up(tt))
> > + return -EBUSY;
> > +
> > +#ifdef CONFIG_X86
> > + /* Anything returned to the system needs to be cached. */
> > + if (tt->caching != ttm_cached)
> > + set_pages_array_wb(tt->pages, tt->num_pages);
> > +#endif
> > +
> > + if (tt->dma_address || flags->purge) {
> > + for (i = 0; i < tt->num_pages; i += num_pages) {
> > + unsigned int order;
> > +
> > + page = tt->pages[i];
> > + if (unlikely(!page)) {
> > + num_pages = 1;
> > + continue;
> > + }
> > +
> > + order = ttm_pool_page_order(pool, page);
> > + num_pages = 1UL << order;
> > + if (tt->dma_address)
> > + ttm_pool_unmap(pool, tt-
> > >dma_address[i],
> > + num_pages);
> > + if (flags->purge) {
> > + shrunken += num_pages;
> > + page->private = 0;
> > + __free_pages(page, order);
> > + memset(tt->pages + i, 0,
> > + num_pages * sizeof(*tt-
> > >pages));
> > + }
> > + }
> > + }
> > +
> > + if (flags->purge)
> > + return shrunken;
> > +
> > + if (pool->use_dma32)
> > + gfp = GFP_DMA32;
> > + else
> > + gfp = GFP_HIGHUSER;
> > +
> > + alloc_gfp = GFP_KERNEL | __GFP_HIGH | __GFP_NOWARN |
> > __GFP_RETRY_MAYFAIL;
> > +
> > + for (i = 0; i < tt->num_pages; ++i) {
> > + s64 shandle;
> > +
> > + page = tt->pages[i];
> > + if (unlikely(!page))
> > + continue;
> > +
> > + ttm_pool_split_for_swap(pool, page);
> > +
> > + shandle = ttm_backup_backup_page(backup, page,
> > flags->writeback, i,
> > + gfp, alloc_gfp);
> > + if (shandle < 0) {
> > + /* We allow partially shrunken tts */
> > + ret = shandle;
> > + break;
> > + }
> > + handle = shandle;
> > + tt->pages[i] =
> > ttm_backup_handle_to_page_ptr(handle);
> > + put_page(page);
> > + shrunken++;
> > + }
> > +
> > + return shrunken ? shrunken : ret;
> > +}
> > +
> > /**
> > * ttm_pool_init - Initialize a pool
> > *
> > diff --git a/drivers/gpu/drm/ttm/ttm_tt.c
> > b/drivers/gpu/drm/ttm/ttm_tt.c
> > index 3baf215eca23..00b7c28f2329 100644
> > --- a/drivers/gpu/drm/ttm/ttm_tt.c
> > +++ b/drivers/gpu/drm/ttm/ttm_tt.c
> > @@ -40,6 +40,7 @@
> > #include <drm/drm_cache.h>
> > #include <drm/drm_device.h>
> > #include <drm/drm_util.h>
> > +#include <drm/ttm/ttm_backup.h>
> > #include <drm/ttm/ttm_bo.h>
> > #include <drm/ttm/ttm_tt.h>
> >
> > @@ -158,6 +159,8 @@ static void ttm_tt_init_fields(struct ttm_tt
> > *ttm,
> > ttm->swap_storage = NULL;
> > ttm->sg = bo->sg;
> > ttm->caching = caching;
> > + ttm->restore = NULL;
> > + ttm->backup = NULL;
> > }
> >
> > int ttm_tt_init(struct ttm_tt *ttm, struct ttm_buffer_object *bo,
> > @@ -182,6 +185,13 @@ void ttm_tt_fini(struct ttm_tt *ttm)
> > fput(ttm->swap_storage);
> > ttm->swap_storage = NULL;
> >
> > + if (ttm_tt_is_backed_up(ttm))
> > + ttm_pool_drop_backed_up(ttm);
> > + if (ttm->backup) {
> > + ttm_backup_fini(ttm->backup);
> > + ttm->backup = NULL;
> > + }
> > +
> > if (ttm->pages)
> > kvfree(ttm->pages);
> > else
> > @@ -253,6 +263,49 @@ int ttm_tt_swapin(struct ttm_tt *ttm)
> > }
> > EXPORT_SYMBOL_FOR_TESTS_ONLY(ttm_tt_swapin);
> >
> > +/**
> > + * ttm_tt_backup() - Helper to back up a struct ttm_tt.
> > + * @bdev: The TTM device.
> > + * @tt: The struct ttm_tt.
> > + * @flags: Flags that govern the backup behaviour.
> > + *
> > + * Update the page accounting and call ttm_pool_shrink_tt to free
> > pages
> > + * or back them up.
> > + *
> > + * Return: Number of pages freed or swapped out, or negative error
> > code on
> > + * error.
> > + */
> > +long ttm_tt_backup(struct ttm_device *bdev, struct ttm_tt *tt,
> > + const struct ttm_backup_flags flags)
> > +{
> > + long ret;
> > +
> > + if (WARN_ON(IS_ERR_OR_NULL(tt->backup)))
> > + return 0;
> > +
> > + ret = ttm_pool_backup(&bdev->pool, tt, &flags);
> > + if (ret > 0) {
> > + tt->page_flags &= ~TTM_TT_FLAG_PRIV_POPULATED;
> > + tt->page_flags |= TTM_TT_FLAG_BACKED_UP;
> > + }
> > +
> > + return ret;
> > +}
> > +
> > +int ttm_tt_restore(struct ttm_device *bdev, struct ttm_tt *tt,
> > + const struct ttm_operation_ctx *ctx)
> > +{
> > + int ret = ttm_pool_restore_and_alloc(&bdev->pool, tt,
> > ctx);
> > +
> > + if (ret)
> > + return ret;
> > +
> > + tt->page_flags &= ~TTM_TT_FLAG_BACKED_UP;
> > +
> > + return 0;
> > +}
> > +EXPORT_SYMBOL(ttm_tt_restore);
> > +
> > /**
> > * ttm_tt_swapout - swap out tt object
> > *
> > @@ -348,6 +401,7 @@ int ttm_tt_populate(struct ttm_device *bdev,
> > goto error;
> >
> > ttm->page_flags |= TTM_TT_FLAG_PRIV_POPULATED;
> > + ttm->page_flags &= ~TTM_TT_FLAG_BACKED_UP;
> > if (unlikely(ttm->page_flags & TTM_TT_FLAG_SWAPPED)) {
> > ret = ttm_tt_swapin(ttm);
> > if (unlikely(ret != 0)) {
> > diff --git a/include/drm/ttm/ttm_pool.h
> > b/include/drm/ttm/ttm_pool.h
> > index 160d954a261e..54cd34a6e4c0 100644
> > --- a/include/drm/ttm/ttm_pool.h
> > +++ b/include/drm/ttm/ttm_pool.h
> > @@ -33,6 +33,7 @@
> >
> > struct device;
> > struct seq_file;
> > +struct ttm_backup_flags;
> > struct ttm_operation_ctx;
> > struct ttm_pool;
> > struct ttm_tt;
> > @@ -89,6 +90,13 @@ void ttm_pool_fini(struct ttm_pool *pool);
> >
> > int ttm_pool_debugfs(struct ttm_pool *pool, struct seq_file *m);
> >
> > +void ttm_pool_drop_backed_up(struct ttm_tt *tt);
> > +
> > +long ttm_pool_backup(struct ttm_pool *pool, struct ttm_tt *ttm,
> > + const struct ttm_backup_flags *flags);
> > +int ttm_pool_restore_and_alloc(struct ttm_pool *pool, struct
> > ttm_tt *tt,
> > + const struct ttm_operation_ctx
> > *ctx);
> > +
> > int ttm_pool_mgr_init(unsigned long num_pages);
> > void ttm_pool_mgr_fini(void);
> >
> > diff --git a/include/drm/ttm/ttm_tt.h b/include/drm/ttm/ttm_tt.h
> > index 991edafdb2dd..c736c01ac2ca 100644
> > --- a/include/drm/ttm/ttm_tt.h
> > +++ b/include/drm/ttm/ttm_tt.h
> > @@ -32,11 +32,13 @@
> > #include <drm/ttm/ttm_caching.h>
> > #include <drm/ttm/ttm_kmap_iter.h>
> >
> > +struct ttm_backup;
> > struct ttm_device;
> > struct ttm_tt;
> > struct ttm_resource;
> > struct ttm_buffer_object;
> > struct ttm_operation_ctx;
> > +struct ttm_pool_tt_restore;
> >
> > /**
> > * struct ttm_tt - This is a structure holding the pages,
> > caching- and aperture
> > @@ -85,17 +87,22 @@ struct ttm_tt {
> > * fault handling abuses the DMA api a bit and
> > dma_map_attrs can't be
> > * used to assure pgprot always matches.
> > *
> > + * TTM_TT_FLAG_BACKED_UP: TTM internal only. This is set
> > if the
> > + * struct ttm_tt has been (possibly partially) backed up.
> > + *
> > * TTM_TT_FLAG_PRIV_POPULATED: TTM internal only. DO NOT
> > USE. This is
> > * set by TTM after ttm_tt_populate() has successfully
> > returned, and is
> > * then unset when TTM calls ttm_tt_unpopulate().
> > + *
> > */
> > #define TTM_TT_FLAG_SWAPPED BIT(0)
> > #define TTM_TT_FLAG_ZERO_ALLOC BIT(1)
> > #define TTM_TT_FLAG_EXTERNAL BIT(2)
> > #define TTM_TT_FLAG_EXTERNAL_MAPPABLE BIT(3)
> > #define TTM_TT_FLAG_DECRYPTED BIT(4)
> > +#define TTM_TT_FLAG_BACKED_UP BIT(5)
> >
> > -#define TTM_TT_FLAG_PRIV_POPULATED BIT(5)
> > +#define TTM_TT_FLAG_PRIV_POPULATED BIT(6)
> > uint32_t page_flags;
> > /** @num_pages: Number of pages in the page array. */
> > uint32_t num_pages;
> > @@ -105,11 +112,20 @@ struct ttm_tt {
> > dma_addr_t *dma_address;
> > /** @swap_storage: Pointer to shmem struct file for swap
> > storage. */
> > struct file *swap_storage;
> > + /**
> > + * @backup: Pointer to backup struct for backed up tts.
> > + * Could be unified with @swap_storage. Meanwhile, the
> > driver's
> > + * ttm_tt_create() callback is responsible for assigning
> > + * this field.
> > + */
> > + struct ttm_backup *backup;
> > /**
> > * @caching: The current caching state of the pages, see
> > enum
> > * ttm_caching.
> > */
> > enum ttm_caching caching;
> > + /** @restore: Partial restoration from backup state. TTM
> > private */
> > + struct ttm_pool_tt_restore *restore;
> > };
> >
> > /**
> > @@ -129,9 +145,38 @@ static inline bool ttm_tt_is_populated(struct
> > ttm_tt *tt)
> > return tt->page_flags & TTM_TT_FLAG_PRIV_POPULATED;
> > }
> >
> > +/**
> > + * ttm_tt_is_swapped() - Whether the ttm_tt is swapped out or
> > backed up
> > + * @tt: The struct ttm_tt.
> > + *
> > + * Return: true if swapped or backed up, false otherwise.
> > + */
> > static inline bool ttm_tt_is_swapped(const struct ttm_tt *tt)
> > {
> > - return tt->page_flags & TTM_TT_FLAG_SWAPPED;
> > + return tt->page_flags & (TTM_TT_FLAG_SWAPPED |
> > TTM_TT_FLAG_BACKED_UP);
> > +}
> > +
> > +/**
> > + * ttm_tt_is_backed_up() - Whether the ttm_tt backed up
> > + * @tt: The struct ttm_tt.
> > + *
> > + * Return: true if swapped or backed up, false otherwise.
> > + */
> > +static inline bool ttm_tt_is_backed_up(const struct ttm_tt *tt)
> > +{
> > + return tt->page_flags & TTM_TT_FLAG_BACKED_UP;
> > +}
> > +
> > +/**
> > + * ttm_tt_clear_backed_up() - Clear the ttm_tt backed-up status
> > + * @tt: The struct ttm_tt.
> > + *
> > + * Drivers can use this functionto clear the backed-up status,
> > + * for example before destroying or re-validating a purged tt.
> > + */
> > +static inline void ttm_tt_clear_backed_up(struct ttm_tt *tt)
> > +{
> > + tt->page_flags &= ~TTM_TT_FLAG_BACKED_UP;
> > }
> >
> > /**
> > @@ -235,6 +280,24 @@ void ttm_tt_mgr_init(unsigned long num_pages,
> > unsigned long num_dma32_pages);
> > struct ttm_kmap_iter *ttm_kmap_iter_tt_init(struct
> > ttm_kmap_iter_tt *iter_tt,
> > struct ttm_tt *tt);
> > unsigned long ttm_tt_pages_limit(void);
> > +
> > +/**
> > + * struct ttm_backup_flags - Flags to govern backup behaviour.
> > + * @purge: Free pages without backing up. Bypass pools.
> > + * @writeback: Attempt to copy contents directly to swap space,
> > even
> > + * if that means blocking on writes to external memory.
> > + */
> > +struct ttm_backup_flags {
> > + u32 purge : 1;
> > + u32 writeback : 1;
> > +};
> > +
> > +long ttm_tt_backup(struct ttm_device *bdev, struct ttm_tt *tt,
> > + const struct ttm_backup_flags flags);
> > +
> > +int ttm_tt_restore(struct ttm_device *bdev, struct ttm_tt *tt,
> > + const struct ttm_operation_ctx *ctx);
> > +
> > #if IS_ENABLED(CONFIG_AGP)
> > #include <linux/agp_backend.h>
> >
>
^ permalink raw reply [flat|nested] 26+ messages in thread* RESEND Re: [PATCH v16 2/7] drm/ttm/pool, drm/ttm/tt: Provide a helper to shrink pages
2025-02-18 15:40 ` Thomas Hellström
@ 2025-02-25 8:26 ` Thomas Hellström
2025-03-05 3:01 ` Dave Airlie
0 siblings, 1 reply; 26+ messages in thread
From: Thomas Hellström @ 2025-02-25 8:26 UTC (permalink / raw)
To: Christian König, intel-xe
Cc: Somalapuram Amaranath, Matthew Brost, dri-devel
Hi, Christian,
Ping? I'd really want to get this in before -rc6
Thanks,
Thomas
On Tue, 2025-02-18 at 16:40 +0100, Thomas Hellström wrote:
> Hi, Christian,
>
> On Wed, 2025-02-05 at 15:02 +0100, Christian König wrote:
> > Am 30.01.25 um 11:13 schrieb Thomas Hellström:
> > > Provide a helper to shrink ttm_tt page-vectors on a per-page
> > > basis. A ttm_backup backend could then in theory get away with
> > > allocating a single temporary page for each struct ttm_tt.
> > >
> > > This is accomplished by splitting larger pages before trying to
> > > back them up.
> > >
> > > In the future we could allow ttm_backup to handle backing up
> > > large pages as well, but currently there's no benefit in
> > > doing that, since the shmem backup backend would have to
> > > split those anyway to avoid allocating too much temporary
> > > memory, and if the backend instead inserts pages into the
> > > swap-cache, those are split on reclaim by the core.
> > >
> > > Due to potential backup- and recover errors, allow partially
> > > swapped
> > > out struct ttm_tt's, although mark them as swapped out stopping
> > > them
> > > from being swapped out a second time. More details in the
> > > ttm_pool.c
> > > DOC section.
> > >
> > > v2:
> > > - A couple of cleanups and error fixes in ttm_pool_back_up_tt.
> > > - s/back_up/backup/
> > > - Add a writeback parameter to the exported interface.
> > > v8:
> > > - Use a struct for flags for readability (Matt Brost)
> > > - Address misc other review comments (Matt Brost)
> > > v9:
> > > - Update the kerneldoc for the ttm_tt::backup field.
> > > v10:
> > > - Rebase.
> > > v13:
> > > - Rebase on ttm_backup interface change. Update kerneldoc.
> > > - Rebase and adjust ttm_tt_is_swapped().
> > > v15:
> > > - Rebase on ttm_backup return value change.
> > > - Rebase on previous restructuring of ttm_pool_alloc()
> > > - Rework the ttm_pool backup interface (Christian König)
> > > - Remove cond_resched() (Christian König)
> > > - Get rid of the need to allocate an intermediate page array
> > > when restoring a multi-order page (Christian König)
> > > - Update documentation.
> > >
> > > Cc: Christian König <christian.koenig@amd.com>
> > > Cc: Somalapuram Amaranath <Amaranath.Somalapuram@amd.com>
> > > Cc: Matthew Brost <matthew.brost@intel.com>
> > > Cc: <dri-devel@lists.freedesktop.org>
> > > Signed-off-by: Thomas Hellström
> > > <thomas.hellstrom@linux.intel.com>
> > > Reviewed-by: Matthew Brost <matthew.brost@intel.com>
> >
> > I've tried to wrap my head around all of this like twenty times in
> > the
> > last three month, but was always interrupted at some point.
> >
> > Feel free to add Acked-by: Christian Koenig
> > <christian.koenig@amd.com>.
> >
> > Sorry,
> > Christian.
>
> Thanks a lot for all reviewing and comments so far. There are two TTM
> patches left in the series that don't have an ack by you:
>
> https://patchwork.freedesktop.org/patch/634715/?series=131815&rev=17
> and
>
> https://patchwork.freedesktop.org/patch/634716/?series=131815&rev=17
>
> None of them particularly big considering the amount of doc text.
>
> It'd be great if those could have an ack as well so we could finally
> merge this series.
>
> Thanks,
> Thomas
>
>
>
>
>
>
> >
> > > ---
> > > drivers/gpu/drm/ttm/ttm_pool.c | 554
> > > +++++++++++++++++++++++++++++----
> > > drivers/gpu/drm/ttm/ttm_tt.c | 54 ++++
> > > include/drm/ttm/ttm_pool.h | 8 +
> > > include/drm/ttm/ttm_tt.h | 67 +++-
> > > 4 files changed, 629 insertions(+), 54 deletions(-)
> > >
> > > diff --git a/drivers/gpu/drm/ttm/ttm_pool.c
> > > b/drivers/gpu/drm/ttm/ttm_pool.c
> > > index c9eba76d5143..ffb7abf52bab 100644
> > > --- a/drivers/gpu/drm/ttm/ttm_pool.c
> > > +++ b/drivers/gpu/drm/ttm/ttm_pool.c
> > > @@ -41,6 +41,7 @@
> > > #include <asm/set_memory.h>
> > > #endif
> > >
> > > +#include <drm/ttm/ttm_backup.h>
> > > #include <drm/ttm/ttm_pool.h>
> > > #include <drm/ttm/ttm_tt.h>
> > > #include <drm/ttm/ttm_bo.h>
> > > @@ -75,6 +76,35 @@ struct ttm_pool_alloc_state {
> > > enum ttm_caching tt_caching;
> > > };
> > >
> > > +/**
> > > + * struct ttm_pool_tt_restore - State representing restore from
> > > backup
> > > + * @pool: The pool used for page allocation while restoring.
> > > + * @snapshot_alloc: A snapshot of the most recent struct
> > > ttm_pool_alloc_state.
> > > + * @alloced_page: Pointer to the page most recently allocated
> > > from
> > > a pool or system.
> > > + * @first_dma: The dma address corresponding to @alloced_page if
> > > dma_mapping
> > > + * is requested.
> > > + * @alloced_pages: The number of allocated pages present in the
> > > struct ttm_tt
> > > + * page vector from this restore session.
> > > + * @restored_pages: The number of 4K pages restored for
> > > @alloced_page (which
> > > + * is typically a multi-order page).
> > > + * @page_caching: The struct ttm_tt requested caching
> > > + * @order: The order of @alloced_page.
> > > + *
> > > + * Recovery from backup might fail when we've recovered less
> > > than
> > > the
> > > + * full ttm_tt. In order not to loose any data (yet), keep
> > > information
> > > + * around that allows us to restart a failed ttm backup
> > > recovery.
> > > + */
> > > +struct ttm_pool_tt_restore {
> > > + struct ttm_pool *pool;
> > > + struct ttm_pool_alloc_state snapshot_alloc;
> > > + struct page *alloced_page;
> > > + dma_addr_t first_dma;
> > > + pgoff_t alloced_pages;
> > > + pgoff_t restored_pages;
> > > + enum ttm_caching page_caching;
> > > + unsigned int order;
> > > +};
> > > +
> > > static unsigned long page_pool_size;
> > >
> > > MODULE_PARM_DESC(page_pool_size, "Number of pages in the
> > > WC/UC/DMA pool");
> > > @@ -199,12 +229,11 @@ static int ttm_pool_apply_caching(struct
> > > ttm_pool_alloc_state *alloc)
> > > return 0;
> > > }
> > >
> > > -/* Map pages of 1 << order size and fill the DMA address array
> > > */
> > > +/* DMA Map pages of 1 << order size and return the resulting
> > > dma_address. */
> > > static int ttm_pool_map(struct ttm_pool *pool, unsigned int
> > > order,
> > > - struct page *p, dma_addr_t **dma_addr)
> > > + struct page *p, dma_addr_t *dma_addr)
> > > {
> > > dma_addr_t addr;
> > > - unsigned int i;
> > >
> > > if (pool->use_dma_alloc) {
> > > struct ttm_pool_dma *dma = (void *)p->private;
> > > @@ -218,10 +247,7 @@ static int ttm_pool_map(struct ttm_pool
> > > *pool,
> > > unsigned int order,
> > > return -EFAULT;
> > > }
> > >
> > > - for (i = 1 << order; i ; --i) {
> > > - *(*dma_addr)++ = addr;
> > > - addr += PAGE_SIZE;
> > > - }
> > > + *dma_addr = addr;
> > >
> > > return 0;
> > > }
> > > @@ -371,6 +397,190 @@ static unsigned int
> > > ttm_pool_page_order(struct ttm_pool *pool, struct page *p)
> > > return p->private;
> > > }
> > >
> > > +/*
> > > + * Split larger pages so that we can free each PAGE_SIZE page as
> > > soon
> > > + * as it has been backed up, in order to avoid memory pressure
> > > during
> > > + * reclaim.
> > > + */
> > > +static void ttm_pool_split_for_swap(struct ttm_pool *pool,
> > > struct
> > > page *p)
> > > +{
> > > + unsigned int order = ttm_pool_page_order(pool, p);
> > > + pgoff_t nr;
> > > +
> > > + if (!order)
> > > + return;
> > > +
> > > + split_page(p, order);
> > > + nr = 1UL << order;
> > > + while (nr--)
> > > + (p++)->private = 0;
> > > +}
> > > +
> > > +/**
> > > + * DOC: Partial backup and restoration of a struct ttm_tt.
> > > + *
> > > + * Swapout using ttm_backup_backup_page() and swapin using
> > > + * ttm_backup_copy_page() may fail.
> > > + * The former most likely due to lack of swap-space or memory,
> > > the
> > > latter due
> > > + * to lack of memory or because of signal interruption during
> > > waits.
> > > + *
> > > + * Backup failure is easily handled by using a ttm_tt pages
> > > vector
> > > that holds
> > > + * both backup handles and page pointers. This has to be taken
> > > into account when
> > > + * restoring such a ttm_tt from backup, and when freeing it
> > > while
> > > backed up.
> > > + * When restoring, for simplicity, new pages are actually
> > > allocated from the
> > > + * pool and the contents of any old pages are copied in and then
> > > the old pages
> > > + * are released.
> > > + *
> > > + * For restoration failures, the struct ttm_pool_tt_restore
> > > holds
> > > sufficient state
> > > + * to be able to resume an interrupted restore, and that
> > > structure
> > > is freed once
> > > + * the restoration is complete. If the struct ttm_tt is
> > > destroyed
> > > while there
> > > + * is a valid struct ttm_pool_tt_restore attached, that is also
> > > properly taken
> > > + * care of.
> > > + */
> > > +
> > > +/* Is restore ongoing for the currently allocated page? */
> > > +static bool ttm_pool_restore_valid(const struct
> > > ttm_pool_tt_restore *restore)
> > > +{
> > > + return restore && restore->restored_pages < (1 <<
> > > restore-
> > > > order);
> > > +}
> > > +
> > > +/* DMA unmap and free a multi-order page, either to the relevant
> > > pool or to system. */
> > > +static pgoff_t ttm_pool_unmap_and_free(struct ttm_pool *pool,
> > > struct page *page,
> > > + const dma_addr_t
> > > *dma_addr,
> > > enum ttm_caching caching)
> > > +{
> > > + struct ttm_pool_type *pt = NULL;
> > > + unsigned int order;
> > > + pgoff_t nr;
> > > +
> > > + if (pool) {
> > > + order = ttm_pool_page_order(pool, page);
> > > + nr = (1UL << order);
> > > + if (dma_addr)
> > > + ttm_pool_unmap(pool, *dma_addr, nr);
> > > +
> > > + pt = ttm_pool_select_type(pool, caching, order);
> > > + } else {
> > > + order = page->private;
> > > + nr = (1UL << order);
> > > + }
> > > +
> > > + if (pt)
> > > + ttm_pool_type_give(pt, page);
> > > + else
> > > + ttm_pool_free_page(pool, caching, order, page);
> > > +
> > > + return nr;
> > > +}
> > > +
> > > +/* Populate the page-array using the most recent allocated
> > > multi-
> > > order page. */
> > > +static void ttm_pool_allocated_page_commit(struct page
> > > *allocated,
> > > + dma_addr_t first_dma,
> > > + struct
> > > ttm_pool_alloc_state *alloc,
> > > + pgoff_t nr)
> > > +{
> > > + pgoff_t i;
> > > +
> > > + for (i = 0; i < nr; ++i)
> > > + *alloc->pages++ = allocated++;
> > > +
> > > + alloc->remaining_pages -= nr;
> > > +
> > > + if (!alloc->dma_addr)
> > > + return;
> > > +
> > > + for (i = 0; i < nr; ++i) {
> > > + *alloc->dma_addr++ = first_dma;
> > > + first_dma += PAGE_SIZE;
> > > + }
> > > +}
> > > +
> > > +/*
> > > + * When restoring, restore backed-up content to the newly
> > > allocated page and
> > > + * if successful, populate the page-table and dma-address
> > > arrays.
> > > + */
> > > +static int ttm_pool_restore_commit(struct ttm_pool_tt_restore
> > > *restore,
> > > + struct ttm_backup *backup,
> > > + const struct
> > > ttm_operation_ctx
> > > *ctx,
> > > + struct ttm_pool_alloc_state
> > > *alloc)
> > > +
> > > +{
> > > + pgoff_t i, nr = 1UL << restore->order;
> > > + struct page **first_page = alloc->pages;
> > > + struct page *p;
> > > + int ret = 0;
> > > +
> > > + for (i = restore->restored_pages; i < nr; ++i) {
> > > + p = first_page[i];
> > > + if (ttm_backup_page_ptr_is_handle(p)) {
> > > + unsigned long handle =
> > > ttm_backup_page_ptr_to_handle(p);
> > > +
> > > + if (handle == 0) {
> > > + restore->restored_pages++;
> > > + continue;
> > > + }
> > > +
> > > + ret = ttm_backup_copy_page(backup,
> > > restore->alloced_page + i,
> > > + handle, ctx-
> > > > interruptible);
> > > + if (ret)
> > > + break;
> > > +
> > > + ttm_backup_drop(backup, handle);
> > > + } else if (p) {
> > > + /*
> > > + * We could probably avoid splitting the
> > > old page
> > > + * using clever logic, but ATM we don't
> > > care, as
> > > + * we prioritize releasing memory ASAP.
> > > Note that
> > > + * here, the old retained page is always
> > > write-back
> > > + * cached.
> > > + */
> > > + ttm_pool_split_for_swap(restore->pool,
> > > p);
> > > + copy_highpage(restore->alloced_page + i,
> > > p);
> > > + __free_pages(p, 0);
> > > + }
> > > +
> > > + restore->restored_pages++;
> > > + first_page[i] =
> > > ttm_backup_handle_to_page_ptr(0);
> > > + }
> > > +
> > > + if (ret) {
> > > + if (!restore->restored_pages) {
> > > + dma_addr_t *dma_addr = alloc->dma_addr ?
> > > &restore->first_dma : NULL;
> > > +
> > > + ttm_pool_unmap_and_free(restore->pool,
> > > restore->alloced_page,
> > > + dma_addr,
> > > restore-
> > > > page_caching);
> > > + restore->restored_pages = nr;
> > > + }
> > > + return ret;
> > > + }
> > > +
> > > + ttm_pool_allocated_page_commit(restore->alloced_page,
> > > restore->first_dma,
> > > + alloc, nr);
> > > + if (restore->page_caching == alloc->tt_caching ||
> > > PageHighMem(restore->alloced_page))
> > > + alloc->caching_divide = alloc->pages;
> > > + restore->snapshot_alloc = *alloc;
> > > + restore->alloced_pages += nr;
> > > +
> > > + return 0;
> > > +}
> > > +
> > > +/* If restoring, save information needed for
> > > ttm_pool_restore_commit(). */
> > > +static void
> > > +ttm_pool_page_allocated_restore(struct ttm_pool *pool, unsigned
> > > int order,
> > > + struct page *p,
> > > + enum ttm_caching page_caching,
> > > + dma_addr_t first_dma,
> > > + struct ttm_pool_tt_restore
> > > *restore,
> > > + const struct
> > > ttm_pool_alloc_state
> > > *alloc)
> > > +{
> > > + restore->pool = pool;
> > > + restore->order = order;
> > > + restore->restored_pages = 0;
> > > + restore->page_caching = page_caching;
> > > + restore->first_dma = first_dma;
> > > + restore->alloced_page = p;
> > > + restore->snapshot_alloc = *alloc;
> > > +}
> > > +
> > > /*
> > > * Called when we got a page, either from a pool or newly
> > > allocated.
> > > * if needed, dma map the page and populate the dma address
> > > array.
> > > @@ -380,10 +590,11 @@ static unsigned int
> > > ttm_pool_page_order(struct ttm_pool *pool, struct page *p)
> > > */
> > > static int ttm_pool_page_allocated(struct ttm_pool *pool,
> > > unsigned int order,
> > > struct page *p, enum
> > > ttm_caching page_caching,
> > > - struct ttm_pool_alloc_state
> > > *alloc)
> > > + struct ttm_pool_alloc_state
> > > *alloc,
> > > + struct ttm_pool_tt_restore
> > > *restore)
> > > {
> > > - pgoff_t i, nr = 1UL << order;
> > > bool caching_consistent;
> > > + dma_addr_t first_dma;
> > > int r = 0;
> > >
> > > caching_consistent = (page_caching == alloc->tt_caching)
> > > > > PageHighMem(p);
> > > @@ -395,17 +606,20 @@ static int ttm_pool_page_allocated(struct
> > > ttm_pool *pool, unsigned int order,
> > > }
> > >
> > > if (alloc->dma_addr) {
> > > - r = ttm_pool_map(pool, order, p, &alloc-
> > > > dma_addr);
> > > + r = ttm_pool_map(pool, order, p, &first_dma);
> > > if (r)
> > > return r;
> > > }
> > >
> > > - alloc->remaining_pages -= nr;
> > > - for (i = 0; i < nr; ++i)
> > > - *alloc->pages++ = p++;
> > > + if (restore) {
> > > + ttm_pool_page_allocated_restore(pool, order, p,
> > > page_caching,
> > > + first_dma,
> > > restore, alloc);
> > > + } else {
> > > + ttm_pool_allocated_page_commit(p, first_dma,
> > > alloc, 1UL << order);
> > >
> > > - if (caching_consistent)
> > > - alloc->caching_divide = alloc->pages;
> > > + if (caching_consistent)
> > > + alloc->caching_divide = alloc->pages;
> > > + }
> > >
> > > return 0;
> > > }
> > > @@ -428,22 +642,24 @@ static void ttm_pool_free_range(struct
> > > ttm_pool *pool, struct ttm_tt *tt,
> > > pgoff_t start_page, pgoff_t
> > > end_page)
> > > {
> > > struct page **pages = &tt->pages[start_page];
> > > - unsigned int order;
> > > + struct ttm_backup *backup = tt->backup;
> > > pgoff_t i, nr;
> > >
> > > for (i = start_page; i < end_page; i += nr, pages += nr)
> > > {
> > > - struct ttm_pool_type *pt = NULL;
> > > + struct page *p = *pages;
> > >
> > > - order = ttm_pool_page_order(pool, *pages);
> > > - nr = (1UL << order);
> > > - if (tt->dma_address)
> > > - ttm_pool_unmap(pool, tt->dma_address[i],
> > > nr);
> > > + nr = 1;
> > > + if (ttm_backup_page_ptr_is_handle(p)) {
> > > + unsigned long handle =
> > > ttm_backup_page_ptr_to_handle(p);
> > >
> > > - pt = ttm_pool_select_type(pool, caching, order);
> > > - if (pt)
> > > - ttm_pool_type_give(pt, *pages);
> > > - else
> > > - ttm_pool_free_page(pool, caching, order,
> > > *pages);
> > > + if (handle != 0)
> > > + ttm_backup_drop(backup, handle);
> > > + } else if (p) {
> > > + dma_addr_t *dma_addr = tt->dma_address ?
> > > + tt->dma_address + i : NULL;
> > > +
> > > + nr = ttm_pool_unmap_and_free(pool, p,
> > > dma_addr, caching);
> > > + }
> > > }
> > > }
> > >
> > > @@ -467,22 +683,11 @@ static unsigned int
> > > ttm_pool_alloc_find_order(unsigned int highest,
> > > return min_t(unsigned int, highest, __fls(alloc-
> > > > remaining_pages));
> > > }
> > >
> > > -/**
> > > - * ttm_pool_alloc - Fill a ttm_tt object
> > > - *
> > > - * @pool: ttm_pool to use
> > > - * @tt: ttm_tt object to fill
> > > - * @ctx: operation context
> > > - *
> > > - * Fill the ttm_tt object with pages and also make sure to DMA
> > > map
> > > them when
> > > - * necessary.
> > > - *
> > > - * Returns: 0 on successe, negative error code otherwise.
> > > - */
> > > -int ttm_pool_alloc(struct ttm_pool *pool, struct ttm_tt *tt,
> > > - struct ttm_operation_ctx *ctx)
> > > +static int __ttm_pool_alloc(struct ttm_pool *pool, struct ttm_tt
> > > *tt,
> > > + const struct ttm_operation_ctx *ctx,
> > > + struct ttm_pool_alloc_state *alloc,
> > > + struct ttm_pool_tt_restore *restore)
> > > {
> > > - struct ttm_pool_alloc_state alloc;
> > > enum ttm_caching page_caching;
> > > gfp_t gfp_flags = GFP_USER;
> > > pgoff_t caching_divide;
> > > @@ -491,10 +696,8 @@ int ttm_pool_alloc(struct ttm_pool *pool,
> > > struct ttm_tt *tt,
> > > struct page *p;
> > > int r;
> > >
> > > - ttm_pool_alloc_state_init(tt, &alloc);
> > > -
> > > - WARN_ON(!alloc.remaining_pages ||
> > > ttm_tt_is_populated(tt));
> > > - WARN_ON(alloc.dma_addr && !pool->dev);
> > > + WARN_ON(!alloc->remaining_pages ||
> > > ttm_tt_is_populated(tt));
> > > + WARN_ON(alloc->dma_addr && !pool->dev);
> > >
> > > if (tt->page_flags & TTM_TT_FLAG_ZERO_ALLOC)
> > > gfp_flags |= __GFP_ZERO;
> > > @@ -509,9 +712,9 @@ int ttm_pool_alloc(struct ttm_pool *pool,
> > > struct ttm_tt *tt,
> > >
> > > page_caching = tt->caching;
> > > allow_pools = true;
> > > - for (order = ttm_pool_alloc_find_order(MAX_PAGE_ORDER,
> > > &alloc);
> > > - alloc.remaining_pages;
> > > - order = ttm_pool_alloc_find_order(order, &alloc)) {
> > > + for (order = ttm_pool_alloc_find_order(MAX_PAGE_ORDER,
> > > alloc);
> > > + alloc->remaining_pages;
> > > + order = ttm_pool_alloc_find_order(order, alloc)) {
> > > struct ttm_pool_type *pt;
> > >
> > > /* First, try to allocate a page from a pool if
> > > one exists. */
> > > @@ -541,30 +744,120 @@ int ttm_pool_alloc(struct ttm_pool *pool,
> > > struct ttm_tt *tt,
> > > r = -ENOMEM;
> > > goto error_free_all;
> > > }
> > > - r = ttm_pool_page_allocated(pool, order, p,
> > > page_caching, &alloc);
> > > + r = ttm_pool_page_allocated(pool, order, p,
> > > page_caching, alloc,
> > > + restore);
> > > if (r)
> > > goto error_free_page;
> > > +
> > > + if (ttm_pool_restore_valid(restore)) {
> > > + r = ttm_pool_restore_commit(restore, tt-
> > > > backup, ctx, alloc);
> > > + if (r)
> > > + goto error_free_all;
> > > + }
> > > }
> > >
> > > - r = ttm_pool_apply_caching(&alloc);
> > > + r = ttm_pool_apply_caching(alloc);
> > > if (r)
> > > goto error_free_all;
> > >
> > > + kfree(tt->restore);
> > > + tt->restore = NULL;
> > > +
> > > return 0;
> > >
> > > error_free_page:
> > > ttm_pool_free_page(pool, page_caching, order, p);
> > >
> > > error_free_all:
> > > - caching_divide = alloc.caching_divide - tt->pages;
> > > + if (tt->restore)
> > > + return r;
> > > +
> > > + caching_divide = alloc->caching_divide - tt->pages;
> > > ttm_pool_free_range(pool, tt, tt->caching, 0,
> > > caching_divide);
> > > ttm_pool_free_range(pool, tt, ttm_cached,
> > > caching_divide,
> > > - tt->num_pages -
> > > alloc.remaining_pages);
> > > + tt->num_pages - alloc-
> > > > remaining_pages);
> > >
> > > return r;
> > > }
> > > +
> > > +/**
> > > + * ttm_pool_alloc - Fill a ttm_tt object
> > > + *
> > > + * @pool: ttm_pool to use
> > > + * @tt: ttm_tt object to fill
> > > + * @ctx: operation context
> > > + *
> > > + * Fill the ttm_tt object with pages and also make sure to DMA
> > > map
> > > them when
> > > + * necessary.
> > > + *
> > > + * Returns: 0 on successe, negative error code otherwise.
> > > + */
> > > +int ttm_pool_alloc(struct ttm_pool *pool, struct ttm_tt *tt,
> > > + struct ttm_operation_ctx *ctx)
> > > +{
> > > + struct ttm_pool_alloc_state alloc;
> > > +
> > > + if (WARN_ON(ttm_tt_is_backed_up(tt)))
> > > + return -EINVAL;
> > > +
> > > + ttm_pool_alloc_state_init(tt, &alloc);
> > > +
> > > + return __ttm_pool_alloc(pool, tt, ctx, &alloc, NULL);
> > > +}
> > > EXPORT_SYMBOL(ttm_pool_alloc);
> > >
> > > +/**
> > > + * ttm_pool_restore_and_alloc - Fill a ttm_tt, restoring
> > > previously backed-up
> > > + * content.
> > > + *
> > > + * @pool: ttm_pool to use
> > > + * @tt: ttm_tt object to fill
> > > + * @ctx: operation context
> > > + *
> > > + * Fill the ttm_tt object with pages and also make sure to DMA
> > > map
> > > them when
> > > + * necessary. Read in backed-up content.
> > > + *
> > > + * Returns: 0 on successe, negative error code otherwise.
> > > + */
> > > +int ttm_pool_restore_and_alloc(struct ttm_pool *pool, struct
> > > ttm_tt *tt,
> > > + const struct ttm_operation_ctx
> > > *ctx)
> > > +{
> > > + struct ttm_pool_alloc_state alloc;
> > > +
> > > + if (WARN_ON(!ttm_tt_is_backed_up(tt)))
> > > + return -EINVAL;
> > > +
> > > + if (!tt->restore) {
> > > + gfp_t gfp = GFP_KERNEL | __GFP_NOWARN;
> > > +
> > > + ttm_pool_alloc_state_init(tt, &alloc);
> > > + if (ctx->gfp_retry_mayfail)
> > > + gfp |= __GFP_RETRY_MAYFAIL;
> > > +
> > > + tt->restore = kzalloc(sizeof(*tt->restore),
> > > gfp);
> > > + if (!tt->restore)
> > > + return -ENOMEM;
> > > +
> > > + tt->restore->snapshot_alloc = alloc;
> > > + tt->restore->pool = pool;
> > > + tt->restore->restored_pages = 1;
> > > + } else {
> > > + struct ttm_pool_tt_restore *restore = tt-
> > > >restore;
> > > + int ret;
> > > +
> > > + alloc = restore->snapshot_alloc;
> > > + if (ttm_pool_restore_valid(tt->restore)) {
> > > + ret = ttm_pool_restore_commit(restore,
> > > tt-
> > > > backup, ctx, &alloc);
> > > + if (ret)
> > > + return ret;
> > > + }
> > > + if (!alloc.remaining_pages)
> > > + return 0;
> > > + }
> > > +
> > > + return __ttm_pool_alloc(pool, tt, ctx, &alloc, tt-
> > > > restore);
> > > +}
> > > +
> > > /**
> > > * ttm_pool_free - Free the backing pages from a ttm_tt object
> > > *
> > > @@ -582,6 +875,163 @@ void ttm_pool_free(struct ttm_pool *pool,
> > > struct ttm_tt *tt)
> > > }
> > > EXPORT_SYMBOL(ttm_pool_free);
> > >
> > > +/**
> > > + * ttm_pool_drop_backed_up() - Release content of a swapped-out
> > > struct ttm_tt
> > > + * @tt: The struct ttm_tt.
> > > + *
> > > + * Release handles with associated content or any remaining
> > > pages
> > > of
> > > + * a backed-up struct ttm_tt.
> > > + */
> > > +void ttm_pool_drop_backed_up(struct ttm_tt *tt)
> > > +{
> > > + struct ttm_pool_tt_restore *restore;
> > > + pgoff_t start_page = 0;
> > > +
> > > + WARN_ON(!ttm_tt_is_backed_up(tt));
> > > +
> > > + restore = tt->restore;
> > > +
> > > + /*
> > > + * Unmap and free any uncommitted restore page.
> > > + * any tt page-array backup entries already read back
> > > has
> > > + * been cleared already
> > > + */
> > > + if (ttm_pool_restore_valid(restore)) {
> > > + dma_addr_t *dma_addr = tt->dma_address ?
> > > &restore-
> > > > first_dma : NULL;
> > > +
> > > + ttm_pool_unmap_and_free(restore->pool, restore-
> > > > alloced_page,
> > > + dma_addr, restore-
> > > > page_caching);
> > > + restore->restored_pages = 1UL << restore->order;
> > > + }
> > > +
> > > + /*
> > > + * If a restore is ongoing, part of the tt pages may
> > > have
> > > a
> > > + * caching different than writeback.
> > > + */
> > > + if (restore) {
> > > + pgoff_t mid = restore-
> > > > snapshot_alloc.caching_divide - tt->pages;
> > > +
> > > + start_page = restore->alloced_pages;
> > > + WARN_ON(mid > start_page);
> > > + /* Pages that might be dma-mapped and non-cached
> > > */
> > > + ttm_pool_free_range(restore->pool, tt, tt-
> > > > caching,
> > > + 0, mid);
> > > + /* Pages that might be dma-mapped but cached */
> > > + ttm_pool_free_range(restore->pool, tt,
> > > ttm_cached,
> > > + mid, restore-
> > > >alloced_pages);
> > > + kfree(restore);
> > > + tt->restore = NULL;
> > > + }
> > > +
> > > + ttm_pool_free_range(NULL, tt, ttm_cached, start_page,
> > > tt-
> > > > num_pages);
> > > +}
> > > +
> > > +/**
> > > + * ttm_pool_backup() - Back up or purge a struct ttm_tt
> > > + * @pool: The pool used when allocating the struct ttm_tt.
> > > + * @tt: The struct ttm_tt.
> > > + * @flags: Flags to govern the backup behaviour.
> > > + *
> > > + * Back up or purge a struct ttm_tt. If @purge is true, then
> > > + * all pages will be freed directly to the system rather than to
> > > the pool
> > > + * they were allocated from, making the function behave
> > > similarly
> > > to
> > > + * ttm_pool_free(). If @purge is false the pages will be backed
> > > up
> > > instead,
> > > + * exchanged for handles.
> > > + * A subsequent call to ttm_pool_restore_and_alloc() will then
> > > read back the content and
> > > + * a subsequent call to ttm_pool_drop_backed_up() will drop it.
> > > + * If backup of a page fails for whatever reason, @ttm will
> > > still
> > > be
> > > + * partially backed up, retaining those pages for which backup
> > > fails.
> > > + * In that case, this function can be retried, possibly after
> > > freeing up
> > > + * memory resources.
> > > + *
> > > + * Return: Number of pages actually backed up or freed, or
> > > negative
> > > + * error code on error.
> > > + */
> > > +long ttm_pool_backup(struct ttm_pool *pool, struct ttm_tt *tt,
> > > + const struct ttm_backup_flags *flags)
> > > +{
> > > + struct ttm_backup *backup = tt->backup;
> > > + struct page *page;
> > > + unsigned long handle;
> > > + gfp_t alloc_gfp;
> > > + gfp_t gfp;
> > > + int ret = 0;
> > > + pgoff_t shrunken = 0;
> > > + pgoff_t i, num_pages;
> > > +
> > > + if (WARN_ON(ttm_tt_is_backed_up(tt)))
> > > + return -EINVAL;
> > > +
> > > + if ((!ttm_backup_bytes_avail() && !flags->purge) ||
> > > + pool->use_dma_alloc || ttm_tt_is_backed_up(tt))
> > > + return -EBUSY;
> > > +
> > > +#ifdef CONFIG_X86
> > > + /* Anything returned to the system needs to be cached.
> > > */
> > > + if (tt->caching != ttm_cached)
> > > + set_pages_array_wb(tt->pages, tt->num_pages);
> > > +#endif
> > > +
> > > + if (tt->dma_address || flags->purge) {
> > > + for (i = 0; i < tt->num_pages; i += num_pages) {
> > > + unsigned int order;
> > > +
> > > + page = tt->pages[i];
> > > + if (unlikely(!page)) {
> > > + num_pages = 1;
> > > + continue;
> > > + }
> > > +
> > > + order = ttm_pool_page_order(pool, page);
> > > + num_pages = 1UL << order;
> > > + if (tt->dma_address)
> > > + ttm_pool_unmap(pool, tt-
> > > > dma_address[i],
> > > + num_pages);
> > > + if (flags->purge) {
> > > + shrunken += num_pages;
> > > + page->private = 0;
> > > + __free_pages(page, order);
> > > + memset(tt->pages + i, 0,
> > > + num_pages * sizeof(*tt-
> > > > pages));
> > > + }
> > > + }
> > > + }
> > > +
> > > + if (flags->purge)
> > > + return shrunken;
> > > +
> > > + if (pool->use_dma32)
> > > + gfp = GFP_DMA32;
> > > + else
> > > + gfp = GFP_HIGHUSER;
> > > +
> > > + alloc_gfp = GFP_KERNEL | __GFP_HIGH | __GFP_NOWARN |
> > > __GFP_RETRY_MAYFAIL;
> > > +
> > > + for (i = 0; i < tt->num_pages; ++i) {
> > > + s64 shandle;
> > > +
> > > + page = tt->pages[i];
> > > + if (unlikely(!page))
> > > + continue;
> > > +
> > > + ttm_pool_split_for_swap(pool, page);
> > > +
> > > + shandle = ttm_backup_backup_page(backup, page,
> > > flags->writeback, i,
> > > + gfp,
> > > alloc_gfp);
> > > + if (shandle < 0) {
> > > + /* We allow partially shrunken tts */
> > > + ret = shandle;
> > > + break;
> > > + }
> > > + handle = shandle;
> > > + tt->pages[i] =
> > > ttm_backup_handle_to_page_ptr(handle);
> > > + put_page(page);
> > > + shrunken++;
> > > + }
> > > +
> > > + return shrunken ? shrunken : ret;
> > > +}
> > > +
> > > /**
> > > * ttm_pool_init - Initialize a pool
> > > *
> > > diff --git a/drivers/gpu/drm/ttm/ttm_tt.c
> > > b/drivers/gpu/drm/ttm/ttm_tt.c
> > > index 3baf215eca23..00b7c28f2329 100644
> > > --- a/drivers/gpu/drm/ttm/ttm_tt.c
> > > +++ b/drivers/gpu/drm/ttm/ttm_tt.c
> > > @@ -40,6 +40,7 @@
> > > #include <drm/drm_cache.h>
> > > #include <drm/drm_device.h>
> > > #include <drm/drm_util.h>
> > > +#include <drm/ttm/ttm_backup.h>
> > > #include <drm/ttm/ttm_bo.h>
> > > #include <drm/ttm/ttm_tt.h>
> > >
> > > @@ -158,6 +159,8 @@ static void ttm_tt_init_fields(struct ttm_tt
> > > *ttm,
> > > ttm->swap_storage = NULL;
> > > ttm->sg = bo->sg;
> > > ttm->caching = caching;
> > > + ttm->restore = NULL;
> > > + ttm->backup = NULL;
> > > }
> > >
> > > int ttm_tt_init(struct ttm_tt *ttm, struct ttm_buffer_object
> > > *bo,
> > > @@ -182,6 +185,13 @@ void ttm_tt_fini(struct ttm_tt *ttm)
> > > fput(ttm->swap_storage);
> > > ttm->swap_storage = NULL;
> > >
> > > + if (ttm_tt_is_backed_up(ttm))
> > > + ttm_pool_drop_backed_up(ttm);
> > > + if (ttm->backup) {
> > > + ttm_backup_fini(ttm->backup);
> > > + ttm->backup = NULL;
> > > + }
> > > +
> > > if (ttm->pages)
> > > kvfree(ttm->pages);
> > > else
> > > @@ -253,6 +263,49 @@ int ttm_tt_swapin(struct ttm_tt *ttm)
> > > }
> > > EXPORT_SYMBOL_FOR_TESTS_ONLY(ttm_tt_swapin);
> > >
> > > +/**
> > > + * ttm_tt_backup() - Helper to back up a struct ttm_tt.
> > > + * @bdev: The TTM device.
> > > + * @tt: The struct ttm_tt.
> > > + * @flags: Flags that govern the backup behaviour.
> > > + *
> > > + * Update the page accounting and call ttm_pool_shrink_tt to
> > > free
> > > pages
> > > + * or back them up.
> > > + *
> > > + * Return: Number of pages freed or swapped out, or negative
> > > error
> > > code on
> > > + * error.
> > > + */
> > > +long ttm_tt_backup(struct ttm_device *bdev, struct ttm_tt *tt,
> > > + const struct ttm_backup_flags flags)
> > > +{
> > > + long ret;
> > > +
> > > + if (WARN_ON(IS_ERR_OR_NULL(tt->backup)))
> > > + return 0;
> > > +
> > > + ret = ttm_pool_backup(&bdev->pool, tt, &flags);
> > > + if (ret > 0) {
> > > + tt->page_flags &= ~TTM_TT_FLAG_PRIV_POPULATED;
> > > + tt->page_flags |= TTM_TT_FLAG_BACKED_UP;
> > > + }
> > > +
> > > + return ret;
> > > +}
> > > +
> > > +int ttm_tt_restore(struct ttm_device *bdev, struct ttm_tt *tt,
> > > + const struct ttm_operation_ctx *ctx)
> > > +{
> > > + int ret = ttm_pool_restore_and_alloc(&bdev->pool, tt,
> > > ctx);
> > > +
> > > + if (ret)
> > > + return ret;
> > > +
> > > + tt->page_flags &= ~TTM_TT_FLAG_BACKED_UP;
> > > +
> > > + return 0;
> > > +}
> > > +EXPORT_SYMBOL(ttm_tt_restore);
> > > +
> > > /**
> > > * ttm_tt_swapout - swap out tt object
> > > *
> > > @@ -348,6 +401,7 @@ int ttm_tt_populate(struct ttm_device *bdev,
> > > goto error;
> > >
> > > ttm->page_flags |= TTM_TT_FLAG_PRIV_POPULATED;
> > > + ttm->page_flags &= ~TTM_TT_FLAG_BACKED_UP;
> > > if (unlikely(ttm->page_flags & TTM_TT_FLAG_SWAPPED)) {
> > > ret = ttm_tt_swapin(ttm);
> > > if (unlikely(ret != 0)) {
> > > diff --git a/include/drm/ttm/ttm_pool.h
> > > b/include/drm/ttm/ttm_pool.h
> > > index 160d954a261e..54cd34a6e4c0 100644
> > > --- a/include/drm/ttm/ttm_pool.h
> > > +++ b/include/drm/ttm/ttm_pool.h
> > > @@ -33,6 +33,7 @@
> > >
> > > struct device;
> > > struct seq_file;
> > > +struct ttm_backup_flags;
> > > struct ttm_operation_ctx;
> > > struct ttm_pool;
> > > struct ttm_tt;
> > > @@ -89,6 +90,13 @@ void ttm_pool_fini(struct ttm_pool *pool);
> > >
> > > int ttm_pool_debugfs(struct ttm_pool *pool, struct seq_file
> > > *m);
> > >
> > > +void ttm_pool_drop_backed_up(struct ttm_tt *tt);
> > > +
> > > +long ttm_pool_backup(struct ttm_pool *pool, struct ttm_tt *ttm,
> > > + const struct ttm_backup_flags *flags);
> > > +int ttm_pool_restore_and_alloc(struct ttm_pool *pool, struct
> > > ttm_tt *tt,
> > > + const struct ttm_operation_ctx
> > > *ctx);
> > > +
> > > int ttm_pool_mgr_init(unsigned long num_pages);
> > > void ttm_pool_mgr_fini(void);
> > >
> > > diff --git a/include/drm/ttm/ttm_tt.h b/include/drm/ttm/ttm_tt.h
> > > index 991edafdb2dd..c736c01ac2ca 100644
> > > --- a/include/drm/ttm/ttm_tt.h
> > > +++ b/include/drm/ttm/ttm_tt.h
> > > @@ -32,11 +32,13 @@
> > > #include <drm/ttm/ttm_caching.h>
> > > #include <drm/ttm/ttm_kmap_iter.h>
> > >
> > > +struct ttm_backup;
> > > struct ttm_device;
> > > struct ttm_tt;
> > > struct ttm_resource;
> > > struct ttm_buffer_object;
> > > struct ttm_operation_ctx;
> > > +struct ttm_pool_tt_restore;
> > >
> > > /**
> > > * struct ttm_tt - This is a structure holding the pages,
> > > caching- and aperture
> > > @@ -85,17 +87,22 @@ struct ttm_tt {
> > > * fault handling abuses the DMA api a bit and
> > > dma_map_attrs can't be
> > > * used to assure pgprot always matches.
> > > *
> > > + * TTM_TT_FLAG_BACKED_UP: TTM internal only. This is set
> > > if the
> > > + * struct ttm_tt has been (possibly partially) backed
> > > up.
> > > + *
> > > * TTM_TT_FLAG_PRIV_POPULATED: TTM internal only. DO NOT
> > > USE. This is
> > > * set by TTM after ttm_tt_populate() has successfully
> > > returned, and is
> > > * then unset when TTM calls ttm_tt_unpopulate().
> > > + *
> > > */
> > > #define TTM_TT_FLAG_SWAPPED BIT(0)
> > > #define TTM_TT_FLAG_ZERO_ALLOC BIT(1)
> > > #define TTM_TT_FLAG_EXTERNAL BIT(2)
> > > #define TTM_TT_FLAG_EXTERNAL_MAPPABLE BIT(3)
> > > #define TTM_TT_FLAG_DECRYPTED BIT(4)
> > > +#define TTM_TT_FLAG_BACKED_UP BIT(5)
> > >
> > > -#define TTM_TT_FLAG_PRIV_POPULATED BIT(5)
> > > +#define TTM_TT_FLAG_PRIV_POPULATED BIT(6)
> > > uint32_t page_flags;
> > > /** @num_pages: Number of pages in the page array. */
> > > uint32_t num_pages;
> > > @@ -105,11 +112,20 @@ struct ttm_tt {
> > > dma_addr_t *dma_address;
> > > /** @swap_storage: Pointer to shmem struct file for swap
> > > storage. */
> > > struct file *swap_storage;
> > > + /**
> > > + * @backup: Pointer to backup struct for backed up tts.
> > > + * Could be unified with @swap_storage. Meanwhile, the
> > > driver's
> > > + * ttm_tt_create() callback is responsible for assigning
> > > + * this field.
> > > + */
> > > + struct ttm_backup *backup;
> > > /**
> > > * @caching: The current caching state of the pages, see
> > > enum
> > > * ttm_caching.
> > > */
> > > enum ttm_caching caching;
> > > + /** @restore: Partial restoration from backup state. TTM
> > > private */
> > > + struct ttm_pool_tt_restore *restore;
> > > };
> > >
> > > /**
> > > @@ -129,9 +145,38 @@ static inline bool
> > > ttm_tt_is_populated(struct
> > > ttm_tt *tt)
> > > return tt->page_flags & TTM_TT_FLAG_PRIV_POPULATED;
> > > }
> > >
> > > +/**
> > > + * ttm_tt_is_swapped() - Whether the ttm_tt is swapped out or
> > > backed up
> > > + * @tt: The struct ttm_tt.
> > > + *
> > > + * Return: true if swapped or backed up, false otherwise.
> > > + */
> > > static inline bool ttm_tt_is_swapped(const struct ttm_tt *tt)
> > > {
> > > - return tt->page_flags & TTM_TT_FLAG_SWAPPED;
> > > + return tt->page_flags & (TTM_TT_FLAG_SWAPPED |
> > > TTM_TT_FLAG_BACKED_UP);
> > > +}
> > > +
> > > +/**
> > > + * ttm_tt_is_backed_up() - Whether the ttm_tt backed up
> > > + * @tt: The struct ttm_tt.
> > > + *
> > > + * Return: true if swapped or backed up, false otherwise.
> > > + */
> > > +static inline bool ttm_tt_is_backed_up(const struct ttm_tt *tt)
> > > +{
> > > + return tt->page_flags & TTM_TT_FLAG_BACKED_UP;
> > > +}
> > > +
> > > +/**
> > > + * ttm_tt_clear_backed_up() - Clear the ttm_tt backed-up status
> > > + * @tt: The struct ttm_tt.
> > > + *
> > > + * Drivers can use this functionto clear the backed-up status,
> > > + * for example before destroying or re-validating a purged tt.
> > > + */
> > > +static inline void ttm_tt_clear_backed_up(struct ttm_tt *tt)
> > > +{
> > > + tt->page_flags &= ~TTM_TT_FLAG_BACKED_UP;
> > > }
> > >
> > > /**
> > > @@ -235,6 +280,24 @@ void ttm_tt_mgr_init(unsigned long
> > > num_pages,
> > > unsigned long num_dma32_pages);
> > > struct ttm_kmap_iter *ttm_kmap_iter_tt_init(struct
> > > ttm_kmap_iter_tt *iter_tt,
> > > struct ttm_tt *tt);
> > > unsigned long ttm_tt_pages_limit(void);
> > > +
> > > +/**
> > > + * struct ttm_backup_flags - Flags to govern backup behaviour.
> > > + * @purge: Free pages without backing up. Bypass pools.
> > > + * @writeback: Attempt to copy contents directly to swap space,
> > > even
> > > + * if that means blocking on writes to external memory.
> > > + */
> > > +struct ttm_backup_flags {
> > > + u32 purge : 1;
> > > + u32 writeback : 1;
> > > +};
> > > +
> > > +long ttm_tt_backup(struct ttm_device *bdev, struct ttm_tt *tt,
> > > + const struct ttm_backup_flags flags);
> > > +
> > > +int ttm_tt_restore(struct ttm_device *bdev, struct ttm_tt *tt,
> > > + const struct ttm_operation_ctx *ctx);
> > > +
> > > #if IS_ENABLED(CONFIG_AGP)
> > > #include <linux/agp_backend.h>
> > >
> >
>
^ permalink raw reply [flat|nested] 26+ messages in thread* Re: RESEND Re: [PATCH v16 2/7] drm/ttm/pool, drm/ttm/tt: Provide a helper to shrink pages
2025-02-25 8:26 ` RESEND " Thomas Hellström
@ 2025-03-05 3:01 ` Dave Airlie
2025-03-05 9:10 ` Christian König
2025-03-06 10:00 ` Thomas Hellström
0 siblings, 2 replies; 26+ messages in thread
From: Dave Airlie @ 2025-03-05 3:01 UTC (permalink / raw)
To: Thomas Hellström
Cc: Christian König, intel-xe, Somalapuram Amaranath,
Matthew Brost, dri-devel
I've looked over the two patches mentioned here, I think they have
seen enough time and we need to unblock,
Please add and merge them:
Acked-by: Dave Airlie <airlied@redhat.com>
Dave.
On Tue, 25 Feb 2025 at 18:44, Thomas Hellström
<thomas.hellstrom@linux.intel.com> wrote:
>
> Hi, Christian,
>
> Ping? I'd really want to get this in before -rc6
>
> Thanks,
> Thomas
>
>
>
> On Tue, 2025-02-18 at 16:40 +0100, Thomas Hellström wrote:
> > Hi, Christian,
> >
> > On Wed, 2025-02-05 at 15:02 +0100, Christian König wrote:
> > > Am 30.01.25 um 11:13 schrieb Thomas Hellström:
> > > > Provide a helper to shrink ttm_tt page-vectors on a per-page
> > > > basis. A ttm_backup backend could then in theory get away with
> > > > allocating a single temporary page for each struct ttm_tt.
> > > >
> > > > This is accomplished by splitting larger pages before trying to
> > > > back them up.
> > > >
> > > > In the future we could allow ttm_backup to handle backing up
> > > > large pages as well, but currently there's no benefit in
> > > > doing that, since the shmem backup backend would have to
> > > > split those anyway to avoid allocating too much temporary
> > > > memory, and if the backend instead inserts pages into the
> > > > swap-cache, those are split on reclaim by the core.
> > > >
> > > > Due to potential backup- and recover errors, allow partially
> > > > swapped
> > > > out struct ttm_tt's, although mark them as swapped out stopping
> > > > them
> > > > from being swapped out a second time. More details in the
> > > > ttm_pool.c
> > > > DOC section.
> > > >
> > > > v2:
> > > > - A couple of cleanups and error fixes in ttm_pool_back_up_tt.
> > > > - s/back_up/backup/
> > > > - Add a writeback parameter to the exported interface.
> > > > v8:
> > > > - Use a struct for flags for readability (Matt Brost)
> > > > - Address misc other review comments (Matt Brost)
> > > > v9:
> > > > - Update the kerneldoc for the ttm_tt::backup field.
> > > > v10:
> > > > - Rebase.
> > > > v13:
> > > > - Rebase on ttm_backup interface change. Update kerneldoc.
> > > > - Rebase and adjust ttm_tt_is_swapped().
> > > > v15:
> > > > - Rebase on ttm_backup return value change.
> > > > - Rebase on previous restructuring of ttm_pool_alloc()
> > > > - Rework the ttm_pool backup interface (Christian König)
> > > > - Remove cond_resched() (Christian König)
> > > > - Get rid of the need to allocate an intermediate page array
> > > > when restoring a multi-order page (Christian König)
> > > > - Update documentation.
> > > >
> > > > Cc: Christian König <christian.koenig@amd.com>
> > > > Cc: Somalapuram Amaranath <Amaranath.Somalapuram@amd.com>
> > > > Cc: Matthew Brost <matthew.brost@intel.com>
> > > > Cc: <dri-devel@lists.freedesktop.org>
> > > > Signed-off-by: Thomas Hellström
> > > > <thomas.hellstrom@linux.intel.com>
> > > > Reviewed-by: Matthew Brost <matthew.brost@intel.com>
> > >
> > > I've tried to wrap my head around all of this like twenty times in
> > > the
> > > last three month, but was always interrupted at some point.
> > >
> > > Feel free to add Acked-by: Christian Koenig
> > > <christian.koenig@amd.com>.
> > >
> > > Sorry,
> > > Christian.
> >
> > Thanks a lot for all reviewing and comments so far. There are two TTM
> > patches left in the series that don't have an ack by you:
> >
> > https://patchwork.freedesktop.org/patch/634715/?series=131815&rev=17
> > and
> >
> > https://patchwork.freedesktop.org/patch/634716/?series=131815&rev=17
> >
> > None of them particularly big considering the amount of doc text.
> >
> > It'd be great if those could have an ack as well so we could finally
> > merge this series.
> >
> > Thanks,
> > Thomas
> >
> >
> >
> >
> >
> >
> > >
> > > > ---
> > > > drivers/gpu/drm/ttm/ttm_pool.c | 554
> > > > +++++++++++++++++++++++++++++----
> > > > drivers/gpu/drm/ttm/ttm_tt.c | 54 ++++
> > > > include/drm/ttm/ttm_pool.h | 8 +
> > > > include/drm/ttm/ttm_tt.h | 67 +++-
> > > > 4 files changed, 629 insertions(+), 54 deletions(-)
> > > >
> > > > diff --git a/drivers/gpu/drm/ttm/ttm_pool.c
> > > > b/drivers/gpu/drm/ttm/ttm_pool.c
> > > > index c9eba76d5143..ffb7abf52bab 100644
> > > > --- a/drivers/gpu/drm/ttm/ttm_pool.c
> > > > +++ b/drivers/gpu/drm/ttm/ttm_pool.c
> > > > @@ -41,6 +41,7 @@
> > > > #include <asm/set_memory.h>
> > > > #endif
> > > >
> > > > +#include <drm/ttm/ttm_backup.h>
> > > > #include <drm/ttm/ttm_pool.h>
> > > > #include <drm/ttm/ttm_tt.h>
> > > > #include <drm/ttm/ttm_bo.h>
> > > > @@ -75,6 +76,35 @@ struct ttm_pool_alloc_state {
> > > > enum ttm_caching tt_caching;
> > > > };
> > > >
> > > > +/**
> > > > + * struct ttm_pool_tt_restore - State representing restore from
> > > > backup
> > > > + * @pool: The pool used for page allocation while restoring.
> > > > + * @snapshot_alloc: A snapshot of the most recent struct
> > > > ttm_pool_alloc_state.
> > > > + * @alloced_page: Pointer to the page most recently allocated
> > > > from
> > > > a pool or system.
> > > > + * @first_dma: The dma address corresponding to @alloced_page if
> > > > dma_mapping
> > > > + * is requested.
> > > > + * @alloced_pages: The number of allocated pages present in the
> > > > struct ttm_tt
> > > > + * page vector from this restore session.
> > > > + * @restored_pages: The number of 4K pages restored for
> > > > @alloced_page (which
> > > > + * is typically a multi-order page).
> > > > + * @page_caching: The struct ttm_tt requested caching
> > > > + * @order: The order of @alloced_page.
> > > > + *
> > > > + * Recovery from backup might fail when we've recovered less
> > > > than
> > > > the
> > > > + * full ttm_tt. In order not to loose any data (yet), keep
> > > > information
> > > > + * around that allows us to restart a failed ttm backup
> > > > recovery.
> > > > + */
> > > > +struct ttm_pool_tt_restore {
> > > > + struct ttm_pool *pool;
> > > > + struct ttm_pool_alloc_state snapshot_alloc;
> > > > + struct page *alloced_page;
> > > > + dma_addr_t first_dma;
> > > > + pgoff_t alloced_pages;
> > > > + pgoff_t restored_pages;
> > > > + enum ttm_caching page_caching;
> > > > + unsigned int order;
> > > > +};
> > > > +
> > > > static unsigned long page_pool_size;
> > > >
> > > > MODULE_PARM_DESC(page_pool_size, "Number of pages in the
> > > > WC/UC/DMA pool");
> > > > @@ -199,12 +229,11 @@ static int ttm_pool_apply_caching(struct
> > > > ttm_pool_alloc_state *alloc)
> > > > return 0;
> > > > }
> > > >
> > > > -/* Map pages of 1 << order size and fill the DMA address array
> > > > */
> > > > +/* DMA Map pages of 1 << order size and return the resulting
> > > > dma_address. */
> > > > static int ttm_pool_map(struct ttm_pool *pool, unsigned int
> > > > order,
> > > > - struct page *p, dma_addr_t **dma_addr)
> > > > + struct page *p, dma_addr_t *dma_addr)
> > > > {
> > > > dma_addr_t addr;
> > > > - unsigned int i;
> > > >
> > > > if (pool->use_dma_alloc) {
> > > > struct ttm_pool_dma *dma = (void *)p->private;
> > > > @@ -218,10 +247,7 @@ static int ttm_pool_map(struct ttm_pool
> > > > *pool,
> > > > unsigned int order,
> > > > return -EFAULT;
> > > > }
> > > >
> > > > - for (i = 1 << order; i ; --i) {
> > > > - *(*dma_addr)++ = addr;
> > > > - addr += PAGE_SIZE;
> > > > - }
> > > > + *dma_addr = addr;
> > > >
> > > > return 0;
> > > > }
> > > > @@ -371,6 +397,190 @@ static unsigned int
> > > > ttm_pool_page_order(struct ttm_pool *pool, struct page *p)
> > > > return p->private;
> > > > }
> > > >
> > > > +/*
> > > > + * Split larger pages so that we can free each PAGE_SIZE page as
> > > > soon
> > > > + * as it has been backed up, in order to avoid memory pressure
> > > > during
> > > > + * reclaim.
> > > > + */
> > > > +static void ttm_pool_split_for_swap(struct ttm_pool *pool,
> > > > struct
> > > > page *p)
> > > > +{
> > > > + unsigned int order = ttm_pool_page_order(pool, p);
> > > > + pgoff_t nr;
> > > > +
> > > > + if (!order)
> > > > + return;
> > > > +
> > > > + split_page(p, order);
> > > > + nr = 1UL << order;
> > > > + while (nr--)
> > > > + (p++)->private = 0;
> > > > +}
> > > > +
> > > > +/**
> > > > + * DOC: Partial backup and restoration of a struct ttm_tt.
> > > > + *
> > > > + * Swapout using ttm_backup_backup_page() and swapin using
> > > > + * ttm_backup_copy_page() may fail.
> > > > + * The former most likely due to lack of swap-space or memory,
> > > > the
> > > > latter due
> > > > + * to lack of memory or because of signal interruption during
> > > > waits.
> > > > + *
> > > > + * Backup failure is easily handled by using a ttm_tt pages
> > > > vector
> > > > that holds
> > > > + * both backup handles and page pointers. This has to be taken
> > > > into account when
> > > > + * restoring such a ttm_tt from backup, and when freeing it
> > > > while
> > > > backed up.
> > > > + * When restoring, for simplicity, new pages are actually
> > > > allocated from the
> > > > + * pool and the contents of any old pages are copied in and then
> > > > the old pages
> > > > + * are released.
> > > > + *
> > > > + * For restoration failures, the struct ttm_pool_tt_restore
> > > > holds
> > > > sufficient state
> > > > + * to be able to resume an interrupted restore, and that
> > > > structure
> > > > is freed once
> > > > + * the restoration is complete. If the struct ttm_tt is
> > > > destroyed
> > > > while there
> > > > + * is a valid struct ttm_pool_tt_restore attached, that is also
> > > > properly taken
> > > > + * care of.
> > > > + */
> > > > +
> > > > +/* Is restore ongoing for the currently allocated page? */
> > > > +static bool ttm_pool_restore_valid(const struct
> > > > ttm_pool_tt_restore *restore)
> > > > +{
> > > > + return restore && restore->restored_pages < (1 <<
> > > > restore-
> > > > > order);
> > > > +}
> > > > +
> > > > +/* DMA unmap and free a multi-order page, either to the relevant
> > > > pool or to system. */
> > > > +static pgoff_t ttm_pool_unmap_and_free(struct ttm_pool *pool,
> > > > struct page *page,
> > > > + const dma_addr_t
> > > > *dma_addr,
> > > > enum ttm_caching caching)
> > > > +{
> > > > + struct ttm_pool_type *pt = NULL;
> > > > + unsigned int order;
> > > > + pgoff_t nr;
> > > > +
> > > > + if (pool) {
> > > > + order = ttm_pool_page_order(pool, page);
> > > > + nr = (1UL << order);
> > > > + if (dma_addr)
> > > > + ttm_pool_unmap(pool, *dma_addr, nr);
> > > > +
> > > > + pt = ttm_pool_select_type(pool, caching, order);
> > > > + } else {
> > > > + order = page->private;
> > > > + nr = (1UL << order);
> > > > + }
> > > > +
> > > > + if (pt)
> > > > + ttm_pool_type_give(pt, page);
> > > > + else
> > > > + ttm_pool_free_page(pool, caching, order, page);
> > > > +
> > > > + return nr;
> > > > +}
> > > > +
> > > > +/* Populate the page-array using the most recent allocated
> > > > multi-
> > > > order page. */
> > > > +static void ttm_pool_allocated_page_commit(struct page
> > > > *allocated,
> > > > + dma_addr_t first_dma,
> > > > + struct
> > > > ttm_pool_alloc_state *alloc,
> > > > + pgoff_t nr)
> > > > +{
> > > > + pgoff_t i;
> > > > +
> > > > + for (i = 0; i < nr; ++i)
> > > > + *alloc->pages++ = allocated++;
> > > > +
> > > > + alloc->remaining_pages -= nr;
> > > > +
> > > > + if (!alloc->dma_addr)
> > > > + return;
> > > > +
> > > > + for (i = 0; i < nr; ++i) {
> > > > + *alloc->dma_addr++ = first_dma;
> > > > + first_dma += PAGE_SIZE;
> > > > + }
> > > > +}
> > > > +
> > > > +/*
> > > > + * When restoring, restore backed-up content to the newly
> > > > allocated page and
> > > > + * if successful, populate the page-table and dma-address
> > > > arrays.
> > > > + */
> > > > +static int ttm_pool_restore_commit(struct ttm_pool_tt_restore
> > > > *restore,
> > > > + struct ttm_backup *backup,
> > > > + const struct
> > > > ttm_operation_ctx
> > > > *ctx,
> > > > + struct ttm_pool_alloc_state
> > > > *alloc)
> > > > +
> > > > +{
> > > > + pgoff_t i, nr = 1UL << restore->order;
> > > > + struct page **first_page = alloc->pages;
> > > > + struct page *p;
> > > > + int ret = 0;
> > > > +
> > > > + for (i = restore->restored_pages; i < nr; ++i) {
> > > > + p = first_page[i];
> > > > + if (ttm_backup_page_ptr_is_handle(p)) {
> > > > + unsigned long handle =
> > > > ttm_backup_page_ptr_to_handle(p);
> > > > +
> > > > + if (handle == 0) {
> > > > + restore->restored_pages++;
> > > > + continue;
> > > > + }
> > > > +
> > > > + ret = ttm_backup_copy_page(backup,
> > > > restore->alloced_page + i,
> > > > + handle, ctx-
> > > > > interruptible);
> > > > + if (ret)
> > > > + break;
> > > > +
> > > > + ttm_backup_drop(backup, handle);
> > > > + } else if (p) {
> > > > + /*
> > > > + * We could probably avoid splitting the
> > > > old page
> > > > + * using clever logic, but ATM we don't
> > > > care, as
> > > > + * we prioritize releasing memory ASAP.
> > > > Note that
> > > > + * here, the old retained page is always
> > > > write-back
> > > > + * cached.
> > > > + */
> > > > + ttm_pool_split_for_swap(restore->pool,
> > > > p);
> > > > + copy_highpage(restore->alloced_page + i,
> > > > p);
> > > > + __free_pages(p, 0);
> > > > + }
> > > > +
> > > > + restore->restored_pages++;
> > > > + first_page[i] =
> > > > ttm_backup_handle_to_page_ptr(0);
> > > > + }
> > > > +
> > > > + if (ret) {
> > > > + if (!restore->restored_pages) {
> > > > + dma_addr_t *dma_addr = alloc->dma_addr ?
> > > > &restore->first_dma : NULL;
> > > > +
> > > > + ttm_pool_unmap_and_free(restore->pool,
> > > > restore->alloced_page,
> > > > + dma_addr,
> > > > restore-
> > > > > page_caching);
> > > > + restore->restored_pages = nr;
> > > > + }
> > > > + return ret;
> > > > + }
> > > > +
> > > > + ttm_pool_allocated_page_commit(restore->alloced_page,
> > > > restore->first_dma,
> > > > + alloc, nr);
> > > > + if (restore->page_caching == alloc->tt_caching ||
> > > > PageHighMem(restore->alloced_page))
> > > > + alloc->caching_divide = alloc->pages;
> > > > + restore->snapshot_alloc = *alloc;
> > > > + restore->alloced_pages += nr;
> > > > +
> > > > + return 0;
> > > > +}
> > > > +
> > > > +/* If restoring, save information needed for
> > > > ttm_pool_restore_commit(). */
> > > > +static void
> > > > +ttm_pool_page_allocated_restore(struct ttm_pool *pool, unsigned
> > > > int order,
> > > > + struct page *p,
> > > > + enum ttm_caching page_caching,
> > > > + dma_addr_t first_dma,
> > > > + struct ttm_pool_tt_restore
> > > > *restore,
> > > > + const struct
> > > > ttm_pool_alloc_state
> > > > *alloc)
> > > > +{
> > > > + restore->pool = pool;
> > > > + restore->order = order;
> > > > + restore->restored_pages = 0;
> > > > + restore->page_caching = page_caching;
> > > > + restore->first_dma = first_dma;
> > > > + restore->alloced_page = p;
> > > > + restore->snapshot_alloc = *alloc;
> > > > +}
> > > > +
> > > > /*
> > > > * Called when we got a page, either from a pool or newly
> > > > allocated.
> > > > * if needed, dma map the page and populate the dma address
> > > > array.
> > > > @@ -380,10 +590,11 @@ static unsigned int
> > > > ttm_pool_page_order(struct ttm_pool *pool, struct page *p)
> > > > */
> > > > static int ttm_pool_page_allocated(struct ttm_pool *pool,
> > > > unsigned int order,
> > > > struct page *p, enum
> > > > ttm_caching page_caching,
> > > > - struct ttm_pool_alloc_state
> > > > *alloc)
> > > > + struct ttm_pool_alloc_state
> > > > *alloc,
> > > > + struct ttm_pool_tt_restore
> > > > *restore)
> > > > {
> > > > - pgoff_t i, nr = 1UL << order;
> > > > bool caching_consistent;
> > > > + dma_addr_t first_dma;
> > > > int r = 0;
> > > >
> > > > caching_consistent = (page_caching == alloc->tt_caching)
> > > > > > PageHighMem(p);
> > > > @@ -395,17 +606,20 @@ static int ttm_pool_page_allocated(struct
> > > > ttm_pool *pool, unsigned int order,
> > > > }
> > > >
> > > > if (alloc->dma_addr) {
> > > > - r = ttm_pool_map(pool, order, p, &alloc-
> > > > > dma_addr);
> > > > + r = ttm_pool_map(pool, order, p, &first_dma);
> > > > if (r)
> > > > return r;
> > > > }
> > > >
> > > > - alloc->remaining_pages -= nr;
> > > > - for (i = 0; i < nr; ++i)
> > > > - *alloc->pages++ = p++;
> > > > + if (restore) {
> > > > + ttm_pool_page_allocated_restore(pool, order, p,
> > > > page_caching,
> > > > + first_dma,
> > > > restore, alloc);
> > > > + } else {
> > > > + ttm_pool_allocated_page_commit(p, first_dma,
> > > > alloc, 1UL << order);
> > > >
> > > > - if (caching_consistent)
> > > > - alloc->caching_divide = alloc->pages;
> > > > + if (caching_consistent)
> > > > + alloc->caching_divide = alloc->pages;
> > > > + }
> > > >
> > > > return 0;
> > > > }
> > > > @@ -428,22 +642,24 @@ static void ttm_pool_free_range(struct
> > > > ttm_pool *pool, struct ttm_tt *tt,
> > > > pgoff_t start_page, pgoff_t
> > > > end_page)
> > > > {
> > > > struct page **pages = &tt->pages[start_page];
> > > > - unsigned int order;
> > > > + struct ttm_backup *backup = tt->backup;
> > > > pgoff_t i, nr;
> > > >
> > > > for (i = start_page; i < end_page; i += nr, pages += nr)
> > > > {
> > > > - struct ttm_pool_type *pt = NULL;
> > > > + struct page *p = *pages;
> > > >
> > > > - order = ttm_pool_page_order(pool, *pages);
> > > > - nr = (1UL << order);
> > > > - if (tt->dma_address)
> > > > - ttm_pool_unmap(pool, tt->dma_address[i],
> > > > nr);
> > > > + nr = 1;
> > > > + if (ttm_backup_page_ptr_is_handle(p)) {
> > > > + unsigned long handle =
> > > > ttm_backup_page_ptr_to_handle(p);
> > > >
> > > > - pt = ttm_pool_select_type(pool, caching, order);
> > > > - if (pt)
> > > > - ttm_pool_type_give(pt, *pages);
> > > > - else
> > > > - ttm_pool_free_page(pool, caching, order,
> > > > *pages);
> > > > + if (handle != 0)
> > > > + ttm_backup_drop(backup, handle);
> > > > + } else if (p) {
> > > > + dma_addr_t *dma_addr = tt->dma_address ?
> > > > + tt->dma_address + i : NULL;
> > > > +
> > > > + nr = ttm_pool_unmap_and_free(pool, p,
> > > > dma_addr, caching);
> > > > + }
> > > > }
> > > > }
> > > >
> > > > @@ -467,22 +683,11 @@ static unsigned int
> > > > ttm_pool_alloc_find_order(unsigned int highest,
> > > > return min_t(unsigned int, highest, __fls(alloc-
> > > > > remaining_pages));
> > > > }
> > > >
> > > > -/**
> > > > - * ttm_pool_alloc - Fill a ttm_tt object
> > > > - *
> > > > - * @pool: ttm_pool to use
> > > > - * @tt: ttm_tt object to fill
> > > > - * @ctx: operation context
> > > > - *
> > > > - * Fill the ttm_tt object with pages and also make sure to DMA
> > > > map
> > > > them when
> > > > - * necessary.
> > > > - *
> > > > - * Returns: 0 on successe, negative error code otherwise.
> > > > - */
> > > > -int ttm_pool_alloc(struct ttm_pool *pool, struct ttm_tt *tt,
> > > > - struct ttm_operation_ctx *ctx)
> > > > +static int __ttm_pool_alloc(struct ttm_pool *pool, struct ttm_tt
> > > > *tt,
> > > > + const struct ttm_operation_ctx *ctx,
> > > > + struct ttm_pool_alloc_state *alloc,
> > > > + struct ttm_pool_tt_restore *restore)
> > > > {
> > > > - struct ttm_pool_alloc_state alloc;
> > > > enum ttm_caching page_caching;
> > > > gfp_t gfp_flags = GFP_USER;
> > > > pgoff_t caching_divide;
> > > > @@ -491,10 +696,8 @@ int ttm_pool_alloc(struct ttm_pool *pool,
> > > > struct ttm_tt *tt,
> > > > struct page *p;
> > > > int r;
> > > >
> > > > - ttm_pool_alloc_state_init(tt, &alloc);
> > > > -
> > > > - WARN_ON(!alloc.remaining_pages ||
> > > > ttm_tt_is_populated(tt));
> > > > - WARN_ON(alloc.dma_addr && !pool->dev);
> > > > + WARN_ON(!alloc->remaining_pages ||
> > > > ttm_tt_is_populated(tt));
> > > > + WARN_ON(alloc->dma_addr && !pool->dev);
> > > >
> > > > if (tt->page_flags & TTM_TT_FLAG_ZERO_ALLOC)
> > > > gfp_flags |= __GFP_ZERO;
> > > > @@ -509,9 +712,9 @@ int ttm_pool_alloc(struct ttm_pool *pool,
> > > > struct ttm_tt *tt,
> > > >
> > > > page_caching = tt->caching;
> > > > allow_pools = true;
> > > > - for (order = ttm_pool_alloc_find_order(MAX_PAGE_ORDER,
> > > > &alloc);
> > > > - alloc.remaining_pages;
> > > > - order = ttm_pool_alloc_find_order(order, &alloc)) {
> > > > + for (order = ttm_pool_alloc_find_order(MAX_PAGE_ORDER,
> > > > alloc);
> > > > + alloc->remaining_pages;
> > > > + order = ttm_pool_alloc_find_order(order, alloc)) {
> > > > struct ttm_pool_type *pt;
> > > >
> > > > /* First, try to allocate a page from a pool if
> > > > one exists. */
> > > > @@ -541,30 +744,120 @@ int ttm_pool_alloc(struct ttm_pool *pool,
> > > > struct ttm_tt *tt,
> > > > r = -ENOMEM;
> > > > goto error_free_all;
> > > > }
> > > > - r = ttm_pool_page_allocated(pool, order, p,
> > > > page_caching, &alloc);
> > > > + r = ttm_pool_page_allocated(pool, order, p,
> > > > page_caching, alloc,
> > > > + restore);
> > > > if (r)
> > > > goto error_free_page;
> > > > +
> > > > + if (ttm_pool_restore_valid(restore)) {
> > > > + r = ttm_pool_restore_commit(restore, tt-
> > > > > backup, ctx, alloc);
> > > > + if (r)
> > > > + goto error_free_all;
> > > > + }
> > > > }
> > > >
> > > > - r = ttm_pool_apply_caching(&alloc);
> > > > + r = ttm_pool_apply_caching(alloc);
> > > > if (r)
> > > > goto error_free_all;
> > > >
> > > > + kfree(tt->restore);
> > > > + tt->restore = NULL;
> > > > +
> > > > return 0;
> > > >
> > > > error_free_page:
> > > > ttm_pool_free_page(pool, page_caching, order, p);
> > > >
> > > > error_free_all:
> > > > - caching_divide = alloc.caching_divide - tt->pages;
> > > > + if (tt->restore)
> > > > + return r;
> > > > +
> > > > + caching_divide = alloc->caching_divide - tt->pages;
> > > > ttm_pool_free_range(pool, tt, tt->caching, 0,
> > > > caching_divide);
> > > > ttm_pool_free_range(pool, tt, ttm_cached,
> > > > caching_divide,
> > > > - tt->num_pages -
> > > > alloc.remaining_pages);
> > > > + tt->num_pages - alloc-
> > > > > remaining_pages);
> > > >
> > > > return r;
> > > > }
> > > > +
> > > > +/**
> > > > + * ttm_pool_alloc - Fill a ttm_tt object
> > > > + *
> > > > + * @pool: ttm_pool to use
> > > > + * @tt: ttm_tt object to fill
> > > > + * @ctx: operation context
> > > > + *
> > > > + * Fill the ttm_tt object with pages and also make sure to DMA
> > > > map
> > > > them when
> > > > + * necessary.
> > > > + *
> > > > + * Returns: 0 on successe, negative error code otherwise.
> > > > + */
> > > > +int ttm_pool_alloc(struct ttm_pool *pool, struct ttm_tt *tt,
> > > > + struct ttm_operation_ctx *ctx)
> > > > +{
> > > > + struct ttm_pool_alloc_state alloc;
> > > > +
> > > > + if (WARN_ON(ttm_tt_is_backed_up(tt)))
> > > > + return -EINVAL;
> > > > +
> > > > + ttm_pool_alloc_state_init(tt, &alloc);
> > > > +
> > > > + return __ttm_pool_alloc(pool, tt, ctx, &alloc, NULL);
> > > > +}
> > > > EXPORT_SYMBOL(ttm_pool_alloc);
> > > >
> > > > +/**
> > > > + * ttm_pool_restore_and_alloc - Fill a ttm_tt, restoring
> > > > previously backed-up
> > > > + * content.
> > > > + *
> > > > + * @pool: ttm_pool to use
> > > > + * @tt: ttm_tt object to fill
> > > > + * @ctx: operation context
> > > > + *
> > > > + * Fill the ttm_tt object with pages and also make sure to DMA
> > > > map
> > > > them when
> > > > + * necessary. Read in backed-up content.
> > > > + *
> > > > + * Returns: 0 on successe, negative error code otherwise.
> > > > + */
> > > > +int ttm_pool_restore_and_alloc(struct ttm_pool *pool, struct
> > > > ttm_tt *tt,
> > > > + const struct ttm_operation_ctx
> > > > *ctx)
> > > > +{
> > > > + struct ttm_pool_alloc_state alloc;
> > > > +
> > > > + if (WARN_ON(!ttm_tt_is_backed_up(tt)))
> > > > + return -EINVAL;
> > > > +
> > > > + if (!tt->restore) {
> > > > + gfp_t gfp = GFP_KERNEL | __GFP_NOWARN;
> > > > +
> > > > + ttm_pool_alloc_state_init(tt, &alloc);
> > > > + if (ctx->gfp_retry_mayfail)
> > > > + gfp |= __GFP_RETRY_MAYFAIL;
> > > > +
> > > > + tt->restore = kzalloc(sizeof(*tt->restore),
> > > > gfp);
> > > > + if (!tt->restore)
> > > > + return -ENOMEM;
> > > > +
> > > > + tt->restore->snapshot_alloc = alloc;
> > > > + tt->restore->pool = pool;
> > > > + tt->restore->restored_pages = 1;
> > > > + } else {
> > > > + struct ttm_pool_tt_restore *restore = tt-
> > > > >restore;
> > > > + int ret;
> > > > +
> > > > + alloc = restore->snapshot_alloc;
> > > > + if (ttm_pool_restore_valid(tt->restore)) {
> > > > + ret = ttm_pool_restore_commit(restore,
> > > > tt-
> > > > > backup, ctx, &alloc);
> > > > + if (ret)
> > > > + return ret;
> > > > + }
> > > > + if (!alloc.remaining_pages)
> > > > + return 0;
> > > > + }
> > > > +
> > > > + return __ttm_pool_alloc(pool, tt, ctx, &alloc, tt-
> > > > > restore);
> > > > +}
> > > > +
> > > > /**
> > > > * ttm_pool_free - Free the backing pages from a ttm_tt object
> > > > *
> > > > @@ -582,6 +875,163 @@ void ttm_pool_free(struct ttm_pool *pool,
> > > > struct ttm_tt *tt)
> > > > }
> > > > EXPORT_SYMBOL(ttm_pool_free);
> > > >
> > > > +/**
> > > > + * ttm_pool_drop_backed_up() - Release content of a swapped-out
> > > > struct ttm_tt
> > > > + * @tt: The struct ttm_tt.
> > > > + *
> > > > + * Release handles with associated content or any remaining
> > > > pages
> > > > of
> > > > + * a backed-up struct ttm_tt.
> > > > + */
> > > > +void ttm_pool_drop_backed_up(struct ttm_tt *tt)
> > > > +{
> > > > + struct ttm_pool_tt_restore *restore;
> > > > + pgoff_t start_page = 0;
> > > > +
> > > > + WARN_ON(!ttm_tt_is_backed_up(tt));
> > > > +
> > > > + restore = tt->restore;
> > > > +
> > > > + /*
> > > > + * Unmap and free any uncommitted restore page.
> > > > + * any tt page-array backup entries already read back
> > > > has
> > > > + * been cleared already
> > > > + */
> > > > + if (ttm_pool_restore_valid(restore)) {
> > > > + dma_addr_t *dma_addr = tt->dma_address ?
> > > > &restore-
> > > > > first_dma : NULL;
> > > > +
> > > > + ttm_pool_unmap_and_free(restore->pool, restore-
> > > > > alloced_page,
> > > > + dma_addr, restore-
> > > > > page_caching);
> > > > + restore->restored_pages = 1UL << restore->order;
> > > > + }
> > > > +
> > > > + /*
> > > > + * If a restore is ongoing, part of the tt pages may
> > > > have
> > > > a
> > > > + * caching different than writeback.
> > > > + */
> > > > + if (restore) {
> > > > + pgoff_t mid = restore-
> > > > > snapshot_alloc.caching_divide - tt->pages;
> > > > +
> > > > + start_page = restore->alloced_pages;
> > > > + WARN_ON(mid > start_page);
> > > > + /* Pages that might be dma-mapped and non-cached
> > > > */
> > > > + ttm_pool_free_range(restore->pool, tt, tt-
> > > > > caching,
> > > > + 0, mid);
> > > > + /* Pages that might be dma-mapped but cached */
> > > > + ttm_pool_free_range(restore->pool, tt,
> > > > ttm_cached,
> > > > + mid, restore-
> > > > >alloced_pages);
> > > > + kfree(restore);
> > > > + tt->restore = NULL;
> > > > + }
> > > > +
> > > > + ttm_pool_free_range(NULL, tt, ttm_cached, start_page,
> > > > tt-
> > > > > num_pages);
> > > > +}
> > > > +
> > > > +/**
> > > > + * ttm_pool_backup() - Back up or purge a struct ttm_tt
> > > > + * @pool: The pool used when allocating the struct ttm_tt.
> > > > + * @tt: The struct ttm_tt.
> > > > + * @flags: Flags to govern the backup behaviour.
> > > > + *
> > > > + * Back up or purge a struct ttm_tt. If @purge is true, then
> > > > + * all pages will be freed directly to the system rather than to
> > > > the pool
> > > > + * they were allocated from, making the function behave
> > > > similarly
> > > > to
> > > > + * ttm_pool_free(). If @purge is false the pages will be backed
> > > > up
> > > > instead,
> > > > + * exchanged for handles.
> > > > + * A subsequent call to ttm_pool_restore_and_alloc() will then
> > > > read back the content and
> > > > + * a subsequent call to ttm_pool_drop_backed_up() will drop it.
> > > > + * If backup of a page fails for whatever reason, @ttm will
> > > > still
> > > > be
> > > > + * partially backed up, retaining those pages for which backup
> > > > fails.
> > > > + * In that case, this function can be retried, possibly after
> > > > freeing up
> > > > + * memory resources.
> > > > + *
> > > > + * Return: Number of pages actually backed up or freed, or
> > > > negative
> > > > + * error code on error.
> > > > + */
> > > > +long ttm_pool_backup(struct ttm_pool *pool, struct ttm_tt *tt,
> > > > + const struct ttm_backup_flags *flags)
> > > > +{
> > > > + struct ttm_backup *backup = tt->backup;
> > > > + struct page *page;
> > > > + unsigned long handle;
> > > > + gfp_t alloc_gfp;
> > > > + gfp_t gfp;
> > > > + int ret = 0;
> > > > + pgoff_t shrunken = 0;
> > > > + pgoff_t i, num_pages;
> > > > +
> > > > + if (WARN_ON(ttm_tt_is_backed_up(tt)))
> > > > + return -EINVAL;
> > > > +
> > > > + if ((!ttm_backup_bytes_avail() && !flags->purge) ||
> > > > + pool->use_dma_alloc || ttm_tt_is_backed_up(tt))
> > > > + return -EBUSY;
> > > > +
> > > > +#ifdef CONFIG_X86
> > > > + /* Anything returned to the system needs to be cached.
> > > > */
> > > > + if (tt->caching != ttm_cached)
> > > > + set_pages_array_wb(tt->pages, tt->num_pages);
> > > > +#endif
> > > > +
> > > > + if (tt->dma_address || flags->purge) {
> > > > + for (i = 0; i < tt->num_pages; i += num_pages) {
> > > > + unsigned int order;
> > > > +
> > > > + page = tt->pages[i];
> > > > + if (unlikely(!page)) {
> > > > + num_pages = 1;
> > > > + continue;
> > > > + }
> > > > +
> > > > + order = ttm_pool_page_order(pool, page);
> > > > + num_pages = 1UL << order;
> > > > + if (tt->dma_address)
> > > > + ttm_pool_unmap(pool, tt-
> > > > > dma_address[i],
> > > > + num_pages);
> > > > + if (flags->purge) {
> > > > + shrunken += num_pages;
> > > > + page->private = 0;
> > > > + __free_pages(page, order);
> > > > + memset(tt->pages + i, 0,
> > > > + num_pages * sizeof(*tt-
> > > > > pages));
> > > > + }
> > > > + }
> > > > + }
> > > > +
> > > > + if (flags->purge)
> > > > + return shrunken;
> > > > +
> > > > + if (pool->use_dma32)
> > > > + gfp = GFP_DMA32;
> > > > + else
> > > > + gfp = GFP_HIGHUSER;
> > > > +
> > > > + alloc_gfp = GFP_KERNEL | __GFP_HIGH | __GFP_NOWARN |
> > > > __GFP_RETRY_MAYFAIL;
> > > > +
> > > > + for (i = 0; i < tt->num_pages; ++i) {
> > > > + s64 shandle;
> > > > +
> > > > + page = tt->pages[i];
> > > > + if (unlikely(!page))
> > > > + continue;
> > > > +
> > > > + ttm_pool_split_for_swap(pool, page);
> > > > +
> > > > + shandle = ttm_backup_backup_page(backup, page,
> > > > flags->writeback, i,
> > > > + gfp,
> > > > alloc_gfp);
> > > > + if (shandle < 0) {
> > > > + /* We allow partially shrunken tts */
> > > > + ret = shandle;
> > > > + break;
> > > > + }
> > > > + handle = shandle;
> > > > + tt->pages[i] =
> > > > ttm_backup_handle_to_page_ptr(handle);
> > > > + put_page(page);
> > > > + shrunken++;
> > > > + }
> > > > +
> > > > + return shrunken ? shrunken : ret;
> > > > +}
> > > > +
> > > > /**
> > > > * ttm_pool_init - Initialize a pool
> > > > *
> > > > diff --git a/drivers/gpu/drm/ttm/ttm_tt.c
> > > > b/drivers/gpu/drm/ttm/ttm_tt.c
> > > > index 3baf215eca23..00b7c28f2329 100644
> > > > --- a/drivers/gpu/drm/ttm/ttm_tt.c
> > > > +++ b/drivers/gpu/drm/ttm/ttm_tt.c
> > > > @@ -40,6 +40,7 @@
> > > > #include <drm/drm_cache.h>
> > > > #include <drm/drm_device.h>
> > > > #include <drm/drm_util.h>
> > > > +#include <drm/ttm/ttm_backup.h>
> > > > #include <drm/ttm/ttm_bo.h>
> > > > #include <drm/ttm/ttm_tt.h>
> > > >
> > > > @@ -158,6 +159,8 @@ static void ttm_tt_init_fields(struct ttm_tt
> > > > *ttm,
> > > > ttm->swap_storage = NULL;
> > > > ttm->sg = bo->sg;
> > > > ttm->caching = caching;
> > > > + ttm->restore = NULL;
> > > > + ttm->backup = NULL;
> > > > }
> > > >
> > > > int ttm_tt_init(struct ttm_tt *ttm, struct ttm_buffer_object
> > > > *bo,
> > > > @@ -182,6 +185,13 @@ void ttm_tt_fini(struct ttm_tt *ttm)
> > > > fput(ttm->swap_storage);
> > > > ttm->swap_storage = NULL;
> > > >
> > > > + if (ttm_tt_is_backed_up(ttm))
> > > > + ttm_pool_drop_backed_up(ttm);
> > > > + if (ttm->backup) {
> > > > + ttm_backup_fini(ttm->backup);
> > > > + ttm->backup = NULL;
> > > > + }
> > > > +
> > > > if (ttm->pages)
> > > > kvfree(ttm->pages);
> > > > else
> > > > @@ -253,6 +263,49 @@ int ttm_tt_swapin(struct ttm_tt *ttm)
> > > > }
> > > > EXPORT_SYMBOL_FOR_TESTS_ONLY(ttm_tt_swapin);
> > > >
> > > > +/**
> > > > + * ttm_tt_backup() - Helper to back up a struct ttm_tt.
> > > > + * @bdev: The TTM device.
> > > > + * @tt: The struct ttm_tt.
> > > > + * @flags: Flags that govern the backup behaviour.
> > > > + *
> > > > + * Update the page accounting and call ttm_pool_shrink_tt to
> > > > free
> > > > pages
> > > > + * or back them up.
> > > > + *
> > > > + * Return: Number of pages freed or swapped out, or negative
> > > > error
> > > > code on
> > > > + * error.
> > > > + */
> > > > +long ttm_tt_backup(struct ttm_device *bdev, struct ttm_tt *tt,
> > > > + const struct ttm_backup_flags flags)
> > > > +{
> > > > + long ret;
> > > > +
> > > > + if (WARN_ON(IS_ERR_OR_NULL(tt->backup)))
> > > > + return 0;
> > > > +
> > > > + ret = ttm_pool_backup(&bdev->pool, tt, &flags);
> > > > + if (ret > 0) {
> > > > + tt->page_flags &= ~TTM_TT_FLAG_PRIV_POPULATED;
> > > > + tt->page_flags |= TTM_TT_FLAG_BACKED_UP;
> > > > + }
> > > > +
> > > > + return ret;
> > > > +}
> > > > +
> > > > +int ttm_tt_restore(struct ttm_device *bdev, struct ttm_tt *tt,
> > > > + const struct ttm_operation_ctx *ctx)
> > > > +{
> > > > + int ret = ttm_pool_restore_and_alloc(&bdev->pool, tt,
> > > > ctx);
> > > > +
> > > > + if (ret)
> > > > + return ret;
> > > > +
> > > > + tt->page_flags &= ~TTM_TT_FLAG_BACKED_UP;
> > > > +
> > > > + return 0;
> > > > +}
> > > > +EXPORT_SYMBOL(ttm_tt_restore);
> > > > +
> > > > /**
> > > > * ttm_tt_swapout - swap out tt object
> > > > *
> > > > @@ -348,6 +401,7 @@ int ttm_tt_populate(struct ttm_device *bdev,
> > > > goto error;
> > > >
> > > > ttm->page_flags |= TTM_TT_FLAG_PRIV_POPULATED;
> > > > + ttm->page_flags &= ~TTM_TT_FLAG_BACKED_UP;
> > > > if (unlikely(ttm->page_flags & TTM_TT_FLAG_SWAPPED)) {
> > > > ret = ttm_tt_swapin(ttm);
> > > > if (unlikely(ret != 0)) {
> > > > diff --git a/include/drm/ttm/ttm_pool.h
> > > > b/include/drm/ttm/ttm_pool.h
> > > > index 160d954a261e..54cd34a6e4c0 100644
> > > > --- a/include/drm/ttm/ttm_pool.h
> > > > +++ b/include/drm/ttm/ttm_pool.h
> > > > @@ -33,6 +33,7 @@
> > > >
> > > > struct device;
> > > > struct seq_file;
> > > > +struct ttm_backup_flags;
> > > > struct ttm_operation_ctx;
> > > > struct ttm_pool;
> > > > struct ttm_tt;
> > > > @@ -89,6 +90,13 @@ void ttm_pool_fini(struct ttm_pool *pool);
> > > >
> > > > int ttm_pool_debugfs(struct ttm_pool *pool, struct seq_file
> > > > *m);
> > > >
> > > > +void ttm_pool_drop_backed_up(struct ttm_tt *tt);
> > > > +
> > > > +long ttm_pool_backup(struct ttm_pool *pool, struct ttm_tt *ttm,
> > > > + const struct ttm_backup_flags *flags);
> > > > +int ttm_pool_restore_and_alloc(struct ttm_pool *pool, struct
> > > > ttm_tt *tt,
> > > > + const struct ttm_operation_ctx
> > > > *ctx);
> > > > +
> > > > int ttm_pool_mgr_init(unsigned long num_pages);
> > > > void ttm_pool_mgr_fini(void);
> > > >
> > > > diff --git a/include/drm/ttm/ttm_tt.h b/include/drm/ttm/ttm_tt.h
> > > > index 991edafdb2dd..c736c01ac2ca 100644
> > > > --- a/include/drm/ttm/ttm_tt.h
> > > > +++ b/include/drm/ttm/ttm_tt.h
> > > > @@ -32,11 +32,13 @@
> > > > #include <drm/ttm/ttm_caching.h>
> > > > #include <drm/ttm/ttm_kmap_iter.h>
> > > >
> > > > +struct ttm_backup;
> > > > struct ttm_device;
> > > > struct ttm_tt;
> > > > struct ttm_resource;
> > > > struct ttm_buffer_object;
> > > > struct ttm_operation_ctx;
> > > > +struct ttm_pool_tt_restore;
> > > >
> > > > /**
> > > > * struct ttm_tt - This is a structure holding the pages,
> > > > caching- and aperture
> > > > @@ -85,17 +87,22 @@ struct ttm_tt {
> > > > * fault handling abuses the DMA api a bit and
> > > > dma_map_attrs can't be
> > > > * used to assure pgprot always matches.
> > > > *
> > > > + * TTM_TT_FLAG_BACKED_UP: TTM internal only. This is set
> > > > if the
> > > > + * struct ttm_tt has been (possibly partially) backed
> > > > up.
> > > > + *
> > > > * TTM_TT_FLAG_PRIV_POPULATED: TTM internal only. DO NOT
> > > > USE. This is
> > > > * set by TTM after ttm_tt_populate() has successfully
> > > > returned, and is
> > > > * then unset when TTM calls ttm_tt_unpopulate().
> > > > + *
> > > > */
> > > > #define TTM_TT_FLAG_SWAPPED BIT(0)
> > > > #define TTM_TT_FLAG_ZERO_ALLOC BIT(1)
> > > > #define TTM_TT_FLAG_EXTERNAL BIT(2)
> > > > #define TTM_TT_FLAG_EXTERNAL_MAPPABLE BIT(3)
> > > > #define TTM_TT_FLAG_DECRYPTED BIT(4)
> > > > +#define TTM_TT_FLAG_BACKED_UP BIT(5)
> > > >
> > > > -#define TTM_TT_FLAG_PRIV_POPULATED BIT(5)
> > > > +#define TTM_TT_FLAG_PRIV_POPULATED BIT(6)
> > > > uint32_t page_flags;
> > > > /** @num_pages: Number of pages in the page array. */
> > > > uint32_t num_pages;
> > > > @@ -105,11 +112,20 @@ struct ttm_tt {
> > > > dma_addr_t *dma_address;
> > > > /** @swap_storage: Pointer to shmem struct file for swap
> > > > storage. */
> > > > struct file *swap_storage;
> > > > + /**
> > > > + * @backup: Pointer to backup struct for backed up tts.
> > > > + * Could be unified with @swap_storage. Meanwhile, the
> > > > driver's
> > > > + * ttm_tt_create() callback is responsible for assigning
> > > > + * this field.
> > > > + */
> > > > + struct ttm_backup *backup;
> > > > /**
> > > > * @caching: The current caching state of the pages, see
> > > > enum
> > > > * ttm_caching.
> > > > */
> > > > enum ttm_caching caching;
> > > > + /** @restore: Partial restoration from backup state. TTM
> > > > private */
> > > > + struct ttm_pool_tt_restore *restore;
> > > > };
> > > >
> > > > /**
> > > > @@ -129,9 +145,38 @@ static inline bool
> > > > ttm_tt_is_populated(struct
> > > > ttm_tt *tt)
> > > > return tt->page_flags & TTM_TT_FLAG_PRIV_POPULATED;
> > > > }
> > > >
> > > > +/**
> > > > + * ttm_tt_is_swapped() - Whether the ttm_tt is swapped out or
> > > > backed up
> > > > + * @tt: The struct ttm_tt.
> > > > + *
> > > > + * Return: true if swapped or backed up, false otherwise.
> > > > + */
> > > > static inline bool ttm_tt_is_swapped(const struct ttm_tt *tt)
> > > > {
> > > > - return tt->page_flags & TTM_TT_FLAG_SWAPPED;
> > > > + return tt->page_flags & (TTM_TT_FLAG_SWAPPED |
> > > > TTM_TT_FLAG_BACKED_UP);
> > > > +}
> > > > +
> > > > +/**
> > > > + * ttm_tt_is_backed_up() - Whether the ttm_tt backed up
> > > > + * @tt: The struct ttm_tt.
> > > > + *
> > > > + * Return: true if swapped or backed up, false otherwise.
> > > > + */
> > > > +static inline bool ttm_tt_is_backed_up(const struct ttm_tt *tt)
> > > > +{
> > > > + return tt->page_flags & TTM_TT_FLAG_BACKED_UP;
> > > > +}
> > > > +
> > > > +/**
> > > > + * ttm_tt_clear_backed_up() - Clear the ttm_tt backed-up status
> > > > + * @tt: The struct ttm_tt.
> > > > + *
> > > > + * Drivers can use this functionto clear the backed-up status,
> > > > + * for example before destroying or re-validating a purged tt.
> > > > + */
> > > > +static inline void ttm_tt_clear_backed_up(struct ttm_tt *tt)
> > > > +{
> > > > + tt->page_flags &= ~TTM_TT_FLAG_BACKED_UP;
> > > > }
> > > >
> > > > /**
> > > > @@ -235,6 +280,24 @@ void ttm_tt_mgr_init(unsigned long
> > > > num_pages,
> > > > unsigned long num_dma32_pages);
> > > > struct ttm_kmap_iter *ttm_kmap_iter_tt_init(struct
> > > > ttm_kmap_iter_tt *iter_tt,
> > > > struct ttm_tt *tt);
> > > > unsigned long ttm_tt_pages_limit(void);
> > > > +
> > > > +/**
> > > > + * struct ttm_backup_flags - Flags to govern backup behaviour.
> > > > + * @purge: Free pages without backing up. Bypass pools.
> > > > + * @writeback: Attempt to copy contents directly to swap space,
> > > > even
> > > > + * if that means blocking on writes to external memory.
> > > > + */
> > > > +struct ttm_backup_flags {
> > > > + u32 purge : 1;
> > > > + u32 writeback : 1;
> > > > +};
> > > > +
> > > > +long ttm_tt_backup(struct ttm_device *bdev, struct ttm_tt *tt,
> > > > + const struct ttm_backup_flags flags);
> > > > +
> > > > +int ttm_tt_restore(struct ttm_device *bdev, struct ttm_tt *tt,
> > > > + const struct ttm_operation_ctx *ctx);
> > > > +
> > > > #if IS_ENABLED(CONFIG_AGP)
> > > > #include <linux/agp_backend.h>
> > > >
> > >
> >
>
^ permalink raw reply [flat|nested] 26+ messages in thread* Re: RESEND Re: [PATCH v16 2/7] drm/ttm/pool, drm/ttm/tt: Provide a helper to shrink pages
2025-03-05 3:01 ` Dave Airlie
@ 2025-03-05 9:10 ` Christian König
2025-03-06 10:05 ` Thomas Hellström
2025-03-06 10:00 ` Thomas Hellström
1 sibling, 1 reply; 26+ messages in thread
From: Christian König @ 2025-03-05 9:10 UTC (permalink / raw)
To: Dave Airlie, Thomas Hellström
Cc: intel-xe, Somalapuram Amaranath, Matthew Brost, dri-devel
Yeah, it's sad but I probably won't find time for a deeper review anytime soon.
So feel free to add my Acked-by as well.
Christian.
Am 05.03.25 um 04:01 schrieb Dave Airlie:
> I've looked over the two patches mentioned here, I think they have
> seen enough time and we need to unblock,
>
> Please add and merge them:
> Acked-by: Dave Airlie <airlied@redhat.com>
>
> Dave.
>
> On Tue, 25 Feb 2025 at 18:44, Thomas Hellström
> <thomas.hellstrom@linux.intel.com> wrote:
>> Hi, Christian,
>>
>> Ping? I'd really want to get this in before -rc6
>>
>> Thanks,
>> Thomas
>>
>>
>>
>> On Tue, 2025-02-18 at 16:40 +0100, Thomas Hellström wrote:
>>> Hi, Christian,
>>>
>>> On Wed, 2025-02-05 at 15:02 +0100, Christian König wrote:
>>>> Am 30.01.25 um 11:13 schrieb Thomas Hellström:
>>>>> Provide a helper to shrink ttm_tt page-vectors on a per-page
>>>>> basis. A ttm_backup backend could then in theory get away with
>>>>> allocating a single temporary page for each struct ttm_tt.
>>>>>
>>>>> This is accomplished by splitting larger pages before trying to
>>>>> back them up.
>>>>>
>>>>> In the future we could allow ttm_backup to handle backing up
>>>>> large pages as well, but currently there's no benefit in
>>>>> doing that, since the shmem backup backend would have to
>>>>> split those anyway to avoid allocating too much temporary
>>>>> memory, and if the backend instead inserts pages into the
>>>>> swap-cache, those are split on reclaim by the core.
>>>>>
>>>>> Due to potential backup- and recover errors, allow partially
>>>>> swapped
>>>>> out struct ttm_tt's, although mark them as swapped out stopping
>>>>> them
>>>>> from being swapped out a second time. More details in the
>>>>> ttm_pool.c
>>>>> DOC section.
>>>>>
>>>>> v2:
>>>>> - A couple of cleanups and error fixes in ttm_pool_back_up_tt.
>>>>> - s/back_up/backup/
>>>>> - Add a writeback parameter to the exported interface.
>>>>> v8:
>>>>> - Use a struct for flags for readability (Matt Brost)
>>>>> - Address misc other review comments (Matt Brost)
>>>>> v9:
>>>>> - Update the kerneldoc for the ttm_tt::backup field.
>>>>> v10:
>>>>> - Rebase.
>>>>> v13:
>>>>> - Rebase on ttm_backup interface change. Update kerneldoc.
>>>>> - Rebase and adjust ttm_tt_is_swapped().
>>>>> v15:
>>>>> - Rebase on ttm_backup return value change.
>>>>> - Rebase on previous restructuring of ttm_pool_alloc()
>>>>> - Rework the ttm_pool backup interface (Christian König)
>>>>> - Remove cond_resched() (Christian König)
>>>>> - Get rid of the need to allocate an intermediate page array
>>>>> when restoring a multi-order page (Christian König)
>>>>> - Update documentation.
>>>>>
>>>>> Cc: Christian König <christian.koenig@amd.com>
>>>>> Cc: Somalapuram Amaranath <Amaranath.Somalapuram@amd.com>
>>>>> Cc: Matthew Brost <matthew.brost@intel.com>
>>>>> Cc: <dri-devel@lists.freedesktop.org>
>>>>> Signed-off-by: Thomas Hellström
>>>>> <thomas.hellstrom@linux.intel.com>
>>>>> Reviewed-by: Matthew Brost <matthew.brost@intel.com>
>>>> I've tried to wrap my head around all of this like twenty times in
>>>> the
>>>> last three month, but was always interrupted at some point.
>>>>
>>>> Feel free to add Acked-by: Christian Koenig
>>>> <christian.koenig@amd.com>.
>>>>
>>>> Sorry,
>>>> Christian.
>>> Thanks a lot for all reviewing and comments so far. There are two TTM
>>> patches left in the series that don't have an ack by you:
>>>
>>> https://patchwork.freedesktop.org/patch/634715/?series=131815&rev=17
>>> and
>>>
>>> https://patchwork.freedesktop.org/patch/634716/?series=131815&rev=17
>>>
>>> None of them particularly big considering the amount of doc text.
>>>
>>> It'd be great if those could have an ack as well so we could finally
>>> merge this series.
>>>
>>> Thanks,
>>> Thomas
>>>
>>>
>>>
>>>
>>>
>>>
>>>>> ---
>>>>> drivers/gpu/drm/ttm/ttm_pool.c | 554
>>>>> +++++++++++++++++++++++++++++----
>>>>> drivers/gpu/drm/ttm/ttm_tt.c | 54 ++++
>>>>> include/drm/ttm/ttm_pool.h | 8 +
>>>>> include/drm/ttm/ttm_tt.h | 67 +++-
>>>>> 4 files changed, 629 insertions(+), 54 deletions(-)
>>>>>
>>>>> diff --git a/drivers/gpu/drm/ttm/ttm_pool.c
>>>>> b/drivers/gpu/drm/ttm/ttm_pool.c
>>>>> index c9eba76d5143..ffb7abf52bab 100644
>>>>> --- a/drivers/gpu/drm/ttm/ttm_pool.c
>>>>> +++ b/drivers/gpu/drm/ttm/ttm_pool.c
>>>>> @@ -41,6 +41,7 @@
>>>>> #include <asm/set_memory.h>
>>>>> #endif
>>>>>
>>>>> +#include <drm/ttm/ttm_backup.h>
>>>>> #include <drm/ttm/ttm_pool.h>
>>>>> #include <drm/ttm/ttm_tt.h>
>>>>> #include <drm/ttm/ttm_bo.h>
>>>>> @@ -75,6 +76,35 @@ struct ttm_pool_alloc_state {
>>>>> enum ttm_caching tt_caching;
>>>>> };
>>>>>
>>>>> +/**
>>>>> + * struct ttm_pool_tt_restore - State representing restore from
>>>>> backup
>>>>> + * @pool: The pool used for page allocation while restoring.
>>>>> + * @snapshot_alloc: A snapshot of the most recent struct
>>>>> ttm_pool_alloc_state.
>>>>> + * @alloced_page: Pointer to the page most recently allocated
>>>>> from
>>>>> a pool or system.
>>>>> + * @first_dma: The dma address corresponding to @alloced_page if
>>>>> dma_mapping
>>>>> + * is requested.
>>>>> + * @alloced_pages: The number of allocated pages present in the
>>>>> struct ttm_tt
>>>>> + * page vector from this restore session.
>>>>> + * @restored_pages: The number of 4K pages restored for
>>>>> @alloced_page (which
>>>>> + * is typically a multi-order page).
>>>>> + * @page_caching: The struct ttm_tt requested caching
>>>>> + * @order: The order of @alloced_page.
>>>>> + *
>>>>> + * Recovery from backup might fail when we've recovered less
>>>>> than
>>>>> the
>>>>> + * full ttm_tt. In order not to loose any data (yet), keep
>>>>> information
>>>>> + * around that allows us to restart a failed ttm backup
>>>>> recovery.
>>>>> + */
>>>>> +struct ttm_pool_tt_restore {
>>>>> + struct ttm_pool *pool;
>>>>> + struct ttm_pool_alloc_state snapshot_alloc;
>>>>> + struct page *alloced_page;
>>>>> + dma_addr_t first_dma;
>>>>> + pgoff_t alloced_pages;
>>>>> + pgoff_t restored_pages;
>>>>> + enum ttm_caching page_caching;
>>>>> + unsigned int order;
>>>>> +};
>>>>> +
>>>>> static unsigned long page_pool_size;
>>>>>
>>>>> MODULE_PARM_DESC(page_pool_size, "Number of pages in the
>>>>> WC/UC/DMA pool");
>>>>> @@ -199,12 +229,11 @@ static int ttm_pool_apply_caching(struct
>>>>> ttm_pool_alloc_state *alloc)
>>>>> return 0;
>>>>> }
>>>>>
>>>>> -/* Map pages of 1 << order size and fill the DMA address array
>>>>> */
>>>>> +/* DMA Map pages of 1 << order size and return the resulting
>>>>> dma_address. */
>>>>> static int ttm_pool_map(struct ttm_pool *pool, unsigned int
>>>>> order,
>>>>> - struct page *p, dma_addr_t **dma_addr)
>>>>> + struct page *p, dma_addr_t *dma_addr)
>>>>> {
>>>>> dma_addr_t addr;
>>>>> - unsigned int i;
>>>>>
>>>>> if (pool->use_dma_alloc) {
>>>>> struct ttm_pool_dma *dma = (void *)p->private;
>>>>> @@ -218,10 +247,7 @@ static int ttm_pool_map(struct ttm_pool
>>>>> *pool,
>>>>> unsigned int order,
>>>>> return -EFAULT;
>>>>> }
>>>>>
>>>>> - for (i = 1 << order; i ; --i) {
>>>>> - *(*dma_addr)++ = addr;
>>>>> - addr += PAGE_SIZE;
>>>>> - }
>>>>> + *dma_addr = addr;
>>>>>
>>>>> return 0;
>>>>> }
>>>>> @@ -371,6 +397,190 @@ static unsigned int
>>>>> ttm_pool_page_order(struct ttm_pool *pool, struct page *p)
>>>>> return p->private;
>>>>> }
>>>>>
>>>>> +/*
>>>>> + * Split larger pages so that we can free each PAGE_SIZE page as
>>>>> soon
>>>>> + * as it has been backed up, in order to avoid memory pressure
>>>>> during
>>>>> + * reclaim.
>>>>> + */
>>>>> +static void ttm_pool_split_for_swap(struct ttm_pool *pool,
>>>>> struct
>>>>> page *p)
>>>>> +{
>>>>> + unsigned int order = ttm_pool_page_order(pool, p);
>>>>> + pgoff_t nr;
>>>>> +
>>>>> + if (!order)
>>>>> + return;
>>>>> +
>>>>> + split_page(p, order);
>>>>> + nr = 1UL << order;
>>>>> + while (nr--)
>>>>> + (p++)->private = 0;
>>>>> +}
>>>>> +
>>>>> +/**
>>>>> + * DOC: Partial backup and restoration of a struct ttm_tt.
>>>>> + *
>>>>> + * Swapout using ttm_backup_backup_page() and swapin using
>>>>> + * ttm_backup_copy_page() may fail.
>>>>> + * The former most likely due to lack of swap-space or memory,
>>>>> the
>>>>> latter due
>>>>> + * to lack of memory or because of signal interruption during
>>>>> waits.
>>>>> + *
>>>>> + * Backup failure is easily handled by using a ttm_tt pages
>>>>> vector
>>>>> that holds
>>>>> + * both backup handles and page pointers. This has to be taken
>>>>> into account when
>>>>> + * restoring such a ttm_tt from backup, and when freeing it
>>>>> while
>>>>> backed up.
>>>>> + * When restoring, for simplicity, new pages are actually
>>>>> allocated from the
>>>>> + * pool and the contents of any old pages are copied in and then
>>>>> the old pages
>>>>> + * are released.
>>>>> + *
>>>>> + * For restoration failures, the struct ttm_pool_tt_restore
>>>>> holds
>>>>> sufficient state
>>>>> + * to be able to resume an interrupted restore, and that
>>>>> structure
>>>>> is freed once
>>>>> + * the restoration is complete. If the struct ttm_tt is
>>>>> destroyed
>>>>> while there
>>>>> + * is a valid struct ttm_pool_tt_restore attached, that is also
>>>>> properly taken
>>>>> + * care of.
>>>>> + */
>>>>> +
>>>>> +/* Is restore ongoing for the currently allocated page? */
>>>>> +static bool ttm_pool_restore_valid(const struct
>>>>> ttm_pool_tt_restore *restore)
>>>>> +{
>>>>> + return restore && restore->restored_pages < (1 <<
>>>>> restore-
>>>>>> order);
>>>>> +}
>>>>> +
>>>>> +/* DMA unmap and free a multi-order page, either to the relevant
>>>>> pool or to system. */
>>>>> +static pgoff_t ttm_pool_unmap_and_free(struct ttm_pool *pool,
>>>>> struct page *page,
>>>>> + const dma_addr_t
>>>>> *dma_addr,
>>>>> enum ttm_caching caching)
>>>>> +{
>>>>> + struct ttm_pool_type *pt = NULL;
>>>>> + unsigned int order;
>>>>> + pgoff_t nr;
>>>>> +
>>>>> + if (pool) {
>>>>> + order = ttm_pool_page_order(pool, page);
>>>>> + nr = (1UL << order);
>>>>> + if (dma_addr)
>>>>> + ttm_pool_unmap(pool, *dma_addr, nr);
>>>>> +
>>>>> + pt = ttm_pool_select_type(pool, caching, order);
>>>>> + } else {
>>>>> + order = page->private;
>>>>> + nr = (1UL << order);
>>>>> + }
>>>>> +
>>>>> + if (pt)
>>>>> + ttm_pool_type_give(pt, page);
>>>>> + else
>>>>> + ttm_pool_free_page(pool, caching, order, page);
>>>>> +
>>>>> + return nr;
>>>>> +}
>>>>> +
>>>>> +/* Populate the page-array using the most recent allocated
>>>>> multi-
>>>>> order page. */
>>>>> +static void ttm_pool_allocated_page_commit(struct page
>>>>> *allocated,
>>>>> + dma_addr_t first_dma,
>>>>> + struct
>>>>> ttm_pool_alloc_state *alloc,
>>>>> + pgoff_t nr)
>>>>> +{
>>>>> + pgoff_t i;
>>>>> +
>>>>> + for (i = 0; i < nr; ++i)
>>>>> + *alloc->pages++ = allocated++;
>>>>> +
>>>>> + alloc->remaining_pages -= nr;
>>>>> +
>>>>> + if (!alloc->dma_addr)
>>>>> + return;
>>>>> +
>>>>> + for (i = 0; i < nr; ++i) {
>>>>> + *alloc->dma_addr++ = first_dma;
>>>>> + first_dma += PAGE_SIZE;
>>>>> + }
>>>>> +}
>>>>> +
>>>>> +/*
>>>>> + * When restoring, restore backed-up content to the newly
>>>>> allocated page and
>>>>> + * if successful, populate the page-table and dma-address
>>>>> arrays.
>>>>> + */
>>>>> +static int ttm_pool_restore_commit(struct ttm_pool_tt_restore
>>>>> *restore,
>>>>> + struct ttm_backup *backup,
>>>>> + const struct
>>>>> ttm_operation_ctx
>>>>> *ctx,
>>>>> + struct ttm_pool_alloc_state
>>>>> *alloc)
>>>>> +
>>>>> +{
>>>>> + pgoff_t i, nr = 1UL << restore->order;
>>>>> + struct page **first_page = alloc->pages;
>>>>> + struct page *p;
>>>>> + int ret = 0;
>>>>> +
>>>>> + for (i = restore->restored_pages; i < nr; ++i) {
>>>>> + p = first_page[i];
>>>>> + if (ttm_backup_page_ptr_is_handle(p)) {
>>>>> + unsigned long handle =
>>>>> ttm_backup_page_ptr_to_handle(p);
>>>>> +
>>>>> + if (handle == 0) {
>>>>> + restore->restored_pages++;
>>>>> + continue;
>>>>> + }
>>>>> +
>>>>> + ret = ttm_backup_copy_page(backup,
>>>>> restore->alloced_page + i,
>>>>> + handle, ctx-
>>>>>> interruptible);
>>>>> + if (ret)
>>>>> + break;
>>>>> +
>>>>> + ttm_backup_drop(backup, handle);
>>>>> + } else if (p) {
>>>>> + /*
>>>>> + * We could probably avoid splitting the
>>>>> old page
>>>>> + * using clever logic, but ATM we don't
>>>>> care, as
>>>>> + * we prioritize releasing memory ASAP.
>>>>> Note that
>>>>> + * here, the old retained page is always
>>>>> write-back
>>>>> + * cached.
>>>>> + */
>>>>> + ttm_pool_split_for_swap(restore->pool,
>>>>> p);
>>>>> + copy_highpage(restore->alloced_page + i,
>>>>> p);
>>>>> + __free_pages(p, 0);
>>>>> + }
>>>>> +
>>>>> + restore->restored_pages++;
>>>>> + first_page[i] =
>>>>> ttm_backup_handle_to_page_ptr(0);
>>>>> + }
>>>>> +
>>>>> + if (ret) {
>>>>> + if (!restore->restored_pages) {
>>>>> + dma_addr_t *dma_addr = alloc->dma_addr ?
>>>>> &restore->first_dma : NULL;
>>>>> +
>>>>> + ttm_pool_unmap_and_free(restore->pool,
>>>>> restore->alloced_page,
>>>>> + dma_addr,
>>>>> restore-
>>>>>> page_caching);
>>>>> + restore->restored_pages = nr;
>>>>> + }
>>>>> + return ret;
>>>>> + }
>>>>> +
>>>>> + ttm_pool_allocated_page_commit(restore->alloced_page,
>>>>> restore->first_dma,
>>>>> + alloc, nr);
>>>>> + if (restore->page_caching == alloc->tt_caching ||
>>>>> PageHighMem(restore->alloced_page))
>>>>> + alloc->caching_divide = alloc->pages;
>>>>> + restore->snapshot_alloc = *alloc;
>>>>> + restore->alloced_pages += nr;
>>>>> +
>>>>> + return 0;
>>>>> +}
>>>>> +
>>>>> +/* If restoring, save information needed for
>>>>> ttm_pool_restore_commit(). */
>>>>> +static void
>>>>> +ttm_pool_page_allocated_restore(struct ttm_pool *pool, unsigned
>>>>> int order,
>>>>> + struct page *p,
>>>>> + enum ttm_caching page_caching,
>>>>> + dma_addr_t first_dma,
>>>>> + struct ttm_pool_tt_restore
>>>>> *restore,
>>>>> + const struct
>>>>> ttm_pool_alloc_state
>>>>> *alloc)
>>>>> +{
>>>>> + restore->pool = pool;
>>>>> + restore->order = order;
>>>>> + restore->restored_pages = 0;
>>>>> + restore->page_caching = page_caching;
>>>>> + restore->first_dma = first_dma;
>>>>> + restore->alloced_page = p;
>>>>> + restore->snapshot_alloc = *alloc;
>>>>> +}
>>>>> +
>>>>> /*
>>>>> * Called when we got a page, either from a pool or newly
>>>>> allocated.
>>>>> * if needed, dma map the page and populate the dma address
>>>>> array.
>>>>> @@ -380,10 +590,11 @@ static unsigned int
>>>>> ttm_pool_page_order(struct ttm_pool *pool, struct page *p)
>>>>> */
>>>>> static int ttm_pool_page_allocated(struct ttm_pool *pool,
>>>>> unsigned int order,
>>>>> struct page *p, enum
>>>>> ttm_caching page_caching,
>>>>> - struct ttm_pool_alloc_state
>>>>> *alloc)
>>>>> + struct ttm_pool_alloc_state
>>>>> *alloc,
>>>>> + struct ttm_pool_tt_restore
>>>>> *restore)
>>>>> {
>>>>> - pgoff_t i, nr = 1UL << order;
>>>>> bool caching_consistent;
>>>>> + dma_addr_t first_dma;
>>>>> int r = 0;
>>>>>
>>>>> caching_consistent = (page_caching == alloc->tt_caching)
>>>>>>> PageHighMem(p);
>>>>> @@ -395,17 +606,20 @@ static int ttm_pool_page_allocated(struct
>>>>> ttm_pool *pool, unsigned int order,
>>>>> }
>>>>>
>>>>> if (alloc->dma_addr) {
>>>>> - r = ttm_pool_map(pool, order, p, &alloc-
>>>>>> dma_addr);
>>>>> + r = ttm_pool_map(pool, order, p, &first_dma);
>>>>> if (r)
>>>>> return r;
>>>>> }
>>>>>
>>>>> - alloc->remaining_pages -= nr;
>>>>> - for (i = 0; i < nr; ++i)
>>>>> - *alloc->pages++ = p++;
>>>>> + if (restore) {
>>>>> + ttm_pool_page_allocated_restore(pool, order, p,
>>>>> page_caching,
>>>>> + first_dma,
>>>>> restore, alloc);
>>>>> + } else {
>>>>> + ttm_pool_allocated_page_commit(p, first_dma,
>>>>> alloc, 1UL << order);
>>>>>
>>>>> - if (caching_consistent)
>>>>> - alloc->caching_divide = alloc->pages;
>>>>> + if (caching_consistent)
>>>>> + alloc->caching_divide = alloc->pages;
>>>>> + }
>>>>>
>>>>> return 0;
>>>>> }
>>>>> @@ -428,22 +642,24 @@ static void ttm_pool_free_range(struct
>>>>> ttm_pool *pool, struct ttm_tt *tt,
>>>>> pgoff_t start_page, pgoff_t
>>>>> end_page)
>>>>> {
>>>>> struct page **pages = &tt->pages[start_page];
>>>>> - unsigned int order;
>>>>> + struct ttm_backup *backup = tt->backup;
>>>>> pgoff_t i, nr;
>>>>>
>>>>> for (i = start_page; i < end_page; i += nr, pages += nr)
>>>>> {
>>>>> - struct ttm_pool_type *pt = NULL;
>>>>> + struct page *p = *pages;
>>>>>
>>>>> - order = ttm_pool_page_order(pool, *pages);
>>>>> - nr = (1UL << order);
>>>>> - if (tt->dma_address)
>>>>> - ttm_pool_unmap(pool, tt->dma_address[i],
>>>>> nr);
>>>>> + nr = 1;
>>>>> + if (ttm_backup_page_ptr_is_handle(p)) {
>>>>> + unsigned long handle =
>>>>> ttm_backup_page_ptr_to_handle(p);
>>>>>
>>>>> - pt = ttm_pool_select_type(pool, caching, order);
>>>>> - if (pt)
>>>>> - ttm_pool_type_give(pt, *pages);
>>>>> - else
>>>>> - ttm_pool_free_page(pool, caching, order,
>>>>> *pages);
>>>>> + if (handle != 0)
>>>>> + ttm_backup_drop(backup, handle);
>>>>> + } else if (p) {
>>>>> + dma_addr_t *dma_addr = tt->dma_address ?
>>>>> + tt->dma_address + i : NULL;
>>>>> +
>>>>> + nr = ttm_pool_unmap_and_free(pool, p,
>>>>> dma_addr, caching);
>>>>> + }
>>>>> }
>>>>> }
>>>>>
>>>>> @@ -467,22 +683,11 @@ static unsigned int
>>>>> ttm_pool_alloc_find_order(unsigned int highest,
>>>>> return min_t(unsigned int, highest, __fls(alloc-
>>>>>> remaining_pages));
>>>>> }
>>>>>
>>>>> -/**
>>>>> - * ttm_pool_alloc - Fill a ttm_tt object
>>>>> - *
>>>>> - * @pool: ttm_pool to use
>>>>> - * @tt: ttm_tt object to fill
>>>>> - * @ctx: operation context
>>>>> - *
>>>>> - * Fill the ttm_tt object with pages and also make sure to DMA
>>>>> map
>>>>> them when
>>>>> - * necessary.
>>>>> - *
>>>>> - * Returns: 0 on successe, negative error code otherwise.
>>>>> - */
>>>>> -int ttm_pool_alloc(struct ttm_pool *pool, struct ttm_tt *tt,
>>>>> - struct ttm_operation_ctx *ctx)
>>>>> +static int __ttm_pool_alloc(struct ttm_pool *pool, struct ttm_tt
>>>>> *tt,
>>>>> + const struct ttm_operation_ctx *ctx,
>>>>> + struct ttm_pool_alloc_state *alloc,
>>>>> + struct ttm_pool_tt_restore *restore)
>>>>> {
>>>>> - struct ttm_pool_alloc_state alloc;
>>>>> enum ttm_caching page_caching;
>>>>> gfp_t gfp_flags = GFP_USER;
>>>>> pgoff_t caching_divide;
>>>>> @@ -491,10 +696,8 @@ int ttm_pool_alloc(struct ttm_pool *pool,
>>>>> struct ttm_tt *tt,
>>>>> struct page *p;
>>>>> int r;
>>>>>
>>>>> - ttm_pool_alloc_state_init(tt, &alloc);
>>>>> -
>>>>> - WARN_ON(!alloc.remaining_pages ||
>>>>> ttm_tt_is_populated(tt));
>>>>> - WARN_ON(alloc.dma_addr && !pool->dev);
>>>>> + WARN_ON(!alloc->remaining_pages ||
>>>>> ttm_tt_is_populated(tt));
>>>>> + WARN_ON(alloc->dma_addr && !pool->dev);
>>>>>
>>>>> if (tt->page_flags & TTM_TT_FLAG_ZERO_ALLOC)
>>>>> gfp_flags |= __GFP_ZERO;
>>>>> @@ -509,9 +712,9 @@ int ttm_pool_alloc(struct ttm_pool *pool,
>>>>> struct ttm_tt *tt,
>>>>>
>>>>> page_caching = tt->caching;
>>>>> allow_pools = true;
>>>>> - for (order = ttm_pool_alloc_find_order(MAX_PAGE_ORDER,
>>>>> &alloc);
>>>>> - alloc.remaining_pages;
>>>>> - order = ttm_pool_alloc_find_order(order, &alloc)) {
>>>>> + for (order = ttm_pool_alloc_find_order(MAX_PAGE_ORDER,
>>>>> alloc);
>>>>> + alloc->remaining_pages;
>>>>> + order = ttm_pool_alloc_find_order(order, alloc)) {
>>>>> struct ttm_pool_type *pt;
>>>>>
>>>>> /* First, try to allocate a page from a pool if
>>>>> one exists. */
>>>>> @@ -541,30 +744,120 @@ int ttm_pool_alloc(struct ttm_pool *pool,
>>>>> struct ttm_tt *tt,
>>>>> r = -ENOMEM;
>>>>> goto error_free_all;
>>>>> }
>>>>> - r = ttm_pool_page_allocated(pool, order, p,
>>>>> page_caching, &alloc);
>>>>> + r = ttm_pool_page_allocated(pool, order, p,
>>>>> page_caching, alloc,
>>>>> + restore);
>>>>> if (r)
>>>>> goto error_free_page;
>>>>> +
>>>>> + if (ttm_pool_restore_valid(restore)) {
>>>>> + r = ttm_pool_restore_commit(restore, tt-
>>>>>> backup, ctx, alloc);
>>>>> + if (r)
>>>>> + goto error_free_all;
>>>>> + }
>>>>> }
>>>>>
>>>>> - r = ttm_pool_apply_caching(&alloc);
>>>>> + r = ttm_pool_apply_caching(alloc);
>>>>> if (r)
>>>>> goto error_free_all;
>>>>>
>>>>> + kfree(tt->restore);
>>>>> + tt->restore = NULL;
>>>>> +
>>>>> return 0;
>>>>>
>>>>> error_free_page:
>>>>> ttm_pool_free_page(pool, page_caching, order, p);
>>>>>
>>>>> error_free_all:
>>>>> - caching_divide = alloc.caching_divide - tt->pages;
>>>>> + if (tt->restore)
>>>>> + return r;
>>>>> +
>>>>> + caching_divide = alloc->caching_divide - tt->pages;
>>>>> ttm_pool_free_range(pool, tt, tt->caching, 0,
>>>>> caching_divide);
>>>>> ttm_pool_free_range(pool, tt, ttm_cached,
>>>>> caching_divide,
>>>>> - tt->num_pages -
>>>>> alloc.remaining_pages);
>>>>> + tt->num_pages - alloc-
>>>>>> remaining_pages);
>>>>> return r;
>>>>> }
>>>>> +
>>>>> +/**
>>>>> + * ttm_pool_alloc - Fill a ttm_tt object
>>>>> + *
>>>>> + * @pool: ttm_pool to use
>>>>> + * @tt: ttm_tt object to fill
>>>>> + * @ctx: operation context
>>>>> + *
>>>>> + * Fill the ttm_tt object with pages and also make sure to DMA
>>>>> map
>>>>> them when
>>>>> + * necessary.
>>>>> + *
>>>>> + * Returns: 0 on successe, negative error code otherwise.
>>>>> + */
>>>>> +int ttm_pool_alloc(struct ttm_pool *pool, struct ttm_tt *tt,
>>>>> + struct ttm_operation_ctx *ctx)
>>>>> +{
>>>>> + struct ttm_pool_alloc_state alloc;
>>>>> +
>>>>> + if (WARN_ON(ttm_tt_is_backed_up(tt)))
>>>>> + return -EINVAL;
>>>>> +
>>>>> + ttm_pool_alloc_state_init(tt, &alloc);
>>>>> +
>>>>> + return __ttm_pool_alloc(pool, tt, ctx, &alloc, NULL);
>>>>> +}
>>>>> EXPORT_SYMBOL(ttm_pool_alloc);
>>>>>
>>>>> +/**
>>>>> + * ttm_pool_restore_and_alloc - Fill a ttm_tt, restoring
>>>>> previously backed-up
>>>>> + * content.
>>>>> + *
>>>>> + * @pool: ttm_pool to use
>>>>> + * @tt: ttm_tt object to fill
>>>>> + * @ctx: operation context
>>>>> + *
>>>>> + * Fill the ttm_tt object with pages and also make sure to DMA
>>>>> map
>>>>> them when
>>>>> + * necessary. Read in backed-up content.
>>>>> + *
>>>>> + * Returns: 0 on successe, negative error code otherwise.
>>>>> + */
>>>>> +int ttm_pool_restore_and_alloc(struct ttm_pool *pool, struct
>>>>> ttm_tt *tt,
>>>>> + const struct ttm_operation_ctx
>>>>> *ctx)
>>>>> +{
>>>>> + struct ttm_pool_alloc_state alloc;
>>>>> +
>>>>> + if (WARN_ON(!ttm_tt_is_backed_up(tt)))
>>>>> + return -EINVAL;
>>>>> +
>>>>> + if (!tt->restore) {
>>>>> + gfp_t gfp = GFP_KERNEL | __GFP_NOWARN;
>>>>> +
>>>>> + ttm_pool_alloc_state_init(tt, &alloc);
>>>>> + if (ctx->gfp_retry_mayfail)
>>>>> + gfp |= __GFP_RETRY_MAYFAIL;
>>>>> +
>>>>> + tt->restore = kzalloc(sizeof(*tt->restore),
>>>>> gfp);
>>>>> + if (!tt->restore)
>>>>> + return -ENOMEM;
>>>>> +
>>>>> + tt->restore->snapshot_alloc = alloc;
>>>>> + tt->restore->pool = pool;
>>>>> + tt->restore->restored_pages = 1;
>>>>> + } else {
>>>>> + struct ttm_pool_tt_restore *restore = tt-
>>>>>> restore;
>>>>> + int ret;
>>>>> +
>>>>> + alloc = restore->snapshot_alloc;
>>>>> + if (ttm_pool_restore_valid(tt->restore)) {
>>>>> + ret = ttm_pool_restore_commit(restore,
>>>>> tt-
>>>>>> backup, ctx, &alloc);
>>>>> + if (ret)
>>>>> + return ret;
>>>>> + }
>>>>> + if (!alloc.remaining_pages)
>>>>> + return 0;
>>>>> + }
>>>>> +
>>>>> + return __ttm_pool_alloc(pool, tt, ctx, &alloc, tt-
>>>>>> restore);
>>>>> +}
>>>>> +
>>>>> /**
>>>>> * ttm_pool_free - Free the backing pages from a ttm_tt object
>>>>> *
>>>>> @@ -582,6 +875,163 @@ void ttm_pool_free(struct ttm_pool *pool,
>>>>> struct ttm_tt *tt)
>>>>> }
>>>>> EXPORT_SYMBOL(ttm_pool_free);
>>>>>
>>>>> +/**
>>>>> + * ttm_pool_drop_backed_up() - Release content of a swapped-out
>>>>> struct ttm_tt
>>>>> + * @tt: The struct ttm_tt.
>>>>> + *
>>>>> + * Release handles with associated content or any remaining
>>>>> pages
>>>>> of
>>>>> + * a backed-up struct ttm_tt.
>>>>> + */
>>>>> +void ttm_pool_drop_backed_up(struct ttm_tt *tt)
>>>>> +{
>>>>> + struct ttm_pool_tt_restore *restore;
>>>>> + pgoff_t start_page = 0;
>>>>> +
>>>>> + WARN_ON(!ttm_tt_is_backed_up(tt));
>>>>> +
>>>>> + restore = tt->restore;
>>>>> +
>>>>> + /*
>>>>> + * Unmap and free any uncommitted restore page.
>>>>> + * any tt page-array backup entries already read back
>>>>> has
>>>>> + * been cleared already
>>>>> + */
>>>>> + if (ttm_pool_restore_valid(restore)) {
>>>>> + dma_addr_t *dma_addr = tt->dma_address ?
>>>>> &restore-
>>>>>> first_dma : NULL;
>>>>> +
>>>>> + ttm_pool_unmap_and_free(restore->pool, restore-
>>>>>> alloced_page,
>>>>> + dma_addr, restore-
>>>>>> page_caching);
>>>>> + restore->restored_pages = 1UL << restore->order;
>>>>> + }
>>>>> +
>>>>> + /*
>>>>> + * If a restore is ongoing, part of the tt pages may
>>>>> have
>>>>> a
>>>>> + * caching different than writeback.
>>>>> + */
>>>>> + if (restore) {
>>>>> + pgoff_t mid = restore-
>>>>>> snapshot_alloc.caching_divide - tt->pages;
>>>>> +
>>>>> + start_page = restore->alloced_pages;
>>>>> + WARN_ON(mid > start_page);
>>>>> + /* Pages that might be dma-mapped and non-cached
>>>>> */
>>>>> + ttm_pool_free_range(restore->pool, tt, tt-
>>>>>> caching,
>>>>> + 0, mid);
>>>>> + /* Pages that might be dma-mapped but cached */
>>>>> + ttm_pool_free_range(restore->pool, tt,
>>>>> ttm_cached,
>>>>> + mid, restore-
>>>>>> alloced_pages);
>>>>> + kfree(restore);
>>>>> + tt->restore = NULL;
>>>>> + }
>>>>> +
>>>>> + ttm_pool_free_range(NULL, tt, ttm_cached, start_page,
>>>>> tt-
>>>>>> num_pages);
>>>>> +}
>>>>> +
>>>>> +/**
>>>>> + * ttm_pool_backup() - Back up or purge a struct ttm_tt
>>>>> + * @pool: The pool used when allocating the struct ttm_tt.
>>>>> + * @tt: The struct ttm_tt.
>>>>> + * @flags: Flags to govern the backup behaviour.
>>>>> + *
>>>>> + * Back up or purge a struct ttm_tt. If @purge is true, then
>>>>> + * all pages will be freed directly to the system rather than to
>>>>> the pool
>>>>> + * they were allocated from, making the function behave
>>>>> similarly
>>>>> to
>>>>> + * ttm_pool_free(). If @purge is false the pages will be backed
>>>>> up
>>>>> instead,
>>>>> + * exchanged for handles.
>>>>> + * A subsequent call to ttm_pool_restore_and_alloc() will then
>>>>> read back the content and
>>>>> + * a subsequent call to ttm_pool_drop_backed_up() will drop it.
>>>>> + * If backup of a page fails for whatever reason, @ttm will
>>>>> still
>>>>> be
>>>>> + * partially backed up, retaining those pages for which backup
>>>>> fails.
>>>>> + * In that case, this function can be retried, possibly after
>>>>> freeing up
>>>>> + * memory resources.
>>>>> + *
>>>>> + * Return: Number of pages actually backed up or freed, or
>>>>> negative
>>>>> + * error code on error.
>>>>> + */
>>>>> +long ttm_pool_backup(struct ttm_pool *pool, struct ttm_tt *tt,
>>>>> + const struct ttm_backup_flags *flags)
>>>>> +{
>>>>> + struct ttm_backup *backup = tt->backup;
>>>>> + struct page *page;
>>>>> + unsigned long handle;
>>>>> + gfp_t alloc_gfp;
>>>>> + gfp_t gfp;
>>>>> + int ret = 0;
>>>>> + pgoff_t shrunken = 0;
>>>>> + pgoff_t i, num_pages;
>>>>> +
>>>>> + if (WARN_ON(ttm_tt_is_backed_up(tt)))
>>>>> + return -EINVAL;
>>>>> +
>>>>> + if ((!ttm_backup_bytes_avail() && !flags->purge) ||
>>>>> + pool->use_dma_alloc || ttm_tt_is_backed_up(tt))
>>>>> + return -EBUSY;
>>>>> +
>>>>> +#ifdef CONFIG_X86
>>>>> + /* Anything returned to the system needs to be cached.
>>>>> */
>>>>> + if (tt->caching != ttm_cached)
>>>>> + set_pages_array_wb(tt->pages, tt->num_pages);
>>>>> +#endif
>>>>> +
>>>>> + if (tt->dma_address || flags->purge) {
>>>>> + for (i = 0; i < tt->num_pages; i += num_pages) {
>>>>> + unsigned int order;
>>>>> +
>>>>> + page = tt->pages[i];
>>>>> + if (unlikely(!page)) {
>>>>> + num_pages = 1;
>>>>> + continue;
>>>>> + }
>>>>> +
>>>>> + order = ttm_pool_page_order(pool, page);
>>>>> + num_pages = 1UL << order;
>>>>> + if (tt->dma_address)
>>>>> + ttm_pool_unmap(pool, tt-
>>>>>> dma_address[i],
>>>>> + num_pages);
>>>>> + if (flags->purge) {
>>>>> + shrunken += num_pages;
>>>>> + page->private = 0;
>>>>> + __free_pages(page, order);
>>>>> + memset(tt->pages + i, 0,
>>>>> + num_pages * sizeof(*tt-
>>>>>> pages));
>>>>> + }
>>>>> + }
>>>>> + }
>>>>> +
>>>>> + if (flags->purge)
>>>>> + return shrunken;
>>>>> +
>>>>> + if (pool->use_dma32)
>>>>> + gfp = GFP_DMA32;
>>>>> + else
>>>>> + gfp = GFP_HIGHUSER;
>>>>> +
>>>>> + alloc_gfp = GFP_KERNEL | __GFP_HIGH | __GFP_NOWARN |
>>>>> __GFP_RETRY_MAYFAIL;
>>>>> +
>>>>> + for (i = 0; i < tt->num_pages; ++i) {
>>>>> + s64 shandle;
>>>>> +
>>>>> + page = tt->pages[i];
>>>>> + if (unlikely(!page))
>>>>> + continue;
>>>>> +
>>>>> + ttm_pool_split_for_swap(pool, page);
>>>>> +
>>>>> + shandle = ttm_backup_backup_page(backup, page,
>>>>> flags->writeback, i,
>>>>> + gfp,
>>>>> alloc_gfp);
>>>>> + if (shandle < 0) {
>>>>> + /* We allow partially shrunken tts */
>>>>> + ret = shandle;
>>>>> + break;
>>>>> + }
>>>>> + handle = shandle;
>>>>> + tt->pages[i] =
>>>>> ttm_backup_handle_to_page_ptr(handle);
>>>>> + put_page(page);
>>>>> + shrunken++;
>>>>> + }
>>>>> +
>>>>> + return shrunken ? shrunken : ret;
>>>>> +}
>>>>> +
>>>>> /**
>>>>> * ttm_pool_init - Initialize a pool
>>>>> *
>>>>> diff --git a/drivers/gpu/drm/ttm/ttm_tt.c
>>>>> b/drivers/gpu/drm/ttm/ttm_tt.c
>>>>> index 3baf215eca23..00b7c28f2329 100644
>>>>> --- a/drivers/gpu/drm/ttm/ttm_tt.c
>>>>> +++ b/drivers/gpu/drm/ttm/ttm_tt.c
>>>>> @@ -40,6 +40,7 @@
>>>>> #include <drm/drm_cache.h>
>>>>> #include <drm/drm_device.h>
>>>>> #include <drm/drm_util.h>
>>>>> +#include <drm/ttm/ttm_backup.h>
>>>>> #include <drm/ttm/ttm_bo.h>
>>>>> #include <drm/ttm/ttm_tt.h>
>>>>>
>>>>> @@ -158,6 +159,8 @@ static void ttm_tt_init_fields(struct ttm_tt
>>>>> *ttm,
>>>>> ttm->swap_storage = NULL;
>>>>> ttm->sg = bo->sg;
>>>>> ttm->caching = caching;
>>>>> + ttm->restore = NULL;
>>>>> + ttm->backup = NULL;
>>>>> }
>>>>>
>>>>> int ttm_tt_init(struct ttm_tt *ttm, struct ttm_buffer_object
>>>>> *bo,
>>>>> @@ -182,6 +185,13 @@ void ttm_tt_fini(struct ttm_tt *ttm)
>>>>> fput(ttm->swap_storage);
>>>>> ttm->swap_storage = NULL;
>>>>>
>>>>> + if (ttm_tt_is_backed_up(ttm))
>>>>> + ttm_pool_drop_backed_up(ttm);
>>>>> + if (ttm->backup) {
>>>>> + ttm_backup_fini(ttm->backup);
>>>>> + ttm->backup = NULL;
>>>>> + }
>>>>> +
>>>>> if (ttm->pages)
>>>>> kvfree(ttm->pages);
>>>>> else
>>>>> @@ -253,6 +263,49 @@ int ttm_tt_swapin(struct ttm_tt *ttm)
>>>>> }
>>>>> EXPORT_SYMBOL_FOR_TESTS_ONLY(ttm_tt_swapin);
>>>>>
>>>>> +/**
>>>>> + * ttm_tt_backup() - Helper to back up a struct ttm_tt.
>>>>> + * @bdev: The TTM device.
>>>>> + * @tt: The struct ttm_tt.
>>>>> + * @flags: Flags that govern the backup behaviour.
>>>>> + *
>>>>> + * Update the page accounting and call ttm_pool_shrink_tt to
>>>>> free
>>>>> pages
>>>>> + * or back them up.
>>>>> + *
>>>>> + * Return: Number of pages freed or swapped out, or negative
>>>>> error
>>>>> code on
>>>>> + * error.
>>>>> + */
>>>>> +long ttm_tt_backup(struct ttm_device *bdev, struct ttm_tt *tt,
>>>>> + const struct ttm_backup_flags flags)
>>>>> +{
>>>>> + long ret;
>>>>> +
>>>>> + if (WARN_ON(IS_ERR_OR_NULL(tt->backup)))
>>>>> + return 0;
>>>>> +
>>>>> + ret = ttm_pool_backup(&bdev->pool, tt, &flags);
>>>>> + if (ret > 0) {
>>>>> + tt->page_flags &= ~TTM_TT_FLAG_PRIV_POPULATED;
>>>>> + tt->page_flags |= TTM_TT_FLAG_BACKED_UP;
>>>>> + }
>>>>> +
>>>>> + return ret;
>>>>> +}
>>>>> +
>>>>> +int ttm_tt_restore(struct ttm_device *bdev, struct ttm_tt *tt,
>>>>> + const struct ttm_operation_ctx *ctx)
>>>>> +{
>>>>> + int ret = ttm_pool_restore_and_alloc(&bdev->pool, tt,
>>>>> ctx);
>>>>> +
>>>>> + if (ret)
>>>>> + return ret;
>>>>> +
>>>>> + tt->page_flags &= ~TTM_TT_FLAG_BACKED_UP;
>>>>> +
>>>>> + return 0;
>>>>> +}
>>>>> +EXPORT_SYMBOL(ttm_tt_restore);
>>>>> +
>>>>> /**
>>>>> * ttm_tt_swapout - swap out tt object
>>>>> *
>>>>> @@ -348,6 +401,7 @@ int ttm_tt_populate(struct ttm_device *bdev,
>>>>> goto error;
>>>>>
>>>>> ttm->page_flags |= TTM_TT_FLAG_PRIV_POPULATED;
>>>>> + ttm->page_flags &= ~TTM_TT_FLAG_BACKED_UP;
>>>>> if (unlikely(ttm->page_flags & TTM_TT_FLAG_SWAPPED)) {
>>>>> ret = ttm_tt_swapin(ttm);
>>>>> if (unlikely(ret != 0)) {
>>>>> diff --git a/include/drm/ttm/ttm_pool.h
>>>>> b/include/drm/ttm/ttm_pool.h
>>>>> index 160d954a261e..54cd34a6e4c0 100644
>>>>> --- a/include/drm/ttm/ttm_pool.h
>>>>> +++ b/include/drm/ttm/ttm_pool.h
>>>>> @@ -33,6 +33,7 @@
>>>>>
>>>>> struct device;
>>>>> struct seq_file;
>>>>> +struct ttm_backup_flags;
>>>>> struct ttm_operation_ctx;
>>>>> struct ttm_pool;
>>>>> struct ttm_tt;
>>>>> @@ -89,6 +90,13 @@ void ttm_pool_fini(struct ttm_pool *pool);
>>>>>
>>>>> int ttm_pool_debugfs(struct ttm_pool *pool, struct seq_file
>>>>> *m);
>>>>>
>>>>> +void ttm_pool_drop_backed_up(struct ttm_tt *tt);
>>>>> +
>>>>> +long ttm_pool_backup(struct ttm_pool *pool, struct ttm_tt *ttm,
>>>>> + const struct ttm_backup_flags *flags);
>>>>> +int ttm_pool_restore_and_alloc(struct ttm_pool *pool, struct
>>>>> ttm_tt *tt,
>>>>> + const struct ttm_operation_ctx
>>>>> *ctx);
>>>>> +
>>>>> int ttm_pool_mgr_init(unsigned long num_pages);
>>>>> void ttm_pool_mgr_fini(void);
>>>>>
>>>>> diff --git a/include/drm/ttm/ttm_tt.h b/include/drm/ttm/ttm_tt.h
>>>>> index 991edafdb2dd..c736c01ac2ca 100644
>>>>> --- a/include/drm/ttm/ttm_tt.h
>>>>> +++ b/include/drm/ttm/ttm_tt.h
>>>>> @@ -32,11 +32,13 @@
>>>>> #include <drm/ttm/ttm_caching.h>
>>>>> #include <drm/ttm/ttm_kmap_iter.h>
>>>>>
>>>>> +struct ttm_backup;
>>>>> struct ttm_device;
>>>>> struct ttm_tt;
>>>>> struct ttm_resource;
>>>>> struct ttm_buffer_object;
>>>>> struct ttm_operation_ctx;
>>>>> +struct ttm_pool_tt_restore;
>>>>>
>>>>> /**
>>>>> * struct ttm_tt - This is a structure holding the pages,
>>>>> caching- and aperture
>>>>> @@ -85,17 +87,22 @@ struct ttm_tt {
>>>>> * fault handling abuses the DMA api a bit and
>>>>> dma_map_attrs can't be
>>>>> * used to assure pgprot always matches.
>>>>> *
>>>>> + * TTM_TT_FLAG_BACKED_UP: TTM internal only. This is set
>>>>> if the
>>>>> + * struct ttm_tt has been (possibly partially) backed
>>>>> up.
>>>>> + *
>>>>> * TTM_TT_FLAG_PRIV_POPULATED: TTM internal only. DO NOT
>>>>> USE. This is
>>>>> * set by TTM after ttm_tt_populate() has successfully
>>>>> returned, and is
>>>>> * then unset when TTM calls ttm_tt_unpopulate().
>>>>> + *
>>>>> */
>>>>> #define TTM_TT_FLAG_SWAPPED BIT(0)
>>>>> #define TTM_TT_FLAG_ZERO_ALLOC BIT(1)
>>>>> #define TTM_TT_FLAG_EXTERNAL BIT(2)
>>>>> #define TTM_TT_FLAG_EXTERNAL_MAPPABLE BIT(3)
>>>>> #define TTM_TT_FLAG_DECRYPTED BIT(4)
>>>>> +#define TTM_TT_FLAG_BACKED_UP BIT(5)
>>>>>
>>>>> -#define TTM_TT_FLAG_PRIV_POPULATED BIT(5)
>>>>> +#define TTM_TT_FLAG_PRIV_POPULATED BIT(6)
>>>>> uint32_t page_flags;
>>>>> /** @num_pages: Number of pages in the page array. */
>>>>> uint32_t num_pages;
>>>>> @@ -105,11 +112,20 @@ struct ttm_tt {
>>>>> dma_addr_t *dma_address;
>>>>> /** @swap_storage: Pointer to shmem struct file for swap
>>>>> storage. */
>>>>> struct file *swap_storage;
>>>>> + /**
>>>>> + * @backup: Pointer to backup struct for backed up tts.
>>>>> + * Could be unified with @swap_storage. Meanwhile, the
>>>>> driver's
>>>>> + * ttm_tt_create() callback is responsible for assigning
>>>>> + * this field.
>>>>> + */
>>>>> + struct ttm_backup *backup;
>>>>> /**
>>>>> * @caching: The current caching state of the pages, see
>>>>> enum
>>>>> * ttm_caching.
>>>>> */
>>>>> enum ttm_caching caching;
>>>>> + /** @restore: Partial restoration from backup state. TTM
>>>>> private */
>>>>> + struct ttm_pool_tt_restore *restore;
>>>>> };
>>>>>
>>>>> /**
>>>>> @@ -129,9 +145,38 @@ static inline bool
>>>>> ttm_tt_is_populated(struct
>>>>> ttm_tt *tt)
>>>>> return tt->page_flags & TTM_TT_FLAG_PRIV_POPULATED;
>>>>> }
>>>>>
>>>>> +/**
>>>>> + * ttm_tt_is_swapped() - Whether the ttm_tt is swapped out or
>>>>> backed up
>>>>> + * @tt: The struct ttm_tt.
>>>>> + *
>>>>> + * Return: true if swapped or backed up, false otherwise.
>>>>> + */
>>>>> static inline bool ttm_tt_is_swapped(const struct ttm_tt *tt)
>>>>> {
>>>>> - return tt->page_flags & TTM_TT_FLAG_SWAPPED;
>>>>> + return tt->page_flags & (TTM_TT_FLAG_SWAPPED |
>>>>> TTM_TT_FLAG_BACKED_UP);
>>>>> +}
>>>>> +
>>>>> +/**
>>>>> + * ttm_tt_is_backed_up() - Whether the ttm_tt backed up
>>>>> + * @tt: The struct ttm_tt.
>>>>> + *
>>>>> + * Return: true if swapped or backed up, false otherwise.
>>>>> + */
>>>>> +static inline bool ttm_tt_is_backed_up(const struct ttm_tt *tt)
>>>>> +{
>>>>> + return tt->page_flags & TTM_TT_FLAG_BACKED_UP;
>>>>> +}
>>>>> +
>>>>> +/**
>>>>> + * ttm_tt_clear_backed_up() - Clear the ttm_tt backed-up status
>>>>> + * @tt: The struct ttm_tt.
>>>>> + *
>>>>> + * Drivers can use this functionto clear the backed-up status,
>>>>> + * for example before destroying or re-validating a purged tt.
>>>>> + */
>>>>> +static inline void ttm_tt_clear_backed_up(struct ttm_tt *tt)
>>>>> +{
>>>>> + tt->page_flags &= ~TTM_TT_FLAG_BACKED_UP;
>>>>> }
>>>>>
>>>>> /**
>>>>> @@ -235,6 +280,24 @@ void ttm_tt_mgr_init(unsigned long
>>>>> num_pages,
>>>>> unsigned long num_dma32_pages);
>>>>> struct ttm_kmap_iter *ttm_kmap_iter_tt_init(struct
>>>>> ttm_kmap_iter_tt *iter_tt,
>>>>> struct ttm_tt *tt);
>>>>> unsigned long ttm_tt_pages_limit(void);
>>>>> +
>>>>> +/**
>>>>> + * struct ttm_backup_flags - Flags to govern backup behaviour.
>>>>> + * @purge: Free pages without backing up. Bypass pools.
>>>>> + * @writeback: Attempt to copy contents directly to swap space,
>>>>> even
>>>>> + * if that means blocking on writes to external memory.
>>>>> + */
>>>>> +struct ttm_backup_flags {
>>>>> + u32 purge : 1;
>>>>> + u32 writeback : 1;
>>>>> +};
>>>>> +
>>>>> +long ttm_tt_backup(struct ttm_device *bdev, struct ttm_tt *tt,
>>>>> + const struct ttm_backup_flags flags);
>>>>> +
>>>>> +int ttm_tt_restore(struct ttm_device *bdev, struct ttm_tt *tt,
>>>>> + const struct ttm_operation_ctx *ctx);
>>>>> +
>>>>> #if IS_ENABLED(CONFIG_AGP)
>>>>> #include <linux/agp_backend.h>
>>>>>
^ permalink raw reply [flat|nested] 26+ messages in thread* Re: RESEND Re: [PATCH v16 2/7] drm/ttm/pool, drm/ttm/tt: Provide a helper to shrink pages
2025-03-05 9:10 ` Christian König
@ 2025-03-06 10:05 ` Thomas Hellström
0 siblings, 0 replies; 26+ messages in thread
From: Thomas Hellström @ 2025-03-06 10:05 UTC (permalink / raw)
To: Christian König, Dave Airlie
Cc: intel-xe, Somalapuram Amaranath, Matthew Brost, dri-devel
On Wed, 2025-03-05 at 10:10 +0100, Christian König wrote:
> Yeah, it's sad but I probably won't find time for a deeper review
> anytime soon.
>
> So feel free to add my Acked-by as well.
>
> Christian.
Thanks, Christian, I added those acks and pushed the series.
I discussed a bit with Dave and Sima on how to avoid similar stalls in
the future, and the suggestion was to drop the maintainer ack
requirement for TTM, and instead use the "seek rough consensus, don't
push anything that would cause immediate protests." policy of core DRM,
still running major designs with you.
Would that work for you?
Thanks,
Thomas
>
> Am 05.03.25 um 04:01 schrieb Dave Airlie:
> > I've looked over the two patches mentioned here, I think they have
> > seen enough time and we need to unblock,
> >
> > Please add and merge them:
> > Acked-by: Dave Airlie <airlied@redhat.com>
> >
> > Dave.
> >
> > On Tue, 25 Feb 2025 at 18:44, Thomas Hellström
> > <thomas.hellstrom@linux.intel.com> wrote:
> > > Hi, Christian,
> > >
> > > Ping? I'd really want to get this in before -rc6
> > >
> > > Thanks,
> > > Thomas
> > >
> > >
> > >
> > > On Tue, 2025-02-18 at 16:40 +0100, Thomas Hellström wrote:
> > > > Hi, Christian,
> > > >
> > > > On Wed, 2025-02-05 at 15:02 +0100, Christian König wrote:
> > > > > Am 30.01.25 um 11:13 schrieb Thomas Hellström:
> > > > > > Provide a helper to shrink ttm_tt page-vectors on a per-
> > > > > > page
> > > > > > basis. A ttm_backup backend could then in theory get away
> > > > > > with
> > > > > > allocating a single temporary page for each struct ttm_tt.
> > > > > >
> > > > > > This is accomplished by splitting larger pages before
> > > > > > trying to
> > > > > > back them up.
> > > > > >
> > > > > > In the future we could allow ttm_backup to handle backing
> > > > > > up
> > > > > > large pages as well, but currently there's no benefit in
> > > > > > doing that, since the shmem backup backend would have to
> > > > > > split those anyway to avoid allocating too much temporary
> > > > > > memory, and if the backend instead inserts pages into the
> > > > > > swap-cache, those are split on reclaim by the core.
> > > > > >
> > > > > > Due to potential backup- and recover errors, allow
> > > > > > partially
> > > > > > swapped
> > > > > > out struct ttm_tt's, although mark them as swapped out
> > > > > > stopping
> > > > > > them
> > > > > > from being swapped out a second time. More details in the
> > > > > > ttm_pool.c
> > > > > > DOC section.
> > > > > >
> > > > > > v2:
> > > > > > - A couple of cleanups and error fixes in
> > > > > > ttm_pool_back_up_tt.
> > > > > > - s/back_up/backup/
> > > > > > - Add a writeback parameter to the exported interface.
> > > > > > v8:
> > > > > > - Use a struct for flags for readability (Matt Brost)
> > > > > > - Address misc other review comments (Matt Brost)
> > > > > > v9:
> > > > > > - Update the kerneldoc for the ttm_tt::backup field.
> > > > > > v10:
> > > > > > - Rebase.
> > > > > > v13:
> > > > > > - Rebase on ttm_backup interface change. Update kerneldoc.
> > > > > > - Rebase and adjust ttm_tt_is_swapped().
> > > > > > v15:
> > > > > > - Rebase on ttm_backup return value change.
> > > > > > - Rebase on previous restructuring of ttm_pool_alloc()
> > > > > > - Rework the ttm_pool backup interface (Christian König)
> > > > > > - Remove cond_resched() (Christian König)
> > > > > > - Get rid of the need to allocate an intermediate page
> > > > > > array
> > > > > > when restoring a multi-order page (Christian König)
> > > > > > - Update documentation.
> > > > > >
> > > > > > Cc: Christian König <christian.koenig@amd.com>
> > > > > > Cc: Somalapuram Amaranath <Amaranath.Somalapuram@amd.com>
> > > > > > Cc: Matthew Brost <matthew.brost@intel.com>
> > > > > > Cc: <dri-devel@lists.freedesktop.org>
> > > > > > Signed-off-by: Thomas Hellström
> > > > > > <thomas.hellstrom@linux.intel.com>
> > > > > > Reviewed-by: Matthew Brost <matthew.brost@intel.com>
> > > > > I've tried to wrap my head around all of this like twenty
> > > > > times in
> > > > > the
> > > > > last three month, but was always interrupted at some point.
> > > > >
> > > > > Feel free to add Acked-by: Christian Koenig
> > > > > <christian.koenig@amd.com>.
> > > > >
> > > > > Sorry,
> > > > > Christian.
> > > > Thanks a lot for all reviewing and comments so far. There are
> > > > two TTM
> > > > patches left in the series that don't have an ack by you:
> > > >
> > > > https://patchwork.freedesktop.org/patch/634715/?series=131815&rev=17
> > > > and
> > > >
> > > > https://patchwork.freedesktop.org/patch/634716/?series=131815&rev=17
> > > >
> > > > None of them particularly big considering the amount of doc
> > > > text.
> > > >
> > > > It'd be great if those could have an ack as well so we could
> > > > finally
> > > > merge this series.
> > > >
> > > > Thanks,
> > > > Thomas
> > > >
> > > >
> > > >
> > > >
> > > >
> > > >
> > > > > > ---
> > > > > > drivers/gpu/drm/ttm/ttm_pool.c | 554
> > > > > > +++++++++++++++++++++++++++++----
> > > > > > drivers/gpu/drm/ttm/ttm_tt.c | 54 ++++
> > > > > > include/drm/ttm/ttm_pool.h | 8 +
> > > > > > include/drm/ttm/ttm_tt.h | 67 +++-
> > > > > > 4 files changed, 629 insertions(+), 54 deletions(-)
> > > > > >
> > > > > > diff --git a/drivers/gpu/drm/ttm/ttm_pool.c
> > > > > > b/drivers/gpu/drm/ttm/ttm_pool.c
> > > > > > index c9eba76d5143..ffb7abf52bab 100644
> > > > > > --- a/drivers/gpu/drm/ttm/ttm_pool.c
> > > > > > +++ b/drivers/gpu/drm/ttm/ttm_pool.c
> > > > > > @@ -41,6 +41,7 @@
> > > > > > #include <asm/set_memory.h>
> > > > > > #endif
> > > > > >
> > > > > > +#include <drm/ttm/ttm_backup.h>
> > > > > > #include <drm/ttm/ttm_pool.h>
> > > > > > #include <drm/ttm/ttm_tt.h>
> > > > > > #include <drm/ttm/ttm_bo.h>
> > > > > > @@ -75,6 +76,35 @@ struct ttm_pool_alloc_state {
> > > > > > enum ttm_caching tt_caching;
> > > > > > };
> > > > > >
> > > > > > +/**
> > > > > > + * struct ttm_pool_tt_restore - State representing restore
> > > > > > from
> > > > > > backup
> > > > > > + * @pool: The pool used for page allocation while
> > > > > > restoring.
> > > > > > + * @snapshot_alloc: A snapshot of the most recent struct
> > > > > > ttm_pool_alloc_state.
> > > > > > + * @alloced_page: Pointer to the page most recently
> > > > > > allocated
> > > > > > from
> > > > > > a pool or system.
> > > > > > + * @first_dma: The dma address corresponding to
> > > > > > @alloced_page if
> > > > > > dma_mapping
> > > > > > + * is requested.
> > > > > > + * @alloced_pages: The number of allocated pages present
> > > > > > in the
> > > > > > struct ttm_tt
> > > > > > + * page vector from this restore session.
> > > > > > + * @restored_pages: The number of 4K pages restored for
> > > > > > @alloced_page (which
> > > > > > + * is typically a multi-order page).
> > > > > > + * @page_caching: The struct ttm_tt requested caching
> > > > > > + * @order: The order of @alloced_page.
> > > > > > + *
> > > > > > + * Recovery from backup might fail when we've recovered
> > > > > > less
> > > > > > than
> > > > > > the
> > > > > > + * full ttm_tt. In order not to loose any data (yet), keep
> > > > > > information
> > > > > > + * around that allows us to restart a failed ttm backup
> > > > > > recovery.
> > > > > > + */
> > > > > > +struct ttm_pool_tt_restore {
> > > > > > + struct ttm_pool *pool;
> > > > > > + struct ttm_pool_alloc_state snapshot_alloc;
> > > > > > + struct page *alloced_page;
> > > > > > + dma_addr_t first_dma;
> > > > > > + pgoff_t alloced_pages;
> > > > > > + pgoff_t restored_pages;
> > > > > > + enum ttm_caching page_caching;
> > > > > > + unsigned int order;
> > > > > > +};
> > > > > > +
> > > > > > static unsigned long page_pool_size;
> > > > > >
> > > > > > MODULE_PARM_DESC(page_pool_size, "Number of pages in the
> > > > > > WC/UC/DMA pool");
> > > > > > @@ -199,12 +229,11 @@ static int
> > > > > > ttm_pool_apply_caching(struct
> > > > > > ttm_pool_alloc_state *alloc)
> > > > > > return 0;
> > > > > > }
> > > > > >
> > > > > > -/* Map pages of 1 << order size and fill the DMA address
> > > > > > array
> > > > > > */
> > > > > > +/* DMA Map pages of 1 << order size and return the
> > > > > > resulting
> > > > > > dma_address. */
> > > > > > static int ttm_pool_map(struct ttm_pool *pool, unsigned
> > > > > > int
> > > > > > order,
> > > > > > - struct page *p, dma_addr_t **dma_addr)
> > > > > > + struct page *p, dma_addr_t *dma_addr)
> > > > > > {
> > > > > > dma_addr_t addr;
> > > > > > - unsigned int i;
> > > > > >
> > > > > > if (pool->use_dma_alloc) {
> > > > > > struct ttm_pool_dma *dma = (void *)p-
> > > > > > >private;
> > > > > > @@ -218,10 +247,7 @@ static int ttm_pool_map(struct
> > > > > > ttm_pool
> > > > > > *pool,
> > > > > > unsigned int order,
> > > > > > return -EFAULT;
> > > > > > }
> > > > > >
> > > > > > - for (i = 1 << order; i ; --i) {
> > > > > > - *(*dma_addr)++ = addr;
> > > > > > - addr += PAGE_SIZE;
> > > > > > - }
> > > > > > + *dma_addr = addr;
> > > > > >
> > > > > > return 0;
> > > > > > }
> > > > > > @@ -371,6 +397,190 @@ static unsigned int
> > > > > > ttm_pool_page_order(struct ttm_pool *pool, struct page *p)
> > > > > > return p->private;
> > > > > > }
> > > > > >
> > > > > > +/*
> > > > > > + * Split larger pages so that we can free each PAGE_SIZE
> > > > > > page as
> > > > > > soon
> > > > > > + * as it has been backed up, in order to avoid memory
> > > > > > pressure
> > > > > > during
> > > > > > + * reclaim.
> > > > > > + */
> > > > > > +static void ttm_pool_split_for_swap(struct ttm_pool *pool,
> > > > > > struct
> > > > > > page *p)
> > > > > > +{
> > > > > > + unsigned int order = ttm_pool_page_order(pool, p);
> > > > > > + pgoff_t nr;
> > > > > > +
> > > > > > + if (!order)
> > > > > > + return;
> > > > > > +
> > > > > > + split_page(p, order);
> > > > > > + nr = 1UL << order;
> > > > > > + while (nr--)
> > > > > > + (p++)->private = 0;
> > > > > > +}
> > > > > > +
> > > > > > +/**
> > > > > > + * DOC: Partial backup and restoration of a struct ttm_tt.
> > > > > > + *
> > > > > > + * Swapout using ttm_backup_backup_page() and swapin using
> > > > > > + * ttm_backup_copy_page() may fail.
> > > > > > + * The former most likely due to lack of swap-space or
> > > > > > memory,
> > > > > > the
> > > > > > latter due
> > > > > > + * to lack of memory or because of signal interruption
> > > > > > during
> > > > > > waits.
> > > > > > + *
> > > > > > + * Backup failure is easily handled by using a ttm_tt
> > > > > > pages
> > > > > > vector
> > > > > > that holds
> > > > > > + * both backup handles and page pointers. This has to be
> > > > > > taken
> > > > > > into account when
> > > > > > + * restoring such a ttm_tt from backup, and when freeing
> > > > > > it
> > > > > > while
> > > > > > backed up.
> > > > > > + * When restoring, for simplicity, new pages are actually
> > > > > > allocated from the
> > > > > > + * pool and the contents of any old pages are copied in
> > > > > > and then
> > > > > > the old pages
> > > > > > + * are released.
> > > > > > + *
> > > > > > + * For restoration failures, the struct
> > > > > > ttm_pool_tt_restore
> > > > > > holds
> > > > > > sufficient state
> > > > > > + * to be able to resume an interrupted restore, and that
> > > > > > structure
> > > > > > is freed once
> > > > > > + * the restoration is complete. If the struct ttm_tt is
> > > > > > destroyed
> > > > > > while there
> > > > > > + * is a valid struct ttm_pool_tt_restore attached, that is
> > > > > > also
> > > > > > properly taken
> > > > > > + * care of.
> > > > > > + */
> > > > > > +
> > > > > > +/* Is restore ongoing for the currently allocated page? */
> > > > > > +static bool ttm_pool_restore_valid(const struct
> > > > > > ttm_pool_tt_restore *restore)
> > > > > > +{
> > > > > > + return restore && restore->restored_pages < (1 <<
> > > > > > restore-
> > > > > > > order);
> > > > > > +}
> > > > > > +
> > > > > > +/* DMA unmap and free a multi-order page, either to the
> > > > > > relevant
> > > > > > pool or to system. */
> > > > > > +static pgoff_t ttm_pool_unmap_and_free(struct ttm_pool
> > > > > > *pool,
> > > > > > struct page *page,
> > > > > > + const dma_addr_t
> > > > > > *dma_addr,
> > > > > > enum ttm_caching caching)
> > > > > > +{
> > > > > > + struct ttm_pool_type *pt = NULL;
> > > > > > + unsigned int order;
> > > > > > + pgoff_t nr;
> > > > > > +
> > > > > > + if (pool) {
> > > > > > + order = ttm_pool_page_order(pool, page);
> > > > > > + nr = (1UL << order);
> > > > > > + if (dma_addr)
> > > > > > + ttm_pool_unmap(pool, *dma_addr, nr);
> > > > > > +
> > > > > > + pt = ttm_pool_select_type(pool, caching, order);
> > > > > > + } else {
> > > > > > + order = page->private;
> > > > > > + nr = (1UL << order);
> > > > > > + }
> > > > > > +
> > > > > > + if (pt)
> > > > > > + ttm_pool_type_give(pt, page);
> > > > > > + else
> > > > > > + ttm_pool_free_page(pool, caching, order, page);
> > > > > > +
> > > > > > + return nr;
> > > > > > +}
> > > > > > +
> > > > > > +/* Populate the page-array using the most recent allocated
> > > > > > multi-
> > > > > > order page. */
> > > > > > +static void ttm_pool_allocated_page_commit(struct page
> > > > > > *allocated,
> > > > > > + dma_addr_t first_dma,
> > > > > > + struct
> > > > > > ttm_pool_alloc_state *alloc,
> > > > > > + pgoff_t nr)
> > > > > > +{
> > > > > > + pgoff_t i;
> > > > > > +
> > > > > > + for (i = 0; i < nr; ++i)
> > > > > > + *alloc->pages++ = allocated++;
> > > > > > +
> > > > > > + alloc->remaining_pages -= nr;
> > > > > > +
> > > > > > + if (!alloc->dma_addr)
> > > > > > + return;
> > > > > > +
> > > > > > + for (i = 0; i < nr; ++i) {
> > > > > > + *alloc->dma_addr++ = first_dma;
> > > > > > + first_dma += PAGE_SIZE;
> > > > > > + }
> > > > > > +}
> > > > > > +
> > > > > > +/*
> > > > > > + * When restoring, restore backed-up content to the newly
> > > > > > allocated page and
> > > > > > + * if successful, populate the page-table and dma-address
> > > > > > arrays.
> > > > > > + */
> > > > > > +static int ttm_pool_restore_commit(struct
> > > > > > ttm_pool_tt_restore
> > > > > > *restore,
> > > > > > + struct ttm_backup *backup,
> > > > > > + const struct
> > > > > > ttm_operation_ctx
> > > > > > *ctx,
> > > > > > + struct ttm_pool_alloc_state
> > > > > > *alloc)
> > > > > > +
> > > > > > +{
> > > > > > + pgoff_t i, nr = 1UL << restore->order;
> > > > > > + struct page **first_page = alloc->pages;
> > > > > > + struct page *p;
> > > > > > + int ret = 0;
> > > > > > +
> > > > > > + for (i = restore->restored_pages; i < nr; ++i) {
> > > > > > + p = first_page[i];
> > > > > > + if (ttm_backup_page_ptr_is_handle(p)) {
> > > > > > + unsigned long handle =
> > > > > > ttm_backup_page_ptr_to_handle(p);
> > > > > > +
> > > > > > + if (handle == 0) {
> > > > > > + restore->restored_pages++;
> > > > > > + continue;
> > > > > > + }
> > > > > > +
> > > > > > + ret = ttm_backup_copy_page(backup,
> > > > > > restore->alloced_page + i,
> > > > > > + handle, ctx-
> > > > > > > interruptible);
> > > > > > + if (ret)
> > > > > > + break;
> > > > > > +
> > > > > > + ttm_backup_drop(backup, handle);
> > > > > > + } else if (p) {
> > > > > > + /*
> > > > > > + * We could probably avoid splitting the
> > > > > > old page
> > > > > > + * using clever logic, but ATM we don't
> > > > > > care, as
> > > > > > + * we prioritize releasing memory ASAP.
> > > > > > Note that
> > > > > > + * here, the old retained page is always
> > > > > > write-back
> > > > > > + * cached.
> > > > > > + */
> > > > > > + ttm_pool_split_for_swap(restore->pool,
> > > > > > p);
> > > > > > + copy_highpage(restore->alloced_page + i,
> > > > > > p);
> > > > > > + __free_pages(p, 0);
> > > > > > + }
> > > > > > +
> > > > > > + restore->restored_pages++;
> > > > > > + first_page[i] =
> > > > > > ttm_backup_handle_to_page_ptr(0);
> > > > > > + }
> > > > > > +
> > > > > > + if (ret) {
> > > > > > + if (!restore->restored_pages) {
> > > > > > + dma_addr_t *dma_addr = alloc->dma_addr ?
> > > > > > &restore->first_dma : NULL;
> > > > > > +
> > > > > > + ttm_pool_unmap_and_free(restore->pool,
> > > > > > restore->alloced_page,
> > > > > > + dma_addr,
> > > > > > restore-
> > > > > > > page_caching);
> > > > > > + restore->restored_pages = nr;
> > > > > > + }
> > > > > > + return ret;
> > > > > > + }
> > > > > > +
> > > > > > + ttm_pool_allocated_page_commit(restore->alloced_page,
> > > > > > restore->first_dma,
> > > > > > + alloc, nr);
> > > > > > + if (restore->page_caching == alloc->tt_caching ||
> > > > > > PageHighMem(restore->alloced_page))
> > > > > > + alloc->caching_divide = alloc->pages;
> > > > > > + restore->snapshot_alloc = *alloc;
> > > > > > + restore->alloced_pages += nr;
> > > > > > +
> > > > > > + return 0;
> > > > > > +}
> > > > > > +
> > > > > > +/* If restoring, save information needed for
> > > > > > ttm_pool_restore_commit(). */
> > > > > > +static void
> > > > > > +ttm_pool_page_allocated_restore(struct ttm_pool *pool,
> > > > > > unsigned
> > > > > > int order,
> > > > > > + struct page *p,
> > > > > > + enum ttm_caching page_caching,
> > > > > > + dma_addr_t first_dma,
> > > > > > + struct ttm_pool_tt_restore
> > > > > > *restore,
> > > > > > + const struct
> > > > > > ttm_pool_alloc_state
> > > > > > *alloc)
> > > > > > +{
> > > > > > + restore->pool = pool;
> > > > > > + restore->order = order;
> > > > > > + restore->restored_pages = 0;
> > > > > > + restore->page_caching = page_caching;
> > > > > > + restore->first_dma = first_dma;
> > > > > > + restore->alloced_page = p;
> > > > > > + restore->snapshot_alloc = *alloc;
> > > > > > +}
> > > > > > +
> > > > > > /*
> > > > > > * Called when we got a page, either from a pool or newly
> > > > > > allocated.
> > > > > > * if needed, dma map the page and populate the dma
> > > > > > address
> > > > > > array.
> > > > > > @@ -380,10 +590,11 @@ static unsigned int
> > > > > > ttm_pool_page_order(struct ttm_pool *pool, struct page *p)
> > > > > > */
> > > > > > static int ttm_pool_page_allocated(struct ttm_pool *pool,
> > > > > > unsigned int order,
> > > > > > struct page *p, enum
> > > > > > ttm_caching page_caching,
> > > > > > - struct ttm_pool_alloc_state
> > > > > > *alloc)
> > > > > > + struct ttm_pool_alloc_state
> > > > > > *alloc,
> > > > > > + struct ttm_pool_tt_restore
> > > > > > *restore)
> > > > > > {
> > > > > > - pgoff_t i, nr = 1UL << order;
> > > > > > bool caching_consistent;
> > > > > > + dma_addr_t first_dma;
> > > > > > int r = 0;
> > > > > >
> > > > > > caching_consistent = (page_caching == alloc-
> > > > > > >tt_caching)
> > > > > > > > PageHighMem(p);
> > > > > > @@ -395,17 +606,20 @@ static int
> > > > > > ttm_pool_page_allocated(struct
> > > > > > ttm_pool *pool, unsigned int order,
> > > > > > }
> > > > > >
> > > > > > if (alloc->dma_addr) {
> > > > > > - r = ttm_pool_map(pool, order, p, &alloc-
> > > > > > > dma_addr);
> > > > > > + r = ttm_pool_map(pool, order, p, &first_dma);
> > > > > > if (r)
> > > > > > return r;
> > > > > > }
> > > > > >
> > > > > > - alloc->remaining_pages -= nr;
> > > > > > - for (i = 0; i < nr; ++i)
> > > > > > - *alloc->pages++ = p++;
> > > > > > + if (restore) {
> > > > > > + ttm_pool_page_allocated_restore(pool, order, p,
> > > > > > page_caching,
> > > > > > + first_dma,
> > > > > > restore, alloc);
> > > > > > + } else {
> > > > > > + ttm_pool_allocated_page_commit(p, first_dma,
> > > > > > alloc, 1UL << order);
> > > > > >
> > > > > > - if (caching_consistent)
> > > > > > - alloc->caching_divide = alloc->pages;
> > > > > > + if (caching_consistent)
> > > > > > + alloc->caching_divide = alloc->pages;
> > > > > > + }
> > > > > >
> > > > > > return 0;
> > > > > > }
> > > > > > @@ -428,22 +642,24 @@ static void
> > > > > > ttm_pool_free_range(struct
> > > > > > ttm_pool *pool, struct ttm_tt *tt,
> > > > > > pgoff_t start_page,
> > > > > > pgoff_t
> > > > > > end_page)
> > > > > > {
> > > > > > struct page **pages = &tt->pages[start_page];
> > > > > > - unsigned int order;
> > > > > > + struct ttm_backup *backup = tt->backup;
> > > > > > pgoff_t i, nr;
> > > > > >
> > > > > > for (i = start_page; i < end_page; i += nr, pages
> > > > > > += nr)
> > > > > > {
> > > > > > - struct ttm_pool_type *pt = NULL;
> > > > > > + struct page *p = *pages;
> > > > > >
> > > > > > - order = ttm_pool_page_order(pool, *pages);
> > > > > > - nr = (1UL << order);
> > > > > > - if (tt->dma_address)
> > > > > > - ttm_pool_unmap(pool, tt->dma_address[i],
> > > > > > nr);
> > > > > > + nr = 1;
> > > > > > + if (ttm_backup_page_ptr_is_handle(p)) {
> > > > > > + unsigned long handle =
> > > > > > ttm_backup_page_ptr_to_handle(p);
> > > > > >
> > > > > > - pt = ttm_pool_select_type(pool, caching, order);
> > > > > > - if (pt)
> > > > > > - ttm_pool_type_give(pt, *pages);
> > > > > > - else
> > > > > > - ttm_pool_free_page(pool, caching, order,
> > > > > > *pages);
> > > > > > + if (handle != 0)
> > > > > > + ttm_backup_drop(backup, handle);
> > > > > > + } else if (p) {
> > > > > > + dma_addr_t *dma_addr = tt->dma_address ?
> > > > > > + tt->dma_address + i : NULL;
> > > > > > +
> > > > > > + nr = ttm_pool_unmap_and_free(pool, p,
> > > > > > dma_addr, caching);
> > > > > > + }
> > > > > > }
> > > > > > }
> > > > > >
> > > > > > @@ -467,22 +683,11 @@ static unsigned int
> > > > > > ttm_pool_alloc_find_order(unsigned int highest,
> > > > > > return min_t(unsigned int, highest, __fls(alloc-
> > > > > > > remaining_pages));
> > > > > > }
> > > > > >
> > > > > > -/**
> > > > > > - * ttm_pool_alloc - Fill a ttm_tt object
> > > > > > - *
> > > > > > - * @pool: ttm_pool to use
> > > > > > - * @tt: ttm_tt object to fill
> > > > > > - * @ctx: operation context
> > > > > > - *
> > > > > > - * Fill the ttm_tt object with pages and also make sure to
> > > > > > DMA
> > > > > > map
> > > > > > them when
> > > > > > - * necessary.
> > > > > > - *
> > > > > > - * Returns: 0 on successe, negative error code otherwise.
> > > > > > - */
> > > > > > -int ttm_pool_alloc(struct ttm_pool *pool, struct ttm_tt
> > > > > > *tt,
> > > > > > - struct ttm_operation_ctx *ctx)
> > > > > > +static int __ttm_pool_alloc(struct ttm_pool *pool, struct
> > > > > > ttm_tt
> > > > > > *tt,
> > > > > > + const struct ttm_operation_ctx *ctx,
> > > > > > + struct ttm_pool_alloc_state *alloc,
> > > > > > + struct ttm_pool_tt_restore *restore)
> > > > > > {
> > > > > > - struct ttm_pool_alloc_state alloc;
> > > > > > enum ttm_caching page_caching;
> > > > > > gfp_t gfp_flags = GFP_USER;
> > > > > > pgoff_t caching_divide;
> > > > > > @@ -491,10 +696,8 @@ int ttm_pool_alloc(struct ttm_pool
> > > > > > *pool,
> > > > > > struct ttm_tt *tt,
> > > > > > struct page *p;
> > > > > > int r;
> > > > > >
> > > > > > - ttm_pool_alloc_state_init(tt, &alloc);
> > > > > > -
> > > > > > - WARN_ON(!alloc.remaining_pages ||
> > > > > > ttm_tt_is_populated(tt));
> > > > > > - WARN_ON(alloc.dma_addr && !pool->dev);
> > > > > > + WARN_ON(!alloc->remaining_pages ||
> > > > > > ttm_tt_is_populated(tt));
> > > > > > + WARN_ON(alloc->dma_addr && !pool->dev);
> > > > > >
> > > > > > if (tt->page_flags & TTM_TT_FLAG_ZERO_ALLOC)
> > > > > > gfp_flags |= __GFP_ZERO;
> > > > > > @@ -509,9 +712,9 @@ int ttm_pool_alloc(struct ttm_pool
> > > > > > *pool,
> > > > > > struct ttm_tt *tt,
> > > > > >
> > > > > > page_caching = tt->caching;
> > > > > > allow_pools = true;
> > > > > > - for (order = ttm_pool_alloc_find_order(MAX_PAGE_ORDER,
> > > > > > &alloc);
> > > > > > - alloc.remaining_pages;
> > > > > > - order = ttm_pool_alloc_find_order(order, &alloc)) {
> > > > > > + for (order = ttm_pool_alloc_find_order(MAX_PAGE_ORDER,
> > > > > > alloc);
> > > > > > + alloc->remaining_pages;
> > > > > > + order = ttm_pool_alloc_find_order(order, alloc)) {
> > > > > > struct ttm_pool_type *pt;
> > > > > >
> > > > > > /* First, try to allocate a page from a
> > > > > > pool if
> > > > > > one exists. */
> > > > > > @@ -541,30 +744,120 @@ int ttm_pool_alloc(struct ttm_pool
> > > > > > *pool,
> > > > > > struct ttm_tt *tt,
> > > > > > r = -ENOMEM;
> > > > > > goto error_free_all;
> > > > > > }
> > > > > > - r = ttm_pool_page_allocated(pool, order, p,
> > > > > > page_caching, &alloc);
> > > > > > + r = ttm_pool_page_allocated(pool, order, p,
> > > > > > page_caching, alloc,
> > > > > > + restore);
> > > > > > if (r)
> > > > > > goto error_free_page;
> > > > > > +
> > > > > > + if (ttm_pool_restore_valid(restore)) {
> > > > > > + r = ttm_pool_restore_commit(restore, tt-
> > > > > > > backup, ctx, alloc);
> > > > > > + if (r)
> > > > > > + goto error_free_all;
> > > > > > + }
> > > > > > }
> > > > > >
> > > > > > - r = ttm_pool_apply_caching(&alloc);
> > > > > > + r = ttm_pool_apply_caching(alloc);
> > > > > > if (r)
> > > > > > goto error_free_all;
> > > > > >
> > > > > > + kfree(tt->restore);
> > > > > > + tt->restore = NULL;
> > > > > > +
> > > > > > return 0;
> > > > > >
> > > > > > error_free_page:
> > > > > > ttm_pool_free_page(pool, page_caching, order, p);
> > > > > >
> > > > > > error_free_all:
> > > > > > - caching_divide = alloc.caching_divide - tt->pages;
> > > > > > + if (tt->restore)
> > > > > > + return r;
> > > > > > +
> > > > > > + caching_divide = alloc->caching_divide - tt->pages;
> > > > > > ttm_pool_free_range(pool, tt, tt->caching, 0,
> > > > > > caching_divide);
> > > > > > ttm_pool_free_range(pool, tt, ttm_cached,
> > > > > > caching_divide,
> > > > > > - tt->num_pages -
> > > > > > alloc.remaining_pages);
> > > > > > + tt->num_pages - alloc-
> > > > > > > remaining_pages);
> > > > > > return r;
> > > > > > }
> > > > > > +
> > > > > > +/**
> > > > > > + * ttm_pool_alloc - Fill a ttm_tt object
> > > > > > + *
> > > > > > + * @pool: ttm_pool to use
> > > > > > + * @tt: ttm_tt object to fill
> > > > > > + * @ctx: operation context
> > > > > > + *
> > > > > > + * Fill the ttm_tt object with pages and also make sure to
> > > > > > DMA
> > > > > > map
> > > > > > them when
> > > > > > + * necessary.
> > > > > > + *
> > > > > > + * Returns: 0 on successe, negative error code otherwise.
> > > > > > + */
> > > > > > +int ttm_pool_alloc(struct ttm_pool *pool, struct ttm_tt
> > > > > > *tt,
> > > > > > + struct ttm_operation_ctx *ctx)
> > > > > > +{
> > > > > > + struct ttm_pool_alloc_state alloc;
> > > > > > +
> > > > > > + if (WARN_ON(ttm_tt_is_backed_up(tt)))
> > > > > > + return -EINVAL;
> > > > > > +
> > > > > > + ttm_pool_alloc_state_init(tt, &alloc);
> > > > > > +
> > > > > > + return __ttm_pool_alloc(pool, tt, ctx, &alloc, NULL);
> > > > > > +}
> > > > > > EXPORT_SYMBOL(ttm_pool_alloc);
> > > > > >
> > > > > > +/**
> > > > > > + * ttm_pool_restore_and_alloc - Fill a ttm_tt, restoring
> > > > > > previously backed-up
> > > > > > + * content.
> > > > > > + *
> > > > > > + * @pool: ttm_pool to use
> > > > > > + * @tt: ttm_tt object to fill
> > > > > > + * @ctx: operation context
> > > > > > + *
> > > > > > + * Fill the ttm_tt object with pages and also make sure to
> > > > > > DMA
> > > > > > map
> > > > > > them when
> > > > > > + * necessary. Read in backed-up content.
> > > > > > + *
> > > > > > + * Returns: 0 on successe, negative error code otherwise.
> > > > > > + */
> > > > > > +int ttm_pool_restore_and_alloc(struct ttm_pool *pool,
> > > > > > struct
> > > > > > ttm_tt *tt,
> > > > > > + const struct ttm_operation_ctx
> > > > > > *ctx)
> > > > > > +{
> > > > > > + struct ttm_pool_alloc_state alloc;
> > > > > > +
> > > > > > + if (WARN_ON(!ttm_tt_is_backed_up(tt)))
> > > > > > + return -EINVAL;
> > > > > > +
> > > > > > + if (!tt->restore) {
> > > > > > + gfp_t gfp = GFP_KERNEL | __GFP_NOWARN;
> > > > > > +
> > > > > > + ttm_pool_alloc_state_init(tt, &alloc);
> > > > > > + if (ctx->gfp_retry_mayfail)
> > > > > > + gfp |= __GFP_RETRY_MAYFAIL;
> > > > > > +
> > > > > > + tt->restore = kzalloc(sizeof(*tt->restore),
> > > > > > gfp);
> > > > > > + if (!tt->restore)
> > > > > > + return -ENOMEM;
> > > > > > +
> > > > > > + tt->restore->snapshot_alloc = alloc;
> > > > > > + tt->restore->pool = pool;
> > > > > > + tt->restore->restored_pages = 1;
> > > > > > + } else {
> > > > > > + struct ttm_pool_tt_restore *restore = tt-
> > > > > > > restore;
> > > > > > + int ret;
> > > > > > +
> > > > > > + alloc = restore->snapshot_alloc;
> > > > > > + if (ttm_pool_restore_valid(tt->restore)) {
> > > > > > + ret = ttm_pool_restore_commit(restore,
> > > > > > tt-
> > > > > > > backup, ctx, &alloc);
> > > > > > + if (ret)
> > > > > > + return ret;
> > > > > > + }
> > > > > > + if (!alloc.remaining_pages)
> > > > > > + return 0;
> > > > > > + }
> > > > > > +
> > > > > > + return __ttm_pool_alloc(pool, tt, ctx, &alloc, tt-
> > > > > > > restore);
> > > > > > +}
> > > > > > +
> > > > > > /**
> > > > > > * ttm_pool_free - Free the backing pages from a ttm_tt
> > > > > > object
> > > > > > *
> > > > > > @@ -582,6 +875,163 @@ void ttm_pool_free(struct ttm_pool
> > > > > > *pool,
> > > > > > struct ttm_tt *tt)
> > > > > > }
> > > > > > EXPORT_SYMBOL(ttm_pool_free);
> > > > > >
> > > > > > +/**
> > > > > > + * ttm_pool_drop_backed_up() - Release content of a
> > > > > > swapped-out
> > > > > > struct ttm_tt
> > > > > > + * @tt: The struct ttm_tt.
> > > > > > + *
> > > > > > + * Release handles with associated content or any
> > > > > > remaining
> > > > > > pages
> > > > > > of
> > > > > > + * a backed-up struct ttm_tt.
> > > > > > + */
> > > > > > +void ttm_pool_drop_backed_up(struct ttm_tt *tt)
> > > > > > +{
> > > > > > + struct ttm_pool_tt_restore *restore;
> > > > > > + pgoff_t start_page = 0;
> > > > > > +
> > > > > > + WARN_ON(!ttm_tt_is_backed_up(tt));
> > > > > > +
> > > > > > + restore = tt->restore;
> > > > > > +
> > > > > > + /*
> > > > > > + * Unmap and free any uncommitted restore page.
> > > > > > + * any tt page-array backup entries already read back
> > > > > > has
> > > > > > + * been cleared already
> > > > > > + */
> > > > > > + if (ttm_pool_restore_valid(restore)) {
> > > > > > + dma_addr_t *dma_addr = tt->dma_address ?
> > > > > > &restore-
> > > > > > > first_dma : NULL;
> > > > > > +
> > > > > > + ttm_pool_unmap_and_free(restore->pool, restore-
> > > > > > > alloced_page,
> > > > > > + dma_addr, restore-
> > > > > > > page_caching);
> > > > > > + restore->restored_pages = 1UL << restore->order;
> > > > > > + }
> > > > > > +
> > > > > > + /*
> > > > > > + * If a restore is ongoing, part of the tt pages may
> > > > > > have
> > > > > > a
> > > > > > + * caching different than writeback.
> > > > > > + */
> > > > > > + if (restore) {
> > > > > > + pgoff_t mid = restore-
> > > > > > > snapshot_alloc.caching_divide - tt->pages;
> > > > > > +
> > > > > > + start_page = restore->alloced_pages;
> > > > > > + WARN_ON(mid > start_page);
> > > > > > + /* Pages that might be dma-mapped and non-cached
> > > > > > */
> > > > > > + ttm_pool_free_range(restore->pool, tt, tt-
> > > > > > > caching,
> > > > > > + 0, mid);
> > > > > > + /* Pages that might be dma-mapped but cached */
> > > > > > + ttm_pool_free_range(restore->pool, tt,
> > > > > > ttm_cached,
> > > > > > + mid, restore-
> > > > > > > alloced_pages);
> > > > > > + kfree(restore);
> > > > > > + tt->restore = NULL;
> > > > > > + }
> > > > > > +
> > > > > > + ttm_pool_free_range(NULL, tt, ttm_cached, start_page,
> > > > > > tt-
> > > > > > > num_pages);
> > > > > > +}
> > > > > > +
> > > > > > +/**
> > > > > > + * ttm_pool_backup() - Back up or purge a struct ttm_tt
> > > > > > + * @pool: The pool used when allocating the struct ttm_tt.
> > > > > > + * @tt: The struct ttm_tt.
> > > > > > + * @flags: Flags to govern the backup behaviour.
> > > > > > + *
> > > > > > + * Back up or purge a struct ttm_tt. If @purge is true,
> > > > > > then
> > > > > > + * all pages will be freed directly to the system rather
> > > > > > than to
> > > > > > the pool
> > > > > > + * they were allocated from, making the function behave
> > > > > > similarly
> > > > > > to
> > > > > > + * ttm_pool_free(). If @purge is false the pages will be
> > > > > > backed
> > > > > > up
> > > > > > instead,
> > > > > > + * exchanged for handles.
> > > > > > + * A subsequent call to ttm_pool_restore_and_alloc() will
> > > > > > then
> > > > > > read back the content and
> > > > > > + * a subsequent call to ttm_pool_drop_backed_up() will
> > > > > > drop it.
> > > > > > + * If backup of a page fails for whatever reason, @ttm
> > > > > > will
> > > > > > still
> > > > > > be
> > > > > > + * partially backed up, retaining those pages for which
> > > > > > backup
> > > > > > fails.
> > > > > > + * In that case, this function can be retried, possibly
> > > > > > after
> > > > > > freeing up
> > > > > > + * memory resources.
> > > > > > + *
> > > > > > + * Return: Number of pages actually backed up or freed, or
> > > > > > negative
> > > > > > + * error code on error.
> > > > > > + */
> > > > > > +long ttm_pool_backup(struct ttm_pool *pool, struct ttm_tt
> > > > > > *tt,
> > > > > > + const struct ttm_backup_flags *flags)
> > > > > > +{
> > > > > > + struct ttm_backup *backup = tt->backup;
> > > > > > + struct page *page;
> > > > > > + unsigned long handle;
> > > > > > + gfp_t alloc_gfp;
> > > > > > + gfp_t gfp;
> > > > > > + int ret = 0;
> > > > > > + pgoff_t shrunken = 0;
> > > > > > + pgoff_t i, num_pages;
> > > > > > +
> > > > > > + if (WARN_ON(ttm_tt_is_backed_up(tt)))
> > > > > > + return -EINVAL;
> > > > > > +
> > > > > > + if ((!ttm_backup_bytes_avail() && !flags->purge) ||
> > > > > > + pool->use_dma_alloc || ttm_tt_is_backed_up(tt))
> > > > > > + return -EBUSY;
> > > > > > +
> > > > > > +#ifdef CONFIG_X86
> > > > > > + /* Anything returned to the system needs to be cached.
> > > > > > */
> > > > > > + if (tt->caching != ttm_cached)
> > > > > > + set_pages_array_wb(tt->pages, tt->num_pages);
> > > > > > +#endif
> > > > > > +
> > > > > > + if (tt->dma_address || flags->purge) {
> > > > > > + for (i = 0; i < tt->num_pages; i += num_pages) {
> > > > > > + unsigned int order;
> > > > > > +
> > > > > > + page = tt->pages[i];
> > > > > > + if (unlikely(!page)) {
> > > > > > + num_pages = 1;
> > > > > > + continue;
> > > > > > + }
> > > > > > +
> > > > > > + order = ttm_pool_page_order(pool, page);
> > > > > > + num_pages = 1UL << order;
> > > > > > + if (tt->dma_address)
> > > > > > + ttm_pool_unmap(pool, tt-
> > > > > > > dma_address[i],
> > > > > > + num_pages);
> > > > > > + if (flags->purge) {
> > > > > > + shrunken += num_pages;
> > > > > > + page->private = 0;
> > > > > > + __free_pages(page, order);
> > > > > > + memset(tt->pages + i, 0,
> > > > > > + num_pages * sizeof(*tt-
> > > > > > > pages));
> > > > > > + }
> > > > > > + }
> > > > > > + }
> > > > > > +
> > > > > > + if (flags->purge)
> > > > > > + return shrunken;
> > > > > > +
> > > > > > + if (pool->use_dma32)
> > > > > > + gfp = GFP_DMA32;
> > > > > > + else
> > > > > > + gfp = GFP_HIGHUSER;
> > > > > > +
> > > > > > + alloc_gfp = GFP_KERNEL | __GFP_HIGH | __GFP_NOWARN |
> > > > > > __GFP_RETRY_MAYFAIL;
> > > > > > +
> > > > > > + for (i = 0; i < tt->num_pages; ++i) {
> > > > > > + s64 shandle;
> > > > > > +
> > > > > > + page = tt->pages[i];
> > > > > > + if (unlikely(!page))
> > > > > > + continue;
> > > > > > +
> > > > > > + ttm_pool_split_for_swap(pool, page);
> > > > > > +
> > > > > > + shandle = ttm_backup_backup_page(backup, page,
> > > > > > flags->writeback, i,
> > > > > > + gfp,
> > > > > > alloc_gfp);
> > > > > > + if (shandle < 0) {
> > > > > > + /* We allow partially shrunken tts */
> > > > > > + ret = shandle;
> > > > > > + break;
> > > > > > + }
> > > > > > + handle = shandle;
> > > > > > + tt->pages[i] =
> > > > > > ttm_backup_handle_to_page_ptr(handle);
> > > > > > + put_page(page);
> > > > > > + shrunken++;
> > > > > > + }
> > > > > > +
> > > > > > + return shrunken ? shrunken : ret;
> > > > > > +}
> > > > > > +
> > > > > > /**
> > > > > > * ttm_pool_init - Initialize a pool
> > > > > > *
> > > > > > diff --git a/drivers/gpu/drm/ttm/ttm_tt.c
> > > > > > b/drivers/gpu/drm/ttm/ttm_tt.c
> > > > > > index 3baf215eca23..00b7c28f2329 100644
> > > > > > --- a/drivers/gpu/drm/ttm/ttm_tt.c
> > > > > > +++ b/drivers/gpu/drm/ttm/ttm_tt.c
> > > > > > @@ -40,6 +40,7 @@
> > > > > > #include <drm/drm_cache.h>
> > > > > > #include <drm/drm_device.h>
> > > > > > #include <drm/drm_util.h>
> > > > > > +#include <drm/ttm/ttm_backup.h>
> > > > > > #include <drm/ttm/ttm_bo.h>
> > > > > > #include <drm/ttm/ttm_tt.h>
> > > > > >
> > > > > > @@ -158,6 +159,8 @@ static void ttm_tt_init_fields(struct
> > > > > > ttm_tt
> > > > > > *ttm,
> > > > > > ttm->swap_storage = NULL;
> > > > > > ttm->sg = bo->sg;
> > > > > > ttm->caching = caching;
> > > > > > + ttm->restore = NULL;
> > > > > > + ttm->backup = NULL;
> > > > > > }
> > > > > >
> > > > > > int ttm_tt_init(struct ttm_tt *ttm, struct
> > > > > > ttm_buffer_object
> > > > > > *bo,
> > > > > > @@ -182,6 +185,13 @@ void ttm_tt_fini(struct ttm_tt *ttm)
> > > > > > fput(ttm->swap_storage);
> > > > > > ttm->swap_storage = NULL;
> > > > > >
> > > > > > + if (ttm_tt_is_backed_up(ttm))
> > > > > > + ttm_pool_drop_backed_up(ttm);
> > > > > > + if (ttm->backup) {
> > > > > > + ttm_backup_fini(ttm->backup);
> > > > > > + ttm->backup = NULL;
> > > > > > + }
> > > > > > +
> > > > > > if (ttm->pages)
> > > > > > kvfree(ttm->pages);
> > > > > > else
> > > > > > @@ -253,6 +263,49 @@ int ttm_tt_swapin(struct ttm_tt *ttm)
> > > > > > }
> > > > > > EXPORT_SYMBOL_FOR_TESTS_ONLY(ttm_tt_swapin);
> > > > > >
> > > > > > +/**
> > > > > > + * ttm_tt_backup() - Helper to back up a struct ttm_tt.
> > > > > > + * @bdev: The TTM device.
> > > > > > + * @tt: The struct ttm_tt.
> > > > > > + * @flags: Flags that govern the backup behaviour.
> > > > > > + *
> > > > > > + * Update the page accounting and call ttm_pool_shrink_tt
> > > > > > to
> > > > > > free
> > > > > > pages
> > > > > > + * or back them up.
> > > > > > + *
> > > > > > + * Return: Number of pages freed or swapped out, or
> > > > > > negative
> > > > > > error
> > > > > > code on
> > > > > > + * error.
> > > > > > + */
> > > > > > +long ttm_tt_backup(struct ttm_device *bdev, struct ttm_tt
> > > > > > *tt,
> > > > > > + const struct ttm_backup_flags flags)
> > > > > > +{
> > > > > > + long ret;
> > > > > > +
> > > > > > + if (WARN_ON(IS_ERR_OR_NULL(tt->backup)))
> > > > > > + return 0;
> > > > > > +
> > > > > > + ret = ttm_pool_backup(&bdev->pool, tt, &flags);
> > > > > > + if (ret > 0) {
> > > > > > + tt->page_flags &= ~TTM_TT_FLAG_PRIV_POPULATED;
> > > > > > + tt->page_flags |= TTM_TT_FLAG_BACKED_UP;
> > > > > > + }
> > > > > > +
> > > > > > + return ret;
> > > > > > +}
> > > > > > +
> > > > > > +int ttm_tt_restore(struct ttm_device *bdev, struct ttm_tt
> > > > > > *tt,
> > > > > > + const struct ttm_operation_ctx *ctx)
> > > > > > +{
> > > > > > + int ret = ttm_pool_restore_and_alloc(&bdev->pool, tt,
> > > > > > ctx);
> > > > > > +
> > > > > > + if (ret)
> > > > > > + return ret;
> > > > > > +
> > > > > > + tt->page_flags &= ~TTM_TT_FLAG_BACKED_UP;
> > > > > > +
> > > > > > + return 0;
> > > > > > +}
> > > > > > +EXPORT_SYMBOL(ttm_tt_restore);
> > > > > > +
> > > > > > /**
> > > > > > * ttm_tt_swapout - swap out tt object
> > > > > > *
> > > > > > @@ -348,6 +401,7 @@ int ttm_tt_populate(struct ttm_device
> > > > > > *bdev,
> > > > > > goto error;
> > > > > >
> > > > > > ttm->page_flags |= TTM_TT_FLAG_PRIV_POPULATED;
> > > > > > + ttm->page_flags &= ~TTM_TT_FLAG_BACKED_UP;
> > > > > > if (unlikely(ttm->page_flags &
> > > > > > TTM_TT_FLAG_SWAPPED)) {
> > > > > > ret = ttm_tt_swapin(ttm);
> > > > > > if (unlikely(ret != 0)) {
> > > > > > diff --git a/include/drm/ttm/ttm_pool.h
> > > > > > b/include/drm/ttm/ttm_pool.h
> > > > > > index 160d954a261e..54cd34a6e4c0 100644
> > > > > > --- a/include/drm/ttm/ttm_pool.h
> > > > > > +++ b/include/drm/ttm/ttm_pool.h
> > > > > > @@ -33,6 +33,7 @@
> > > > > >
> > > > > > struct device;
> > > > > > struct seq_file;
> > > > > > +struct ttm_backup_flags;
> > > > > > struct ttm_operation_ctx;
> > > > > > struct ttm_pool;
> > > > > > struct ttm_tt;
> > > > > > @@ -89,6 +90,13 @@ void ttm_pool_fini(struct ttm_pool
> > > > > > *pool);
> > > > > >
> > > > > > int ttm_pool_debugfs(struct ttm_pool *pool, struct
> > > > > > seq_file
> > > > > > *m);
> > > > > >
> > > > > > +void ttm_pool_drop_backed_up(struct ttm_tt *tt);
> > > > > > +
> > > > > > +long ttm_pool_backup(struct ttm_pool *pool, struct ttm_tt
> > > > > > *ttm,
> > > > > > + const struct ttm_backup_flags *flags);
> > > > > > +int ttm_pool_restore_and_alloc(struct ttm_pool *pool,
> > > > > > struct
> > > > > > ttm_tt *tt,
> > > > > > + const struct ttm_operation_ctx
> > > > > > *ctx);
> > > > > > +
> > > > > > int ttm_pool_mgr_init(unsigned long num_pages);
> > > > > > void ttm_pool_mgr_fini(void);
> > > > > >
> > > > > > diff --git a/include/drm/ttm/ttm_tt.h
> > > > > > b/include/drm/ttm/ttm_tt.h
> > > > > > index 991edafdb2dd..c736c01ac2ca 100644
> > > > > > --- a/include/drm/ttm/ttm_tt.h
> > > > > > +++ b/include/drm/ttm/ttm_tt.h
> > > > > > @@ -32,11 +32,13 @@
> > > > > > #include <drm/ttm/ttm_caching.h>
> > > > > > #include <drm/ttm/ttm_kmap_iter.h>
> > > > > >
> > > > > > +struct ttm_backup;
> > > > > > struct ttm_device;
> > > > > > struct ttm_tt;
> > > > > > struct ttm_resource;
> > > > > > struct ttm_buffer_object;
> > > > > > struct ttm_operation_ctx;
> > > > > > +struct ttm_pool_tt_restore;
> > > > > >
> > > > > > /**
> > > > > > * struct ttm_tt - This is a structure holding the pages,
> > > > > > caching- and aperture
> > > > > > @@ -85,17 +87,22 @@ struct ttm_tt {
> > > > > > * fault handling abuses the DMA api a bit and
> > > > > > dma_map_attrs can't be
> > > > > > * used to assure pgprot always matches.
> > > > > > *
> > > > > > + * TTM_TT_FLAG_BACKED_UP: TTM internal only. This is set
> > > > > > if the
> > > > > > + * struct ttm_tt has been (possibly partially) backed
> > > > > > up.
> > > > > > + *
> > > > > > * TTM_TT_FLAG_PRIV_POPULATED: TTM internal only.
> > > > > > DO NOT
> > > > > > USE. This is
> > > > > > * set by TTM after ttm_tt_populate() has
> > > > > > successfully
> > > > > > returned, and is
> > > > > > * then unset when TTM calls ttm_tt_unpopulate().
> > > > > > + *
> > > > > > */
> > > > > > #define TTM_TT_FLAG_SWAPPED BIT(0)
> > > > > > #define TTM_TT_FLAG_ZERO_ALLOC BIT(1)
> > > > > > #define TTM_TT_FLAG_EXTERNAL BIT(2)
> > > > > > #define TTM_TT_FLAG_EXTERNAL_MAPPABLE BIT(3)
> > > > > > #define TTM_TT_FLAG_DECRYPTED BIT(4)
> > > > > > +#define TTM_TT_FLAG_BACKED_UP BIT(5)
> > > > > >
> > > > > > -#define TTM_TT_FLAG_PRIV_POPULATED BIT(5)
> > > > > > +#define TTM_TT_FLAG_PRIV_POPULATED BIT(6)
> > > > > > uint32_t page_flags;
> > > > > > /** @num_pages: Number of pages in the page
> > > > > > array. */
> > > > > > uint32_t num_pages;
> > > > > > @@ -105,11 +112,20 @@ struct ttm_tt {
> > > > > > dma_addr_t *dma_address;
> > > > > > /** @swap_storage: Pointer to shmem struct file
> > > > > > for swap
> > > > > > storage. */
> > > > > > struct file *swap_storage;
> > > > > > + /**
> > > > > > + * @backup: Pointer to backup struct for backed up tts.
> > > > > > + * Could be unified with @swap_storage. Meanwhile, the
> > > > > > driver's
> > > > > > + * ttm_tt_create() callback is responsible for assigning
> > > > > > + * this field.
> > > > > > + */
> > > > > > + struct ttm_backup *backup;
> > > > > > /**
> > > > > > * @caching: The current caching state of the
> > > > > > pages, see
> > > > > > enum
> > > > > > * ttm_caching.
> > > > > > */
> > > > > > enum ttm_caching caching;
> > > > > > + /** @restore: Partial restoration from backup state. TTM
> > > > > > private */
> > > > > > + struct ttm_pool_tt_restore *restore;
> > > > > > };
> > > > > >
> > > > > > /**
> > > > > > @@ -129,9 +145,38 @@ static inline bool
> > > > > > ttm_tt_is_populated(struct
> > > > > > ttm_tt *tt)
> > > > > > return tt->page_flags &
> > > > > > TTM_TT_FLAG_PRIV_POPULATED;
> > > > > > }
> > > > > >
> > > > > > +/**
> > > > > > + * ttm_tt_is_swapped() - Whether the ttm_tt is swapped out
> > > > > > or
> > > > > > backed up
> > > > > > + * @tt: The struct ttm_tt.
> > > > > > + *
> > > > > > + * Return: true if swapped or backed up, false otherwise.
> > > > > > + */
> > > > > > static inline bool ttm_tt_is_swapped(const struct ttm_tt
> > > > > > *tt)
> > > > > > {
> > > > > > - return tt->page_flags & TTM_TT_FLAG_SWAPPED;
> > > > > > + return tt->page_flags & (TTM_TT_FLAG_SWAPPED |
> > > > > > TTM_TT_FLAG_BACKED_UP);
> > > > > > +}
> > > > > > +
> > > > > > +/**
> > > > > > + * ttm_tt_is_backed_up() - Whether the ttm_tt backed up
> > > > > > + * @tt: The struct ttm_tt.
> > > > > > + *
> > > > > > + * Return: true if swapped or backed up, false otherwise.
> > > > > > + */
> > > > > > +static inline bool ttm_tt_is_backed_up(const struct ttm_tt
> > > > > > *tt)
> > > > > > +{
> > > > > > + return tt->page_flags & TTM_TT_FLAG_BACKED_UP;
> > > > > > +}
> > > > > > +
> > > > > > +/**
> > > > > > + * ttm_tt_clear_backed_up() - Clear the ttm_tt backed-up
> > > > > > status
> > > > > > + * @tt: The struct ttm_tt.
> > > > > > + *
> > > > > > + * Drivers can use this functionto clear the backed-up
> > > > > > status,
> > > > > > + * for example before destroying or re-validating a purged
> > > > > > tt.
> > > > > > + */
> > > > > > +static inline void ttm_tt_clear_backed_up(struct ttm_tt
> > > > > > *tt)
> > > > > > +{
> > > > > > + tt->page_flags &= ~TTM_TT_FLAG_BACKED_UP;
> > > > > > }
> > > > > >
> > > > > > /**
> > > > > > @@ -235,6 +280,24 @@ void ttm_tt_mgr_init(unsigned long
> > > > > > num_pages,
> > > > > > unsigned long num_dma32_pages);
> > > > > > struct ttm_kmap_iter *ttm_kmap_iter_tt_init(struct
> > > > > > ttm_kmap_iter_tt *iter_tt,
> > > > > > struct ttm_tt
> > > > > > *tt);
> > > > > > unsigned long ttm_tt_pages_limit(void);
> > > > > > +
> > > > > > +/**
> > > > > > + * struct ttm_backup_flags - Flags to govern backup
> > > > > > behaviour.
> > > > > > + * @purge: Free pages without backing up. Bypass pools.
> > > > > > + * @writeback: Attempt to copy contents directly to swap
> > > > > > space,
> > > > > > even
> > > > > > + * if that means blocking on writes to external memory.
> > > > > > + */
> > > > > > +struct ttm_backup_flags {
> > > > > > + u32 purge : 1;
> > > > > > + u32 writeback : 1;
> > > > > > +};
> > > > > > +
> > > > > > +long ttm_tt_backup(struct ttm_device *bdev, struct ttm_tt
> > > > > > *tt,
> > > > > > + const struct ttm_backup_flags flags);
> > > > > > +
> > > > > > +int ttm_tt_restore(struct ttm_device *bdev, struct ttm_tt
> > > > > > *tt,
> > > > > > + const struct ttm_operation_ctx *ctx);
> > > > > > +
> > > > > > #if IS_ENABLED(CONFIG_AGP)
> > > > > > #include <linux/agp_backend.h>
> > > > > >
>
^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: RESEND Re: [PATCH v16 2/7] drm/ttm/pool, drm/ttm/tt: Provide a helper to shrink pages
2025-03-05 3:01 ` Dave Airlie
2025-03-05 9:10 ` Christian König
@ 2025-03-06 10:00 ` Thomas Hellström
1 sibling, 0 replies; 26+ messages in thread
From: Thomas Hellström @ 2025-03-06 10:00 UTC (permalink / raw)
To: Dave Airlie
Cc: Christian König, intel-xe, Somalapuram Amaranath,
Matthew Brost, dri-devel
On Wed, 2025-03-05 at 13:01 +1000, Dave Airlie wrote:
> I've looked over the two patches mentioned here, I think they have
> seen enough time and we need to unblock,
>
> Please add and merge them:
> Acked-by: Dave Airlie <airlied@redhat.com>
>
> Dave.
Thanks for unblocking, Dave. Pushed to drm-misc-next yesterday.
/Thomas
>
> On Tue, 25 Feb 2025 at 18:44, Thomas Hellström
> <thomas.hellstrom@linux.intel.com> wrote:
> >
> > Hi, Christian,
> >
> > Ping? I'd really want to get this in before -rc6
> >
> > Thanks,
> > Thomas
> >
> >
> >
> > On Tue, 2025-02-18 at 16:40 +0100, Thomas Hellström wrote:
> > > Hi, Christian,
> > >
> > > On Wed, 2025-02-05 at 15:02 +0100, Christian König wrote:
> > > > Am 30.01.25 um 11:13 schrieb Thomas Hellström:
> > > > > Provide a helper to shrink ttm_tt page-vectors on a per-page
> > > > > basis. A ttm_backup backend could then in theory get away
> > > > > with
> > > > > allocating a single temporary page for each struct ttm_tt.
> > > > >
> > > > > This is accomplished by splitting larger pages before trying
> > > > > to
> > > > > back them up.
> > > > >
> > > > > In the future we could allow ttm_backup to handle backing up
> > > > > large pages as well, but currently there's no benefit in
> > > > > doing that, since the shmem backup backend would have to
> > > > > split those anyway to avoid allocating too much temporary
> > > > > memory, and if the backend instead inserts pages into the
> > > > > swap-cache, those are split on reclaim by the core.
> > > > >
> > > > > Due to potential backup- and recover errors, allow partially
> > > > > swapped
> > > > > out struct ttm_tt's, although mark them as swapped out
> > > > > stopping
> > > > > them
> > > > > from being swapped out a second time. More details in the
> > > > > ttm_pool.c
> > > > > DOC section.
> > > > >
> > > > > v2:
> > > > > - A couple of cleanups and error fixes in
> > > > > ttm_pool_back_up_tt.
> > > > > - s/back_up/backup/
> > > > > - Add a writeback parameter to the exported interface.
> > > > > v8:
> > > > > - Use a struct for flags for readability (Matt Brost)
> > > > > - Address misc other review comments (Matt Brost)
> > > > > v9:
> > > > > - Update the kerneldoc for the ttm_tt::backup field.
> > > > > v10:
> > > > > - Rebase.
> > > > > v13:
> > > > > - Rebase on ttm_backup interface change. Update kerneldoc.
> > > > > - Rebase and adjust ttm_tt_is_swapped().
> > > > > v15:
> > > > > - Rebase on ttm_backup return value change.
> > > > > - Rebase on previous restructuring of ttm_pool_alloc()
> > > > > - Rework the ttm_pool backup interface (Christian König)
> > > > > - Remove cond_resched() (Christian König)
> > > > > - Get rid of the need to allocate an intermediate page array
> > > > > when restoring a multi-order page (Christian König)
> > > > > - Update documentation.
> > > > >
> > > > > Cc: Christian König <christian.koenig@amd.com>
> > > > > Cc: Somalapuram Amaranath <Amaranath.Somalapuram@amd.com>
> > > > > Cc: Matthew Brost <matthew.brost@intel.com>
> > > > > Cc: <dri-devel@lists.freedesktop.org>
> > > > > Signed-off-by: Thomas Hellström
> > > > > <thomas.hellstrom@linux.intel.com>
> > > > > Reviewed-by: Matthew Brost <matthew.brost@intel.com>
> > > >
> > > > I've tried to wrap my head around all of this like twenty times
> > > > in
> > > > the
> > > > last three month, but was always interrupted at some point.
> > > >
> > > > Feel free to add Acked-by: Christian Koenig
> > > > <christian.koenig@amd.com>.
> > > >
> > > > Sorry,
> > > > Christian.
> > >
> > > Thanks a lot for all reviewing and comments so far. There are two
> > > TTM
> > > patches left in the series that don't have an ack by you:
> > >
> > > https://patchwork.freedesktop.org/patch/634715/?series=131815&rev=17
> > > and
> > >
> > > https://patchwork.freedesktop.org/patch/634716/?series=131815&rev=17
> > >
> > > None of them particularly big considering the amount of doc text.
> > >
> > > It'd be great if those could have an ack as well so we could
> > > finally
> > > merge this series.
> > >
> > > Thanks,
> > > Thomas
> > >
> > >
> > >
> > >
> > >
> > >
> > > >
> > > > > ---
> > > > > drivers/gpu/drm/ttm/ttm_pool.c | 554
> > > > > +++++++++++++++++++++++++++++----
> > > > > drivers/gpu/drm/ttm/ttm_tt.c | 54 ++++
> > > > > include/drm/ttm/ttm_pool.h | 8 +
> > > > > include/drm/ttm/ttm_tt.h | 67 +++-
> > > > > 4 files changed, 629 insertions(+), 54 deletions(-)
> > > > >
> > > > > diff --git a/drivers/gpu/drm/ttm/ttm_pool.c
> > > > > b/drivers/gpu/drm/ttm/ttm_pool.c
> > > > > index c9eba76d5143..ffb7abf52bab 100644
> > > > > --- a/drivers/gpu/drm/ttm/ttm_pool.c
> > > > > +++ b/drivers/gpu/drm/ttm/ttm_pool.c
> > > > > @@ -41,6 +41,7 @@
> > > > > #include <asm/set_memory.h>
> > > > > #endif
> > > > >
> > > > > +#include <drm/ttm/ttm_backup.h>
> > > > > #include <drm/ttm/ttm_pool.h>
> > > > > #include <drm/ttm/ttm_tt.h>
> > > > > #include <drm/ttm/ttm_bo.h>
> > > > > @@ -75,6 +76,35 @@ struct ttm_pool_alloc_state {
> > > > > enum ttm_caching tt_caching;
> > > > > };
> > > > >
> > > > > +/**
> > > > > + * struct ttm_pool_tt_restore - State representing restore
> > > > > from
> > > > > backup
> > > > > + * @pool: The pool used for page allocation while restoring.
> > > > > + * @snapshot_alloc: A snapshot of the most recent struct
> > > > > ttm_pool_alloc_state.
> > > > > + * @alloced_page: Pointer to the page most recently
> > > > > allocated
> > > > > from
> > > > > a pool or system.
> > > > > + * @first_dma: The dma address corresponding to
> > > > > @alloced_page if
> > > > > dma_mapping
> > > > > + * is requested.
> > > > > + * @alloced_pages: The number of allocated pages present in
> > > > > the
> > > > > struct ttm_tt
> > > > > + * page vector from this restore session.
> > > > > + * @restored_pages: The number of 4K pages restored for
> > > > > @alloced_page (which
> > > > > + * is typically a multi-order page).
> > > > > + * @page_caching: The struct ttm_tt requested caching
> > > > > + * @order: The order of @alloced_page.
> > > > > + *
> > > > > + * Recovery from backup might fail when we've recovered less
> > > > > than
> > > > > the
> > > > > + * full ttm_tt. In order not to loose any data (yet), keep
> > > > > information
> > > > > + * around that allows us to restart a failed ttm backup
> > > > > recovery.
> > > > > + */
> > > > > +struct ttm_pool_tt_restore {
> > > > > + struct ttm_pool *pool;
> > > > > + struct ttm_pool_alloc_state snapshot_alloc;
> > > > > + struct page *alloced_page;
> > > > > + dma_addr_t first_dma;
> > > > > + pgoff_t alloced_pages;
> > > > > + pgoff_t restored_pages;
> > > > > + enum ttm_caching page_caching;
> > > > > + unsigned int order;
> > > > > +};
> > > > > +
> > > > > static unsigned long page_pool_size;
> > > > >
> > > > > MODULE_PARM_DESC(page_pool_size, "Number of pages in the
> > > > > WC/UC/DMA pool");
> > > > > @@ -199,12 +229,11 @@ static int
> > > > > ttm_pool_apply_caching(struct
> > > > > ttm_pool_alloc_state *alloc)
> > > > > return 0;
> > > > > }
> > > > >
> > > > > -/* Map pages of 1 << order size and fill the DMA address
> > > > > array
> > > > > */
> > > > > +/* DMA Map pages of 1 << order size and return the resulting
> > > > > dma_address. */
> > > > > static int ttm_pool_map(struct ttm_pool *pool, unsigned int
> > > > > order,
> > > > > - struct page *p, dma_addr_t **dma_addr)
> > > > > + struct page *p, dma_addr_t *dma_addr)
> > > > > {
> > > > > dma_addr_t addr;
> > > > > - unsigned int i;
> > > > >
> > > > > if (pool->use_dma_alloc) {
> > > > > struct ttm_pool_dma *dma = (void *)p-
> > > > > >private;
> > > > > @@ -218,10 +247,7 @@ static int ttm_pool_map(struct ttm_pool
> > > > > *pool,
> > > > > unsigned int order,
> > > > > return -EFAULT;
> > > > > }
> > > > >
> > > > > - for (i = 1 << order; i ; --i) {
> > > > > - *(*dma_addr)++ = addr;
> > > > > - addr += PAGE_SIZE;
> > > > > - }
> > > > > + *dma_addr = addr;
> > > > >
> > > > > return 0;
> > > > > }
> > > > > @@ -371,6 +397,190 @@ static unsigned int
> > > > > ttm_pool_page_order(struct ttm_pool *pool, struct page *p)
> > > > > return p->private;
> > > > > }
> > > > >
> > > > > +/*
> > > > > + * Split larger pages so that we can free each PAGE_SIZE
> > > > > page as
> > > > > soon
> > > > > + * as it has been backed up, in order to avoid memory
> > > > > pressure
> > > > > during
> > > > > + * reclaim.
> > > > > + */
> > > > > +static void ttm_pool_split_for_swap(struct ttm_pool *pool,
> > > > > struct
> > > > > page *p)
> > > > > +{
> > > > > + unsigned int order = ttm_pool_page_order(pool, p);
> > > > > + pgoff_t nr;
> > > > > +
> > > > > + if (!order)
> > > > > + return;
> > > > > +
> > > > > + split_page(p, order);
> > > > > + nr = 1UL << order;
> > > > > + while (nr--)
> > > > > + (p++)->private = 0;
> > > > > +}
> > > > > +
> > > > > +/**
> > > > > + * DOC: Partial backup and restoration of a struct ttm_tt.
> > > > > + *
> > > > > + * Swapout using ttm_backup_backup_page() and swapin using
> > > > > + * ttm_backup_copy_page() may fail.
> > > > > + * The former most likely due to lack of swap-space or
> > > > > memory,
> > > > > the
> > > > > latter due
> > > > > + * to lack of memory or because of signal interruption
> > > > > during
> > > > > waits.
> > > > > + *
> > > > > + * Backup failure is easily handled by using a ttm_tt pages
> > > > > vector
> > > > > that holds
> > > > > + * both backup handles and page pointers. This has to be
> > > > > taken
> > > > > into account when
> > > > > + * restoring such a ttm_tt from backup, and when freeing it
> > > > > while
> > > > > backed up.
> > > > > + * When restoring, for simplicity, new pages are actually
> > > > > allocated from the
> > > > > + * pool and the contents of any old pages are copied in and
> > > > > then
> > > > > the old pages
> > > > > + * are released.
> > > > > + *
> > > > > + * For restoration failures, the struct ttm_pool_tt_restore
> > > > > holds
> > > > > sufficient state
> > > > > + * to be able to resume an interrupted restore, and that
> > > > > structure
> > > > > is freed once
> > > > > + * the restoration is complete. If the struct ttm_tt is
> > > > > destroyed
> > > > > while there
> > > > > + * is a valid struct ttm_pool_tt_restore attached, that is
> > > > > also
> > > > > properly taken
> > > > > + * care of.
> > > > > + */
> > > > > +
> > > > > +/* Is restore ongoing for the currently allocated page? */
> > > > > +static bool ttm_pool_restore_valid(const struct
> > > > > ttm_pool_tt_restore *restore)
> > > > > +{
> > > > > + return restore && restore->restored_pages < (1 <<
> > > > > restore-
> > > > > > order);
> > > > > +}
> > > > > +
> > > > > +/* DMA unmap and free a multi-order page, either to the
> > > > > relevant
> > > > > pool or to system. */
> > > > > +static pgoff_t ttm_pool_unmap_and_free(struct ttm_pool
> > > > > *pool,
> > > > > struct page *page,
> > > > > + const dma_addr_t
> > > > > *dma_addr,
> > > > > enum ttm_caching caching)
> > > > > +{
> > > > > + struct ttm_pool_type *pt = NULL;
> > > > > + unsigned int order;
> > > > > + pgoff_t nr;
> > > > > +
> > > > > + if (pool) {
> > > > > + order = ttm_pool_page_order(pool, page);
> > > > > + nr = (1UL << order);
> > > > > + if (dma_addr)
> > > > > + ttm_pool_unmap(pool, *dma_addr, nr);
> > > > > +
> > > > > + pt = ttm_pool_select_type(pool, caching, order);
> > > > > + } else {
> > > > > + order = page->private;
> > > > > + nr = (1UL << order);
> > > > > + }
> > > > > +
> > > > > + if (pt)
> > > > > + ttm_pool_type_give(pt, page);
> > > > > + else
> > > > > + ttm_pool_free_page(pool, caching, order, page);
> > > > > +
> > > > > + return nr;
> > > > > +}
> > > > > +
> > > > > +/* Populate the page-array using the most recent allocated
> > > > > multi-
> > > > > order page. */
> > > > > +static void ttm_pool_allocated_page_commit(struct page
> > > > > *allocated,
> > > > > + dma_addr_t first_dma,
> > > > > + struct
> > > > > ttm_pool_alloc_state *alloc,
> > > > > + pgoff_t nr)
> > > > > +{
> > > > > + pgoff_t i;
> > > > > +
> > > > > + for (i = 0; i < nr; ++i)
> > > > > + *alloc->pages++ = allocated++;
> > > > > +
> > > > > + alloc->remaining_pages -= nr;
> > > > > +
> > > > > + if (!alloc->dma_addr)
> > > > > + return;
> > > > > +
> > > > > + for (i = 0; i < nr; ++i) {
> > > > > + *alloc->dma_addr++ = first_dma;
> > > > > + first_dma += PAGE_SIZE;
> > > > > + }
> > > > > +}
> > > > > +
> > > > > +/*
> > > > > + * When restoring, restore backed-up content to the newly
> > > > > allocated page and
> > > > > + * if successful, populate the page-table and dma-address
> > > > > arrays.
> > > > > + */
> > > > > +static int ttm_pool_restore_commit(struct
> > > > > ttm_pool_tt_restore
> > > > > *restore,
> > > > > + struct ttm_backup *backup,
> > > > > + const struct
> > > > > ttm_operation_ctx
> > > > > *ctx,
> > > > > + struct ttm_pool_alloc_state
> > > > > *alloc)
> > > > > +
> > > > > +{
> > > > > + pgoff_t i, nr = 1UL << restore->order;
> > > > > + struct page **first_page = alloc->pages;
> > > > > + struct page *p;
> > > > > + int ret = 0;
> > > > > +
> > > > > + for (i = restore->restored_pages; i < nr; ++i) {
> > > > > + p = first_page[i];
> > > > > + if (ttm_backup_page_ptr_is_handle(p)) {
> > > > > + unsigned long handle =
> > > > > ttm_backup_page_ptr_to_handle(p);
> > > > > +
> > > > > + if (handle == 0) {
> > > > > + restore->restored_pages++;
> > > > > + continue;
> > > > > + }
> > > > > +
> > > > > + ret = ttm_backup_copy_page(backup,
> > > > > restore->alloced_page + i,
> > > > > + handle, ctx-
> > > > > > interruptible);
> > > > > + if (ret)
> > > > > + break;
> > > > > +
> > > > > + ttm_backup_drop(backup, handle);
> > > > > + } else if (p) {
> > > > > + /*
> > > > > + * We could probably avoid splitting the
> > > > > old page
> > > > > + * using clever logic, but ATM we don't
> > > > > care, as
> > > > > + * we prioritize releasing memory ASAP.
> > > > > Note that
> > > > > + * here, the old retained page is always
> > > > > write-back
> > > > > + * cached.
> > > > > + */
> > > > > + ttm_pool_split_for_swap(restore->pool,
> > > > > p);
> > > > > + copy_highpage(restore->alloced_page + i,
> > > > > p);
> > > > > + __free_pages(p, 0);
> > > > > + }
> > > > > +
> > > > > + restore->restored_pages++;
> > > > > + first_page[i] =
> > > > > ttm_backup_handle_to_page_ptr(0);
> > > > > + }
> > > > > +
> > > > > + if (ret) {
> > > > > + if (!restore->restored_pages) {
> > > > > + dma_addr_t *dma_addr = alloc->dma_addr ?
> > > > > &restore->first_dma : NULL;
> > > > > +
> > > > > + ttm_pool_unmap_and_free(restore->pool,
> > > > > restore->alloced_page,
> > > > > + dma_addr,
> > > > > restore-
> > > > > > page_caching);
> > > > > + restore->restored_pages = nr;
> > > > > + }
> > > > > + return ret;
> > > > > + }
> > > > > +
> > > > > + ttm_pool_allocated_page_commit(restore->alloced_page,
> > > > > restore->first_dma,
> > > > > + alloc, nr);
> > > > > + if (restore->page_caching == alloc->tt_caching ||
> > > > > PageHighMem(restore->alloced_page))
> > > > > + alloc->caching_divide = alloc->pages;
> > > > > + restore->snapshot_alloc = *alloc;
> > > > > + restore->alloced_pages += nr;
> > > > > +
> > > > > + return 0;
> > > > > +}
> > > > > +
> > > > > +/* If restoring, save information needed for
> > > > > ttm_pool_restore_commit(). */
> > > > > +static void
> > > > > +ttm_pool_page_allocated_restore(struct ttm_pool *pool,
> > > > > unsigned
> > > > > int order,
> > > > > + struct page *p,
> > > > > + enum ttm_caching page_caching,
> > > > > + dma_addr_t first_dma,
> > > > > + struct ttm_pool_tt_restore
> > > > > *restore,
> > > > > + const struct
> > > > > ttm_pool_alloc_state
> > > > > *alloc)
> > > > > +{
> > > > > + restore->pool = pool;
> > > > > + restore->order = order;
> > > > > + restore->restored_pages = 0;
> > > > > + restore->page_caching = page_caching;
> > > > > + restore->first_dma = first_dma;
> > > > > + restore->alloced_page = p;
> > > > > + restore->snapshot_alloc = *alloc;
> > > > > +}
> > > > > +
> > > > > /*
> > > > > * Called when we got a page, either from a pool or newly
> > > > > allocated.
> > > > > * if needed, dma map the page and populate the dma address
> > > > > array.
> > > > > @@ -380,10 +590,11 @@ static unsigned int
> > > > > ttm_pool_page_order(struct ttm_pool *pool, struct page *p)
> > > > > */
> > > > > static int ttm_pool_page_allocated(struct ttm_pool *pool,
> > > > > unsigned int order,
> > > > > struct page *p, enum
> > > > > ttm_caching page_caching,
> > > > > - struct ttm_pool_alloc_state
> > > > > *alloc)
> > > > > + struct ttm_pool_alloc_state
> > > > > *alloc,
> > > > > + struct ttm_pool_tt_restore
> > > > > *restore)
> > > > > {
> > > > > - pgoff_t i, nr = 1UL << order;
> > > > > bool caching_consistent;
> > > > > + dma_addr_t first_dma;
> > > > > int r = 0;
> > > > >
> > > > > caching_consistent = (page_caching == alloc-
> > > > > >tt_caching)
> > > > > > > PageHighMem(p);
> > > > > @@ -395,17 +606,20 @@ static int
> > > > > ttm_pool_page_allocated(struct
> > > > > ttm_pool *pool, unsigned int order,
> > > > > }
> > > > >
> > > > > if (alloc->dma_addr) {
> > > > > - r = ttm_pool_map(pool, order, p, &alloc-
> > > > > > dma_addr);
> > > > > + r = ttm_pool_map(pool, order, p, &first_dma);
> > > > > if (r)
> > > > > return r;
> > > > > }
> > > > >
> > > > > - alloc->remaining_pages -= nr;
> > > > > - for (i = 0; i < nr; ++i)
> > > > > - *alloc->pages++ = p++;
> > > > > + if (restore) {
> > > > > + ttm_pool_page_allocated_restore(pool, order, p,
> > > > > page_caching,
> > > > > + first_dma,
> > > > > restore, alloc);
> > > > > + } else {
> > > > > + ttm_pool_allocated_page_commit(p, first_dma,
> > > > > alloc, 1UL << order);
> > > > >
> > > > > - if (caching_consistent)
> > > > > - alloc->caching_divide = alloc->pages;
> > > > > + if (caching_consistent)
> > > > > + alloc->caching_divide = alloc->pages;
> > > > > + }
> > > > >
> > > > > return 0;
> > > > > }
> > > > > @@ -428,22 +642,24 @@ static void ttm_pool_free_range(struct
> > > > > ttm_pool *pool, struct ttm_tt *tt,
> > > > > pgoff_t start_page, pgoff_t
> > > > > end_page)
> > > > > {
> > > > > struct page **pages = &tt->pages[start_page];
> > > > > - unsigned int order;
> > > > > + struct ttm_backup *backup = tt->backup;
> > > > > pgoff_t i, nr;
> > > > >
> > > > > for (i = start_page; i < end_page; i += nr, pages
> > > > > += nr)
> > > > > {
> > > > > - struct ttm_pool_type *pt = NULL;
> > > > > + struct page *p = *pages;
> > > > >
> > > > > - order = ttm_pool_page_order(pool, *pages);
> > > > > - nr = (1UL << order);
> > > > > - if (tt->dma_address)
> > > > > - ttm_pool_unmap(pool, tt->dma_address[i],
> > > > > nr);
> > > > > + nr = 1;
> > > > > + if (ttm_backup_page_ptr_is_handle(p)) {
> > > > > + unsigned long handle =
> > > > > ttm_backup_page_ptr_to_handle(p);
> > > > >
> > > > > - pt = ttm_pool_select_type(pool, caching, order);
> > > > > - if (pt)
> > > > > - ttm_pool_type_give(pt, *pages);
> > > > > - else
> > > > > - ttm_pool_free_page(pool, caching, order,
> > > > > *pages);
> > > > > + if (handle != 0)
> > > > > + ttm_backup_drop(backup, handle);
> > > > > + } else if (p) {
> > > > > + dma_addr_t *dma_addr = tt->dma_address ?
> > > > > + tt->dma_address + i : NULL;
> > > > > +
> > > > > + nr = ttm_pool_unmap_and_free(pool, p,
> > > > > dma_addr, caching);
> > > > > + }
> > > > > }
> > > > > }
> > > > >
> > > > > @@ -467,22 +683,11 @@ static unsigned int
> > > > > ttm_pool_alloc_find_order(unsigned int highest,
> > > > > return min_t(unsigned int, highest, __fls(alloc-
> > > > > > remaining_pages));
> > > > > }
> > > > >
> > > > > -/**
> > > > > - * ttm_pool_alloc - Fill a ttm_tt object
> > > > > - *
> > > > > - * @pool: ttm_pool to use
> > > > > - * @tt: ttm_tt object to fill
> > > > > - * @ctx: operation context
> > > > > - *
> > > > > - * Fill the ttm_tt object with pages and also make sure to
> > > > > DMA
> > > > > map
> > > > > them when
> > > > > - * necessary.
> > > > > - *
> > > > > - * Returns: 0 on successe, negative error code otherwise.
> > > > > - */
> > > > > -int ttm_pool_alloc(struct ttm_pool *pool, struct ttm_tt *tt,
> > > > > - struct ttm_operation_ctx *ctx)
> > > > > +static int __ttm_pool_alloc(struct ttm_pool *pool, struct
> > > > > ttm_tt
> > > > > *tt,
> > > > > + const struct ttm_operation_ctx *ctx,
> > > > > + struct ttm_pool_alloc_state *alloc,
> > > > > + struct ttm_pool_tt_restore *restore)
> > > > > {
> > > > > - struct ttm_pool_alloc_state alloc;
> > > > > enum ttm_caching page_caching;
> > > > > gfp_t gfp_flags = GFP_USER;
> > > > > pgoff_t caching_divide;
> > > > > @@ -491,10 +696,8 @@ int ttm_pool_alloc(struct ttm_pool
> > > > > *pool,
> > > > > struct ttm_tt *tt,
> > > > > struct page *p;
> > > > > int r;
> > > > >
> > > > > - ttm_pool_alloc_state_init(tt, &alloc);
> > > > > -
> > > > > - WARN_ON(!alloc.remaining_pages ||
> > > > > ttm_tt_is_populated(tt));
> > > > > - WARN_ON(alloc.dma_addr && !pool->dev);
> > > > > + WARN_ON(!alloc->remaining_pages ||
> > > > > ttm_tt_is_populated(tt));
> > > > > + WARN_ON(alloc->dma_addr && !pool->dev);
> > > > >
> > > > > if (tt->page_flags & TTM_TT_FLAG_ZERO_ALLOC)
> > > > > gfp_flags |= __GFP_ZERO;
> > > > > @@ -509,9 +712,9 @@ int ttm_pool_alloc(struct ttm_pool *pool,
> > > > > struct ttm_tt *tt,
> > > > >
> > > > > page_caching = tt->caching;
> > > > > allow_pools = true;
> > > > > - for (order = ttm_pool_alloc_find_order(MAX_PAGE_ORDER,
> > > > > &alloc);
> > > > > - alloc.remaining_pages;
> > > > > - order = ttm_pool_alloc_find_order(order, &alloc)) {
> > > > > + for (order = ttm_pool_alloc_find_order(MAX_PAGE_ORDER,
> > > > > alloc);
> > > > > + alloc->remaining_pages;
> > > > > + order = ttm_pool_alloc_find_order(order, alloc)) {
> > > > > struct ttm_pool_type *pt;
> > > > >
> > > > > /* First, try to allocate a page from a
> > > > > pool if
> > > > > one exists. */
> > > > > @@ -541,30 +744,120 @@ int ttm_pool_alloc(struct ttm_pool
> > > > > *pool,
> > > > > struct ttm_tt *tt,
> > > > > r = -ENOMEM;
> > > > > goto error_free_all;
> > > > > }
> > > > > - r = ttm_pool_page_allocated(pool, order, p,
> > > > > page_caching, &alloc);
> > > > > + r = ttm_pool_page_allocated(pool, order, p,
> > > > > page_caching, alloc,
> > > > > + restore);
> > > > > if (r)
> > > > > goto error_free_page;
> > > > > +
> > > > > + if (ttm_pool_restore_valid(restore)) {
> > > > > + r = ttm_pool_restore_commit(restore, tt-
> > > > > > backup, ctx, alloc);
> > > > > + if (r)
> > > > > + goto error_free_all;
> > > > > + }
> > > > > }
> > > > >
> > > > > - r = ttm_pool_apply_caching(&alloc);
> > > > > + r = ttm_pool_apply_caching(alloc);
> > > > > if (r)
> > > > > goto error_free_all;
> > > > >
> > > > > + kfree(tt->restore);
> > > > > + tt->restore = NULL;
> > > > > +
> > > > > return 0;
> > > > >
> > > > > error_free_page:
> > > > > ttm_pool_free_page(pool, page_caching, order, p);
> > > > >
> > > > > error_free_all:
> > > > > - caching_divide = alloc.caching_divide - tt->pages;
> > > > > + if (tt->restore)
> > > > > + return r;
> > > > > +
> > > > > + caching_divide = alloc->caching_divide - tt->pages;
> > > > > ttm_pool_free_range(pool, tt, tt->caching, 0,
> > > > > caching_divide);
> > > > > ttm_pool_free_range(pool, tt, ttm_cached,
> > > > > caching_divide,
> > > > > - tt->num_pages -
> > > > > alloc.remaining_pages);
> > > > > + tt->num_pages - alloc-
> > > > > > remaining_pages);
> > > > >
> > > > > return r;
> > > > > }
> > > > > +
> > > > > +/**
> > > > > + * ttm_pool_alloc - Fill a ttm_tt object
> > > > > + *
> > > > > + * @pool: ttm_pool to use
> > > > > + * @tt: ttm_tt object to fill
> > > > > + * @ctx: operation context
> > > > > + *
> > > > > + * Fill the ttm_tt object with pages and also make sure to
> > > > > DMA
> > > > > map
> > > > > them when
> > > > > + * necessary.
> > > > > + *
> > > > > + * Returns: 0 on successe, negative error code otherwise.
> > > > > + */
> > > > > +int ttm_pool_alloc(struct ttm_pool *pool, struct ttm_tt *tt,
> > > > > + struct ttm_operation_ctx *ctx)
> > > > > +{
> > > > > + struct ttm_pool_alloc_state alloc;
> > > > > +
> > > > > + if (WARN_ON(ttm_tt_is_backed_up(tt)))
> > > > > + return -EINVAL;
> > > > > +
> > > > > + ttm_pool_alloc_state_init(tt, &alloc);
> > > > > +
> > > > > + return __ttm_pool_alloc(pool, tt, ctx, &alloc, NULL);
> > > > > +}
> > > > > EXPORT_SYMBOL(ttm_pool_alloc);
> > > > >
> > > > > +/**
> > > > > + * ttm_pool_restore_and_alloc - Fill a ttm_tt, restoring
> > > > > previously backed-up
> > > > > + * content.
> > > > > + *
> > > > > + * @pool: ttm_pool to use
> > > > > + * @tt: ttm_tt object to fill
> > > > > + * @ctx: operation context
> > > > > + *
> > > > > + * Fill the ttm_tt object with pages and also make sure to
> > > > > DMA
> > > > > map
> > > > > them when
> > > > > + * necessary. Read in backed-up content.
> > > > > + *
> > > > > + * Returns: 0 on successe, negative error code otherwise.
> > > > > + */
> > > > > +int ttm_pool_restore_and_alloc(struct ttm_pool *pool, struct
> > > > > ttm_tt *tt,
> > > > > + const struct ttm_operation_ctx
> > > > > *ctx)
> > > > > +{
> > > > > + struct ttm_pool_alloc_state alloc;
> > > > > +
> > > > > + if (WARN_ON(!ttm_tt_is_backed_up(tt)))
> > > > > + return -EINVAL;
> > > > > +
> > > > > + if (!tt->restore) {
> > > > > + gfp_t gfp = GFP_KERNEL | __GFP_NOWARN;
> > > > > +
> > > > > + ttm_pool_alloc_state_init(tt, &alloc);
> > > > > + if (ctx->gfp_retry_mayfail)
> > > > > + gfp |= __GFP_RETRY_MAYFAIL;
> > > > > +
> > > > > + tt->restore = kzalloc(sizeof(*tt->restore),
> > > > > gfp);
> > > > > + if (!tt->restore)
> > > > > + return -ENOMEM;
> > > > > +
> > > > > + tt->restore->snapshot_alloc = alloc;
> > > > > + tt->restore->pool = pool;
> > > > > + tt->restore->restored_pages = 1;
> > > > > + } else {
> > > > > + struct ttm_pool_tt_restore *restore = tt-
> > > > > > restore;
> > > > > + int ret;
> > > > > +
> > > > > + alloc = restore->snapshot_alloc;
> > > > > + if (ttm_pool_restore_valid(tt->restore)) {
> > > > > + ret = ttm_pool_restore_commit(restore,
> > > > > tt-
> > > > > > backup, ctx, &alloc);
> > > > > + if (ret)
> > > > > + return ret;
> > > > > + }
> > > > > + if (!alloc.remaining_pages)
> > > > > + return 0;
> > > > > + }
> > > > > +
> > > > > + return __ttm_pool_alloc(pool, tt, ctx, &alloc, tt-
> > > > > > restore);
> > > > > +}
> > > > > +
> > > > > /**
> > > > > * ttm_pool_free - Free the backing pages from a ttm_tt
> > > > > object
> > > > > *
> > > > > @@ -582,6 +875,163 @@ void ttm_pool_free(struct ttm_pool
> > > > > *pool,
> > > > > struct ttm_tt *tt)
> > > > > }
> > > > > EXPORT_SYMBOL(ttm_pool_free);
> > > > >
> > > > > +/**
> > > > > + * ttm_pool_drop_backed_up() - Release content of a swapped-
> > > > > out
> > > > > struct ttm_tt
> > > > > + * @tt: The struct ttm_tt.
> > > > > + *
> > > > > + * Release handles with associated content or any remaining
> > > > > pages
> > > > > of
> > > > > + * a backed-up struct ttm_tt.
> > > > > + */
> > > > > +void ttm_pool_drop_backed_up(struct ttm_tt *tt)
> > > > > +{
> > > > > + struct ttm_pool_tt_restore *restore;
> > > > > + pgoff_t start_page = 0;
> > > > > +
> > > > > + WARN_ON(!ttm_tt_is_backed_up(tt));
> > > > > +
> > > > > + restore = tt->restore;
> > > > > +
> > > > > + /*
> > > > > + * Unmap and free any uncommitted restore page.
> > > > > + * any tt page-array backup entries already read back
> > > > > has
> > > > > + * been cleared already
> > > > > + */
> > > > > + if (ttm_pool_restore_valid(restore)) {
> > > > > + dma_addr_t *dma_addr = tt->dma_address ?
> > > > > &restore-
> > > > > > first_dma : NULL;
> > > > > +
> > > > > + ttm_pool_unmap_and_free(restore->pool, restore-
> > > > > > alloced_page,
> > > > > + dma_addr, restore-
> > > > > > page_caching);
> > > > > + restore->restored_pages = 1UL << restore->order;
> > > > > + }
> > > > > +
> > > > > + /*
> > > > > + * If a restore is ongoing, part of the tt pages may
> > > > > have
> > > > > a
> > > > > + * caching different than writeback.
> > > > > + */
> > > > > + if (restore) {
> > > > > + pgoff_t mid = restore-
> > > > > > snapshot_alloc.caching_divide - tt->pages;
> > > > > +
> > > > > + start_page = restore->alloced_pages;
> > > > > + WARN_ON(mid > start_page);
> > > > > + /* Pages that might be dma-mapped and non-cached
> > > > > */
> > > > > + ttm_pool_free_range(restore->pool, tt, tt-
> > > > > > caching,
> > > > > + 0, mid);
> > > > > + /* Pages that might be dma-mapped but cached */
> > > > > + ttm_pool_free_range(restore->pool, tt,
> > > > > ttm_cached,
> > > > > + mid, restore-
> > > > > > alloced_pages);
> > > > > + kfree(restore);
> > > > > + tt->restore = NULL;
> > > > > + }
> > > > > +
> > > > > + ttm_pool_free_range(NULL, tt, ttm_cached, start_page,
> > > > > tt-
> > > > > > num_pages);
> > > > > +}
> > > > > +
> > > > > +/**
> > > > > + * ttm_pool_backup() - Back up or purge a struct ttm_tt
> > > > > + * @pool: The pool used when allocating the struct ttm_tt.
> > > > > + * @tt: The struct ttm_tt.
> > > > > + * @flags: Flags to govern the backup behaviour.
> > > > > + *
> > > > > + * Back up or purge a struct ttm_tt. If @purge is true, then
> > > > > + * all pages will be freed directly to the system rather
> > > > > than to
> > > > > the pool
> > > > > + * they were allocated from, making the function behave
> > > > > similarly
> > > > > to
> > > > > + * ttm_pool_free(). If @purge is false the pages will be
> > > > > backed
> > > > > up
> > > > > instead,
> > > > > + * exchanged for handles.
> > > > > + * A subsequent call to ttm_pool_restore_and_alloc() will
> > > > > then
> > > > > read back the content and
> > > > > + * a subsequent call to ttm_pool_drop_backed_up() will drop
> > > > > it.
> > > > > + * If backup of a page fails for whatever reason, @ttm will
> > > > > still
> > > > > be
> > > > > + * partially backed up, retaining those pages for which
> > > > > backup
> > > > > fails.
> > > > > + * In that case, this function can be retried, possibly
> > > > > after
> > > > > freeing up
> > > > > + * memory resources.
> > > > > + *
> > > > > + * Return: Number of pages actually backed up or freed, or
> > > > > negative
> > > > > + * error code on error.
> > > > > + */
> > > > > +long ttm_pool_backup(struct ttm_pool *pool, struct ttm_tt
> > > > > *tt,
> > > > > + const struct ttm_backup_flags *flags)
> > > > > +{
> > > > > + struct ttm_backup *backup = tt->backup;
> > > > > + struct page *page;
> > > > > + unsigned long handle;
> > > > > + gfp_t alloc_gfp;
> > > > > + gfp_t gfp;
> > > > > + int ret = 0;
> > > > > + pgoff_t shrunken = 0;
> > > > > + pgoff_t i, num_pages;
> > > > > +
> > > > > + if (WARN_ON(ttm_tt_is_backed_up(tt)))
> > > > > + return -EINVAL;
> > > > > +
> > > > > + if ((!ttm_backup_bytes_avail() && !flags->purge) ||
> > > > > + pool->use_dma_alloc || ttm_tt_is_backed_up(tt))
> > > > > + return -EBUSY;
> > > > > +
> > > > > +#ifdef CONFIG_X86
> > > > > + /* Anything returned to the system needs to be cached.
> > > > > */
> > > > > + if (tt->caching != ttm_cached)
> > > > > + set_pages_array_wb(tt->pages, tt->num_pages);
> > > > > +#endif
> > > > > +
> > > > > + if (tt->dma_address || flags->purge) {
> > > > > + for (i = 0; i < tt->num_pages; i += num_pages) {
> > > > > + unsigned int order;
> > > > > +
> > > > > + page = tt->pages[i];
> > > > > + if (unlikely(!page)) {
> > > > > + num_pages = 1;
> > > > > + continue;
> > > > > + }
> > > > > +
> > > > > + order = ttm_pool_page_order(pool, page);
> > > > > + num_pages = 1UL << order;
> > > > > + if (tt->dma_address)
> > > > > + ttm_pool_unmap(pool, tt-
> > > > > > dma_address[i],
> > > > > + num_pages);
> > > > > + if (flags->purge) {
> > > > > + shrunken += num_pages;
> > > > > + page->private = 0;
> > > > > + __free_pages(page, order);
> > > > > + memset(tt->pages + i, 0,
> > > > > + num_pages * sizeof(*tt-
> > > > > > pages));
> > > > > + }
> > > > > + }
> > > > > + }
> > > > > +
> > > > > + if (flags->purge)
> > > > > + return shrunken;
> > > > > +
> > > > > + if (pool->use_dma32)
> > > > > + gfp = GFP_DMA32;
> > > > > + else
> > > > > + gfp = GFP_HIGHUSER;
> > > > > +
> > > > > + alloc_gfp = GFP_KERNEL | __GFP_HIGH | __GFP_NOWARN |
> > > > > __GFP_RETRY_MAYFAIL;
> > > > > +
> > > > > + for (i = 0; i < tt->num_pages; ++i) {
> > > > > + s64 shandle;
> > > > > +
> > > > > + page = tt->pages[i];
> > > > > + if (unlikely(!page))
> > > > > + continue;
> > > > > +
> > > > > + ttm_pool_split_for_swap(pool, page);
> > > > > +
> > > > > + shandle = ttm_backup_backup_page(backup, page,
> > > > > flags->writeback, i,
> > > > > + gfp,
> > > > > alloc_gfp);
> > > > > + if (shandle < 0) {
> > > > > + /* We allow partially shrunken tts */
> > > > > + ret = shandle;
> > > > > + break;
> > > > > + }
> > > > > + handle = shandle;
> > > > > + tt->pages[i] =
> > > > > ttm_backup_handle_to_page_ptr(handle);
> > > > > + put_page(page);
> > > > > + shrunken++;
> > > > > + }
> > > > > +
> > > > > + return shrunken ? shrunken : ret;
> > > > > +}
> > > > > +
> > > > > /**
> > > > > * ttm_pool_init - Initialize a pool
> > > > > *
> > > > > diff --git a/drivers/gpu/drm/ttm/ttm_tt.c
> > > > > b/drivers/gpu/drm/ttm/ttm_tt.c
> > > > > index 3baf215eca23..00b7c28f2329 100644
> > > > > --- a/drivers/gpu/drm/ttm/ttm_tt.c
> > > > > +++ b/drivers/gpu/drm/ttm/ttm_tt.c
> > > > > @@ -40,6 +40,7 @@
> > > > > #include <drm/drm_cache.h>
> > > > > #include <drm/drm_device.h>
> > > > > #include <drm/drm_util.h>
> > > > > +#include <drm/ttm/ttm_backup.h>
> > > > > #include <drm/ttm/ttm_bo.h>
> > > > > #include <drm/ttm/ttm_tt.h>
> > > > >
> > > > > @@ -158,6 +159,8 @@ static void ttm_tt_init_fields(struct
> > > > > ttm_tt
> > > > > *ttm,
> > > > > ttm->swap_storage = NULL;
> > > > > ttm->sg = bo->sg;
> > > > > ttm->caching = caching;
> > > > > + ttm->restore = NULL;
> > > > > + ttm->backup = NULL;
> > > > > }
> > > > >
> > > > > int ttm_tt_init(struct ttm_tt *ttm, struct
> > > > > ttm_buffer_object
> > > > > *bo,
> > > > > @@ -182,6 +185,13 @@ void ttm_tt_fini(struct ttm_tt *ttm)
> > > > > fput(ttm->swap_storage);
> > > > > ttm->swap_storage = NULL;
> > > > >
> > > > > + if (ttm_tt_is_backed_up(ttm))
> > > > > + ttm_pool_drop_backed_up(ttm);
> > > > > + if (ttm->backup) {
> > > > > + ttm_backup_fini(ttm->backup);
> > > > > + ttm->backup = NULL;
> > > > > + }
> > > > > +
> > > > > if (ttm->pages)
> > > > > kvfree(ttm->pages);
> > > > > else
> > > > > @@ -253,6 +263,49 @@ int ttm_tt_swapin(struct ttm_tt *ttm)
> > > > > }
> > > > > EXPORT_SYMBOL_FOR_TESTS_ONLY(ttm_tt_swapin);
> > > > >
> > > > > +/**
> > > > > + * ttm_tt_backup() - Helper to back up a struct ttm_tt.
> > > > > + * @bdev: The TTM device.
> > > > > + * @tt: The struct ttm_tt.
> > > > > + * @flags: Flags that govern the backup behaviour.
> > > > > + *
> > > > > + * Update the page accounting and call ttm_pool_shrink_tt to
> > > > > free
> > > > > pages
> > > > > + * or back them up.
> > > > > + *
> > > > > + * Return: Number of pages freed or swapped out, or negative
> > > > > error
> > > > > code on
> > > > > + * error.
> > > > > + */
> > > > > +long ttm_tt_backup(struct ttm_device *bdev, struct ttm_tt
> > > > > *tt,
> > > > > + const struct ttm_backup_flags flags)
> > > > > +{
> > > > > + long ret;
> > > > > +
> > > > > + if (WARN_ON(IS_ERR_OR_NULL(tt->backup)))
> > > > > + return 0;
> > > > > +
> > > > > + ret = ttm_pool_backup(&bdev->pool, tt, &flags);
> > > > > + if (ret > 0) {
> > > > > + tt->page_flags &= ~TTM_TT_FLAG_PRIV_POPULATED;
> > > > > + tt->page_flags |= TTM_TT_FLAG_BACKED_UP;
> > > > > + }
> > > > > +
> > > > > + return ret;
> > > > > +}
> > > > > +
> > > > > +int ttm_tt_restore(struct ttm_device *bdev, struct ttm_tt
> > > > > *tt,
> > > > > + const struct ttm_operation_ctx *ctx)
> > > > > +{
> > > > > + int ret = ttm_pool_restore_and_alloc(&bdev->pool, tt,
> > > > > ctx);
> > > > > +
> > > > > + if (ret)
> > > > > + return ret;
> > > > > +
> > > > > + tt->page_flags &= ~TTM_TT_FLAG_BACKED_UP;
> > > > > +
> > > > > + return 0;
> > > > > +}
> > > > > +EXPORT_SYMBOL(ttm_tt_restore);
> > > > > +
> > > > > /**
> > > > > * ttm_tt_swapout - swap out tt object
> > > > > *
> > > > > @@ -348,6 +401,7 @@ int ttm_tt_populate(struct ttm_device
> > > > > *bdev,
> > > > > goto error;
> > > > >
> > > > > ttm->page_flags |= TTM_TT_FLAG_PRIV_POPULATED;
> > > > > + ttm->page_flags &= ~TTM_TT_FLAG_BACKED_UP;
> > > > > if (unlikely(ttm->page_flags &
> > > > > TTM_TT_FLAG_SWAPPED)) {
> > > > > ret = ttm_tt_swapin(ttm);
> > > > > if (unlikely(ret != 0)) {
> > > > > diff --git a/include/drm/ttm/ttm_pool.h
> > > > > b/include/drm/ttm/ttm_pool.h
> > > > > index 160d954a261e..54cd34a6e4c0 100644
> > > > > --- a/include/drm/ttm/ttm_pool.h
> > > > > +++ b/include/drm/ttm/ttm_pool.h
> > > > > @@ -33,6 +33,7 @@
> > > > >
> > > > > struct device;
> > > > > struct seq_file;
> > > > > +struct ttm_backup_flags;
> > > > > struct ttm_operation_ctx;
> > > > > struct ttm_pool;
> > > > > struct ttm_tt;
> > > > > @@ -89,6 +90,13 @@ void ttm_pool_fini(struct ttm_pool *pool);
> > > > >
> > > > > int ttm_pool_debugfs(struct ttm_pool *pool, struct seq_file
> > > > > *m);
> > > > >
> > > > > +void ttm_pool_drop_backed_up(struct ttm_tt *tt);
> > > > > +
> > > > > +long ttm_pool_backup(struct ttm_pool *pool, struct ttm_tt
> > > > > *ttm,
> > > > > + const struct ttm_backup_flags *flags);
> > > > > +int ttm_pool_restore_and_alloc(struct ttm_pool *pool, struct
> > > > > ttm_tt *tt,
> > > > > + const struct ttm_operation_ctx
> > > > > *ctx);
> > > > > +
> > > > > int ttm_pool_mgr_init(unsigned long num_pages);
> > > > > void ttm_pool_mgr_fini(void);
> > > > >
> > > > > diff --git a/include/drm/ttm/ttm_tt.h
> > > > > b/include/drm/ttm/ttm_tt.h
> > > > > index 991edafdb2dd..c736c01ac2ca 100644
> > > > > --- a/include/drm/ttm/ttm_tt.h
> > > > > +++ b/include/drm/ttm/ttm_tt.h
> > > > > @@ -32,11 +32,13 @@
> > > > > #include <drm/ttm/ttm_caching.h>
> > > > > #include <drm/ttm/ttm_kmap_iter.h>
> > > > >
> > > > > +struct ttm_backup;
> > > > > struct ttm_device;
> > > > > struct ttm_tt;
> > > > > struct ttm_resource;
> > > > > struct ttm_buffer_object;
> > > > > struct ttm_operation_ctx;
> > > > > +struct ttm_pool_tt_restore;
> > > > >
> > > > > /**
> > > > > * struct ttm_tt - This is a structure holding the pages,
> > > > > caching- and aperture
> > > > > @@ -85,17 +87,22 @@ struct ttm_tt {
> > > > > * fault handling abuses the DMA api a bit and
> > > > > dma_map_attrs can't be
> > > > > * used to assure pgprot always matches.
> > > > > *
> > > > > + * TTM_TT_FLAG_BACKED_UP: TTM internal only. This is set
> > > > > if the
> > > > > + * struct ttm_tt has been (possibly partially) backed
> > > > > up.
> > > > > + *
> > > > > * TTM_TT_FLAG_PRIV_POPULATED: TTM internal only.
> > > > > DO NOT
> > > > > USE. This is
> > > > > * set by TTM after ttm_tt_populate() has
> > > > > successfully
> > > > > returned, and is
> > > > > * then unset when TTM calls ttm_tt_unpopulate().
> > > > > + *
> > > > > */
> > > > > #define TTM_TT_FLAG_SWAPPED BIT(0)
> > > > > #define TTM_TT_FLAG_ZERO_ALLOC BIT(1)
> > > > > #define TTM_TT_FLAG_EXTERNAL BIT(2)
> > > > > #define TTM_TT_FLAG_EXTERNAL_MAPPABLE BIT(3)
> > > > > #define TTM_TT_FLAG_DECRYPTED BIT(4)
> > > > > +#define TTM_TT_FLAG_BACKED_UP BIT(5)
> > > > >
> > > > > -#define TTM_TT_FLAG_PRIV_POPULATED BIT(5)
> > > > > +#define TTM_TT_FLAG_PRIV_POPULATED BIT(6)
> > > > > uint32_t page_flags;
> > > > > /** @num_pages: Number of pages in the page array.
> > > > > */
> > > > > uint32_t num_pages;
> > > > > @@ -105,11 +112,20 @@ struct ttm_tt {
> > > > > dma_addr_t *dma_address;
> > > > > /** @swap_storage: Pointer to shmem struct file for
> > > > > swap
> > > > > storage. */
> > > > > struct file *swap_storage;
> > > > > + /**
> > > > > + * @backup: Pointer to backup struct for backed up tts.
> > > > > + * Could be unified with @swap_storage. Meanwhile, the
> > > > > driver's
> > > > > + * ttm_tt_create() callback is responsible for assigning
> > > > > + * this field.
> > > > > + */
> > > > > + struct ttm_backup *backup;
> > > > > /**
> > > > > * @caching: The current caching state of the
> > > > > pages, see
> > > > > enum
> > > > > * ttm_caching.
> > > > > */
> > > > > enum ttm_caching caching;
> > > > > + /** @restore: Partial restoration from backup state. TTM
> > > > > private */
> > > > > + struct ttm_pool_tt_restore *restore;
> > > > > };
> > > > >
> > > > > /**
> > > > > @@ -129,9 +145,38 @@ static inline bool
> > > > > ttm_tt_is_populated(struct
> > > > > ttm_tt *tt)
> > > > > return tt->page_flags & TTM_TT_FLAG_PRIV_POPULATED;
> > > > > }
> > > > >
> > > > > +/**
> > > > > + * ttm_tt_is_swapped() - Whether the ttm_tt is swapped out
> > > > > or
> > > > > backed up
> > > > > + * @tt: The struct ttm_tt.
> > > > > + *
> > > > > + * Return: true if swapped or backed up, false otherwise.
> > > > > + */
> > > > > static inline bool ttm_tt_is_swapped(const struct ttm_tt
> > > > > *tt)
> > > > > {
> > > > > - return tt->page_flags & TTM_TT_FLAG_SWAPPED;
> > > > > + return tt->page_flags & (TTM_TT_FLAG_SWAPPED |
> > > > > TTM_TT_FLAG_BACKED_UP);
> > > > > +}
> > > > > +
> > > > > +/**
> > > > > + * ttm_tt_is_backed_up() - Whether the ttm_tt backed up
> > > > > + * @tt: The struct ttm_tt.
> > > > > + *
> > > > > + * Return: true if swapped or backed up, false otherwise.
> > > > > + */
> > > > > +static inline bool ttm_tt_is_backed_up(const struct ttm_tt
> > > > > *tt)
> > > > > +{
> > > > > + return tt->page_flags & TTM_TT_FLAG_BACKED_UP;
> > > > > +}
> > > > > +
> > > > > +/**
> > > > > + * ttm_tt_clear_backed_up() - Clear the ttm_tt backed-up
> > > > > status
> > > > > + * @tt: The struct ttm_tt.
> > > > > + *
> > > > > + * Drivers can use this functionto clear the backed-up
> > > > > status,
> > > > > + * for example before destroying or re-validating a purged
> > > > > tt.
> > > > > + */
> > > > > +static inline void ttm_tt_clear_backed_up(struct ttm_tt *tt)
> > > > > +{
> > > > > + tt->page_flags &= ~TTM_TT_FLAG_BACKED_UP;
> > > > > }
> > > > >
> > > > > /**
> > > > > @@ -235,6 +280,24 @@ void ttm_tt_mgr_init(unsigned long
> > > > > num_pages,
> > > > > unsigned long num_dma32_pages);
> > > > > struct ttm_kmap_iter *ttm_kmap_iter_tt_init(struct
> > > > > ttm_kmap_iter_tt *iter_tt,
> > > > > struct ttm_tt
> > > > > *tt);
> > > > > unsigned long ttm_tt_pages_limit(void);
> > > > > +
> > > > > +/**
> > > > > + * struct ttm_backup_flags - Flags to govern backup
> > > > > behaviour.
> > > > > + * @purge: Free pages without backing up. Bypass pools.
> > > > > + * @writeback: Attempt to copy contents directly to swap
> > > > > space,
> > > > > even
> > > > > + * if that means blocking on writes to external memory.
> > > > > + */
> > > > > +struct ttm_backup_flags {
> > > > > + u32 purge : 1;
> > > > > + u32 writeback : 1;
> > > > > +};
> > > > > +
> > > > > +long ttm_tt_backup(struct ttm_device *bdev, struct ttm_tt
> > > > > *tt,
> > > > > + const struct ttm_backup_flags flags);
> > > > > +
> > > > > +int ttm_tt_restore(struct ttm_device *bdev, struct ttm_tt
> > > > > *tt,
> > > > > + const struct ttm_operation_ctx *ctx);
> > > > > +
> > > > > #if IS_ENABLED(CONFIG_AGP)
> > > > > #include <linux/agp_backend.h>
> > > > >
> > > >
> > >
> >
^ permalink raw reply [flat|nested] 26+ messages in thread
* [PATCH v16 3/7] drm/ttm: Use fault-injection to test error paths
2025-01-30 10:13 [PATCH v16 0/7] TTM shrinker helpers and xe buffer object shrinker Thomas Hellström
2025-01-30 10:13 ` [PATCH v16 1/7] drm/ttm: Provide a shmem backup implementation Thomas Hellström
2025-01-30 10:13 ` [PATCH v16 2/7] drm/ttm/pool, drm/ttm/tt: Provide a helper to shrink pages Thomas Hellström
@ 2025-01-30 10:13 ` Thomas Hellström
2025-02-06 14:04 ` Christian König
2025-01-30 10:13 ` [PATCH v16 4/7] drm/ttm: Add a macro to perform LRU iteration Thomas Hellström
` (11 subsequent siblings)
14 siblings, 1 reply; 26+ messages in thread
From: Thomas Hellström @ 2025-01-30 10:13 UTC (permalink / raw)
To: intel-xe
Cc: Thomas Hellström, Christian König,
Somalapuram Amaranath, Matthew Brost, dri-devel
Use fault-injection to test partial TTM swapout and interrupted swapin.
Return -EINTR for swapin to test the callers ability to handle and
restart the swapin, and on swapout perform a partial swapout to test that
the swapin and release_shrunken functionality.
v8:
- Use the core fault-injection system.
v9:
- Fix compliation failure for !CONFIG_FAULT_INJECTION
Cc: Christian König <christian.koenig@amd.com>
Cc: Somalapuram Amaranath <Amaranath.Somalapuram@amd.com>
Cc: Matthew Brost <matthew.brost@intel.com>
Cc: <dri-devel@lists.freedesktop.org>
Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Reviewed-by: Matthew Brost <matthew.brost@intel.com> #v7
---
drivers/gpu/drm/ttm/ttm_pool.c | 25 ++++++++++++++++++++++++-
1 file changed, 24 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/ttm/ttm_pool.c b/drivers/gpu/drm/ttm/ttm_pool.c
index ffb7abf52bab..83b10706ba89 100644
--- a/drivers/gpu/drm/ttm/ttm_pool.c
+++ b/drivers/gpu/drm/ttm/ttm_pool.c
@@ -48,6 +48,13 @@
#include "ttm_module.h"
+#ifdef CONFIG_FAULT_INJECTION
+#include <linux/fault-inject.h>
+static DECLARE_FAULT_ATTR(backup_fault_inject);
+#else
+#define should_fail(...) false
+#endif
+
/**
* struct ttm_pool_dma - Helper object for coherent DMA mappings
*
@@ -514,6 +521,12 @@ static int ttm_pool_restore_commit(struct ttm_pool_tt_restore *restore,
if (ttm_backup_page_ptr_is_handle(p)) {
unsigned long handle = ttm_backup_page_ptr_to_handle(p);
+ if (IS_ENABLED(CONFIG_FAULT_INJECTION) && ctx->interruptible &&
+ should_fail(&backup_fault_inject, 1)) {
+ ret = -EINTR;
+ break;
+ }
+
if (handle == 0) {
restore->restored_pages++;
continue;
@@ -1007,7 +1020,13 @@ long ttm_pool_backup(struct ttm_pool *pool, struct ttm_tt *tt,
alloc_gfp = GFP_KERNEL | __GFP_HIGH | __GFP_NOWARN | __GFP_RETRY_MAYFAIL;
- for (i = 0; i < tt->num_pages; ++i) {
+ num_pages = tt->num_pages;
+
+ /* Pretend doing fault injection by shrinking only half of the pages. */
+ if (IS_ENABLED(CONFIG_FAULT_INJECTION) && should_fail(&backup_fault_inject, 1))
+ num_pages = DIV_ROUND_UP(num_pages, 2);
+
+ for (i = 0; i < num_pages; ++i) {
s64 shandle;
page = tt->pages[i];
@@ -1293,6 +1312,10 @@ int ttm_pool_mgr_init(unsigned long num_pages)
&ttm_pool_debugfs_globals_fops);
debugfs_create_file("page_pool_shrink", 0400, ttm_debugfs_root, NULL,
&ttm_pool_debugfs_shrink_fops);
+#ifdef CONFIG_FAULT_INJECTION
+ fault_create_debugfs_attr("backup_fault_inject", ttm_debugfs_root,
+ &backup_fault_inject);
+#endif
#endif
mm_shrinker = shrinker_alloc(0, "drm-ttm_pool");
--
2.48.1
^ permalink raw reply related [flat|nested] 26+ messages in thread* Re: [PATCH v16 3/7] drm/ttm: Use fault-injection to test error paths
2025-01-30 10:13 ` [PATCH v16 3/7] drm/ttm: Use fault-injection to test error paths Thomas Hellström
@ 2025-02-06 14:04 ` Christian König
0 siblings, 0 replies; 26+ messages in thread
From: Christian König @ 2025-02-06 14:04 UTC (permalink / raw)
To: Thomas Hellström, intel-xe
Cc: Somalapuram Amaranath, Matthew Brost, dri-devel
Am 30.01.25 um 11:13 schrieb Thomas Hellström:
> Use fault-injection to test partial TTM swapout and interrupted swapin.
> Return -EINTR for swapin to test the callers ability to handle and
> restart the swapin, and on swapout perform a partial swapout to test that
> the swapin and release_shrunken functionality.
>
> v8:
> - Use the core fault-injection system.
> v9:
> - Fix compliation failure for !CONFIG_FAULT_INJECTION
>
> Cc: Christian König <christian.koenig@amd.com>
> Cc: Somalapuram Amaranath <Amaranath.Somalapuram@amd.com>
> Cc: Matthew Brost <matthew.brost@intel.com>
> Cc: <dri-devel@lists.freedesktop.org>
> Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
> Reviewed-by: Matthew Brost <matthew.brost@intel.com> #v7
Reviewed-by: Christian König <christian.koenig@amd.com>
> ---
> drivers/gpu/drm/ttm/ttm_pool.c | 25 ++++++++++++++++++++++++-
> 1 file changed, 24 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/ttm/ttm_pool.c b/drivers/gpu/drm/ttm/ttm_pool.c
> index ffb7abf52bab..83b10706ba89 100644
> --- a/drivers/gpu/drm/ttm/ttm_pool.c
> +++ b/drivers/gpu/drm/ttm/ttm_pool.c
> @@ -48,6 +48,13 @@
>
> #include "ttm_module.h"
>
> +#ifdef CONFIG_FAULT_INJECTION
> +#include <linux/fault-inject.h>
> +static DECLARE_FAULT_ATTR(backup_fault_inject);
> +#else
> +#define should_fail(...) false
> +#endif
> +
> /**
> * struct ttm_pool_dma - Helper object for coherent DMA mappings
> *
> @@ -514,6 +521,12 @@ static int ttm_pool_restore_commit(struct ttm_pool_tt_restore *restore,
> if (ttm_backup_page_ptr_is_handle(p)) {
> unsigned long handle = ttm_backup_page_ptr_to_handle(p);
>
> + if (IS_ENABLED(CONFIG_FAULT_INJECTION) && ctx->interruptible &&
> + should_fail(&backup_fault_inject, 1)) {
> + ret = -EINTR;
> + break;
> + }
> +
> if (handle == 0) {
> restore->restored_pages++;
> continue;
> @@ -1007,7 +1020,13 @@ long ttm_pool_backup(struct ttm_pool *pool, struct ttm_tt *tt,
>
> alloc_gfp = GFP_KERNEL | __GFP_HIGH | __GFP_NOWARN | __GFP_RETRY_MAYFAIL;
>
> - for (i = 0; i < tt->num_pages; ++i) {
> + num_pages = tt->num_pages;
> +
> + /* Pretend doing fault injection by shrinking only half of the pages. */
> + if (IS_ENABLED(CONFIG_FAULT_INJECTION) && should_fail(&backup_fault_inject, 1))
> + num_pages = DIV_ROUND_UP(num_pages, 2);
> +
> + for (i = 0; i < num_pages; ++i) {
> s64 shandle;
>
> page = tt->pages[i];
> @@ -1293,6 +1312,10 @@ int ttm_pool_mgr_init(unsigned long num_pages)
> &ttm_pool_debugfs_globals_fops);
> debugfs_create_file("page_pool_shrink", 0400, ttm_debugfs_root, NULL,
> &ttm_pool_debugfs_shrink_fops);
> +#ifdef CONFIG_FAULT_INJECTION
> + fault_create_debugfs_attr("backup_fault_inject", ttm_debugfs_root,
> + &backup_fault_inject);
> +#endif
> #endif
>
> mm_shrinker = shrinker_alloc(0, "drm-ttm_pool");
^ permalink raw reply [flat|nested] 26+ messages in thread
* [PATCH v16 4/7] drm/ttm: Add a macro to perform LRU iteration
2025-01-30 10:13 [PATCH v16 0/7] TTM shrinker helpers and xe buffer object shrinker Thomas Hellström
` (2 preceding siblings ...)
2025-01-30 10:13 ` [PATCH v16 3/7] drm/ttm: Use fault-injection to test error paths Thomas Hellström
@ 2025-01-30 10:13 ` Thomas Hellström
2025-01-30 10:13 ` [PATCH v16 5/7] drm/ttm: Add helpers for shrinking Thomas Hellström
` (10 subsequent siblings)
14 siblings, 0 replies; 26+ messages in thread
From: Thomas Hellström @ 2025-01-30 10:13 UTC (permalink / raw)
To: intel-xe; +Cc: Thomas Hellström, Matthew Brost
Following the design direction communicated here:
https://lore.kernel.org/linux-mm/b7491378-defd-4f1c-31e2-29e4c77e2d67@amd.com/T/#ma918844aa8a6efe8768fdcda0c6590d5c93850c9
Export a LRU walker for driver shrinker use. The walker
initially supports only trylocking, since that's the
method used by shrinkes. The walker makes use of
scoped_guard() to allow exiting from the LRU walk loop
without performing any explicit unlocking or
cleanup.
v8:
- Split out from another patch.
- Use a struct for bool arguments to increase readability (Matt Brost).
- Unmap user-space cpu-mappings before shrinking pages.
- Explain non-fatal error codes (Matt Brost)
v10:
- Instead of using the existing helper, Wrap the interface inside out and
provide a loop to de-midlayer things the LRU iteration (Christian König).
- Removing the R-B by Matt Brost since the patch was significantly changed.
v11:
- Split the patch up to include just the LRU walk helper.
v12:
- Indent after scoped_guard() (Matt Brost)
v15:
- Adapt to new definition of scoped_guard()
Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Reviewed-by: Matthew Brost <matthew.brost@intel.com>
---
drivers/gpu/drm/ttm/ttm_bo_util.c | 140 +++++++++++++++++++++++++++++-
include/drm/ttm/ttm_bo.h | 72 +++++++++++++++
2 files changed, 208 insertions(+), 4 deletions(-)
diff --git a/drivers/gpu/drm/ttm/ttm_bo_util.c b/drivers/gpu/drm/ttm/ttm_bo_util.c
index 917096bd5f68..0cac02a9764c 100644
--- a/drivers/gpu/drm/ttm/ttm_bo_util.c
+++ b/drivers/gpu/drm/ttm/ttm_bo_util.c
@@ -769,12 +769,10 @@ int ttm_bo_pipeline_gutting(struct ttm_buffer_object *bo)
return ret;
}
-static bool ttm_lru_walk_trylock(struct ttm_lru_walk *walk,
+static bool ttm_lru_walk_trylock(struct ttm_operation_ctx *ctx,
struct ttm_buffer_object *bo,
bool *needs_unlock)
{
- struct ttm_operation_ctx *ctx = walk->ctx;
-
*needs_unlock = false;
if (dma_resv_trylock(bo->base.resv)) {
@@ -877,7 +875,7 @@ s64 ttm_lru_walk_for_evict(struct ttm_lru_walk *walk, struct ttm_device *bdev,
* since if we do it the other way around, and the trylock fails,
* we need to drop the lru lock to put the bo.
*/
- if (ttm_lru_walk_trylock(walk, bo, &bo_needs_unlock))
+ if (ttm_lru_walk_trylock(walk->ctx, bo, &bo_needs_unlock))
bo_locked = true;
else if (!walk->ticket || walk->ctx->no_wait_gpu ||
walk->trylock_only)
@@ -920,3 +918,137 @@ s64 ttm_lru_walk_for_evict(struct ttm_lru_walk *walk, struct ttm_device *bdev,
return progress;
}
+EXPORT_SYMBOL(ttm_lru_walk_for_evict);
+
+static void ttm_bo_lru_cursor_cleanup_bo(struct ttm_bo_lru_cursor *curs)
+{
+ struct ttm_buffer_object *bo = curs->bo;
+
+ if (bo) {
+ if (curs->needs_unlock)
+ dma_resv_unlock(bo->base.resv);
+ ttm_bo_put(bo);
+ curs->bo = NULL;
+ }
+}
+
+/**
+ * ttm_bo_lru_cursor_fini() - Stop using a struct ttm_bo_lru_cursor
+ * and clean up any iteration it was used for.
+ * @curs: The cursor.
+ */
+void ttm_bo_lru_cursor_fini(struct ttm_bo_lru_cursor *curs)
+{
+ spinlock_t *lru_lock = &curs->res_curs.man->bdev->lru_lock;
+
+ ttm_bo_lru_cursor_cleanup_bo(curs);
+ spin_lock(lru_lock);
+ ttm_resource_cursor_fini(&curs->res_curs);
+ spin_unlock(lru_lock);
+}
+EXPORT_SYMBOL(ttm_bo_lru_cursor_fini);
+
+/**
+ * ttm_bo_lru_cursor_init() - Initialize a struct ttm_bo_lru_cursor
+ * @curs: The ttm_bo_lru_cursor to initialize.
+ * @man: The ttm resource_manager whose LRU lists to iterate over.
+ * @ctx: The ttm_operation_ctx to govern the locking.
+ *
+ * Initialize a struct ttm_bo_lru_cursor. Currently only trylocking
+ * or prelocked buffer objects are available as detailed by
+ * @ctx::resv and @ctx::allow_res_evict. Ticketlocking is not
+ * supported.
+ *
+ * Return: Pointer to @curs. The function does not fail.
+ */
+struct ttm_bo_lru_cursor *
+ttm_bo_lru_cursor_init(struct ttm_bo_lru_cursor *curs,
+ struct ttm_resource_manager *man,
+ struct ttm_operation_ctx *ctx)
+{
+ memset(curs, 0, sizeof(*curs));
+ ttm_resource_cursor_init(&curs->res_curs, man);
+ curs->ctx = ctx;
+
+ return curs;
+}
+EXPORT_SYMBOL(ttm_bo_lru_cursor_init);
+
+static struct ttm_buffer_object *
+ttm_bo_from_res_reserved(struct ttm_resource *res, struct ttm_bo_lru_cursor *curs)
+{
+ struct ttm_buffer_object *bo = res->bo;
+
+ if (!ttm_lru_walk_trylock(curs->ctx, bo, &curs->needs_unlock))
+ return NULL;
+
+ if (!ttm_bo_get_unless_zero(bo)) {
+ if (curs->needs_unlock)
+ dma_resv_unlock(bo->base.resv);
+ return NULL;
+ }
+
+ curs->bo = bo;
+ return bo;
+}
+
+/**
+ * ttm_bo_lru_cursor_next() - Continue iterating a manager's LRU lists
+ * to find and lock buffer object.
+ * @curs: The cursor initialized using ttm_bo_lru_cursor_init() and
+ * ttm_bo_lru_cursor_first().
+ *
+ * Return: A pointer to a locked and reference-counted buffer object,
+ * or NULL if none could be found and looping should be terminated.
+ */
+struct ttm_buffer_object *ttm_bo_lru_cursor_next(struct ttm_bo_lru_cursor *curs)
+{
+ spinlock_t *lru_lock = &curs->res_curs.man->bdev->lru_lock;
+ struct ttm_resource *res = NULL;
+ struct ttm_buffer_object *bo;
+
+ ttm_bo_lru_cursor_cleanup_bo(curs);
+
+ spin_lock(lru_lock);
+ for (;;) {
+ res = ttm_resource_manager_next(&curs->res_curs);
+ if (!res)
+ break;
+
+ bo = ttm_bo_from_res_reserved(res, curs);
+ if (bo)
+ break;
+ }
+
+ spin_unlock(lru_lock);
+ return res ? bo : NULL;
+}
+EXPORT_SYMBOL(ttm_bo_lru_cursor_next);
+
+/**
+ * ttm_bo_lru_cursor_first() - Start iterating a manager's LRU lists
+ * to find and lock buffer object.
+ * @curs: The cursor initialized using ttm_bo_lru_cursor_init().
+ *
+ * Return: A pointer to a locked and reference-counted buffer object,
+ * or NULL if none could be found and looping should be terminated.
+ */
+struct ttm_buffer_object *ttm_bo_lru_cursor_first(struct ttm_bo_lru_cursor *curs)
+{
+ spinlock_t *lru_lock = &curs->res_curs.man->bdev->lru_lock;
+ struct ttm_buffer_object *bo;
+ struct ttm_resource *res;
+
+ spin_lock(lru_lock);
+ res = ttm_resource_manager_first(&curs->res_curs);
+ if (!res) {
+ spin_unlock(lru_lock);
+ return NULL;
+ }
+
+ bo = ttm_bo_from_res_reserved(res, curs);
+ spin_unlock(lru_lock);
+
+ return bo ? bo : ttm_bo_lru_cursor_next(curs);
+}
+EXPORT_SYMBOL(ttm_bo_lru_cursor_first);
diff --git a/include/drm/ttm/ttm_bo.h b/include/drm/ttm/ttm_bo.h
index 8ea11cd8df39..1509268849c0 100644
--- a/include/drm/ttm/ttm_bo.h
+++ b/include/drm/ttm/ttm_bo.h
@@ -467,4 +467,76 @@ void ttm_bo_tt_destroy(struct ttm_buffer_object *bo);
int ttm_bo_populate(struct ttm_buffer_object *bo,
struct ttm_operation_ctx *ctx);
+/* Driver LRU walk helpers initially targeted for shrinking. */
+
+/**
+ * struct ttm_bo_lru_cursor - Iterator cursor for TTM LRU list looping
+ */
+struct ttm_bo_lru_cursor {
+ /** @res_curs: Embedded struct ttm_resource_cursor. */
+ struct ttm_resource_cursor res_curs;
+ /**
+ * @ctx: The struct ttm_operation_ctx used while looping.
+ * governs the locking mode.
+ */
+ struct ttm_operation_ctx *ctx;
+ /**
+ * @bo: Buffer object pointer if a buffer object is refcounted,
+ * NULL otherwise.
+ */
+ struct ttm_buffer_object *bo;
+ /**
+ * @needs_unlock: Valid iff @bo != NULL. The bo resv needs
+ * unlock before the next iteration or after loop exit.
+ */
+ bool needs_unlock;
+};
+
+void ttm_bo_lru_cursor_fini(struct ttm_bo_lru_cursor *curs);
+
+struct ttm_bo_lru_cursor *
+ttm_bo_lru_cursor_init(struct ttm_bo_lru_cursor *curs,
+ struct ttm_resource_manager *man,
+ struct ttm_operation_ctx *ctx);
+
+struct ttm_buffer_object *ttm_bo_lru_cursor_first(struct ttm_bo_lru_cursor *curs);
+
+struct ttm_buffer_object *ttm_bo_lru_cursor_next(struct ttm_bo_lru_cursor *curs);
+
+/*
+ * Defines needed to use autocleanup (linux/cleanup.h) with struct ttm_bo_lru_cursor.
+ */
+DEFINE_CLASS(ttm_bo_lru_cursor, struct ttm_bo_lru_cursor *,
+ if (_T) {ttm_bo_lru_cursor_fini(_T); },
+ ttm_bo_lru_cursor_init(curs, man, ctx),
+ struct ttm_bo_lru_cursor *curs, struct ttm_resource_manager *man,
+ struct ttm_operation_ctx *ctx);
+static inline void *
+class_ttm_bo_lru_cursor_lock_ptr(class_ttm_bo_lru_cursor_t *_T)
+{ return *_T; }
+#define class_ttm_bo_lru_cursor_is_conditional false
+
+/**
+ * ttm_bo_lru_for_each_reserved_guarded() - Iterate over buffer objects owning
+ * resources on LRU lists.
+ * @_cursor: struct ttm_bo_lru_cursor to use for the iteration.
+ * @_man: The resource manager whose LRU lists to iterate over.
+ * @_ctx: The struct ttm_operation_context to govern the @_bo locking.
+ * @_bo: The struct ttm_buffer_object pointer pointing to the buffer object
+ * for the current iteration.
+ *
+ * Iterate over all resources of @_man and for each resource, attempt to
+ * reference and lock (using the locking mode detailed in @_ctx) the buffer
+ * object it points to. If successful, assign @_bo to the address of the
+ * buffer object and update @_cursor. The iteration is guarded in the
+ * sense that @_cursor will be initialized before looping start and cleaned
+ * up at looping termination, even if terminated prematurely by, for
+ * example a return or break statement. Exiting the loop will also unlock
+ * (if needed) and unreference @_bo.
+ */
+#define ttm_bo_lru_for_each_reserved_guarded(_cursor, _man, _ctx, _bo) \
+ scoped_guard(ttm_bo_lru_cursor, _cursor, _man, _ctx) \
+ for ((_bo) = ttm_bo_lru_cursor_first(_cursor); (_bo); \
+ (_bo) = ttm_bo_lru_cursor_next(_cursor))
+
#endif
--
2.48.1
^ permalink raw reply related [flat|nested] 26+ messages in thread* [PATCH v16 5/7] drm/ttm: Add helpers for shrinking
2025-01-30 10:13 [PATCH v16 0/7] TTM shrinker helpers and xe buffer object shrinker Thomas Hellström
` (3 preceding siblings ...)
2025-01-30 10:13 ` [PATCH v16 4/7] drm/ttm: Add a macro to perform LRU iteration Thomas Hellström
@ 2025-01-30 10:13 ` Thomas Hellström
2025-01-30 10:13 ` [PATCH v16 6/7] drm/xe: Add a shrinker for xe bos Thomas Hellström
` (9 subsequent siblings)
14 siblings, 0 replies; 26+ messages in thread
From: Thomas Hellström @ 2025-01-30 10:13 UTC (permalink / raw)
To: intel-xe; +Cc: Thomas Hellström, Matthew Brost
Add a number of helpers for shrinking that access core TTM and
core MM functionality in a way that make them unsuitable for
driver open-coding.
v11:
- New patch (split off from previous) and additional helpers.
v13:
- Adapt to ttm_backup interface change.
- Take resource off LRU when backed up.
Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Reviewed-by: Matthew Brost <matthew.brost@intel.com> #v11
---
drivers/gpu/drm/ttm/ttm_bo_util.c | 107 +++++++++++++++++++++++++++++-
drivers/gpu/drm/ttm/ttm_tt.c | 29 ++++++++
include/drm/ttm/ttm_bo.h | 21 ++++++
include/drm/ttm/ttm_tt.h | 2 +
4 files changed, 158 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/ttm/ttm_bo_util.c b/drivers/gpu/drm/ttm/ttm_bo_util.c
index 0cac02a9764c..15cab9bda17f 100644
--- a/drivers/gpu/drm/ttm/ttm_bo_util.c
+++ b/drivers/gpu/drm/ttm/ttm_bo_util.c
@@ -28,7 +28,7 @@
/*
* Authors: Thomas Hellstrom <thellstrom-at-vmware-dot-com>
*/
-
+#include <linux/swap.h>
#include <linux/vmalloc.h>
#include <drm/ttm/ttm_bo.h>
@@ -1052,3 +1052,108 @@ struct ttm_buffer_object *ttm_bo_lru_cursor_first(struct ttm_bo_lru_cursor *curs
return bo ? bo : ttm_bo_lru_cursor_next(curs);
}
EXPORT_SYMBOL(ttm_bo_lru_cursor_first);
+
+/**
+ * ttm_bo_shrink() - Helper to shrink a ttm buffer object.
+ * @ctx: The struct ttm_operation_ctx used for the shrinking operation.
+ * @bo: The buffer object.
+ * @flags: Flags governing the shrinking behaviour.
+ *
+ * The function uses the ttm_tt_back_up functionality to back up or
+ * purge a struct ttm_tt. If the bo is not in system, it's first
+ * moved there.
+ *
+ * Return: The number of pages shrunken or purged, or
+ * negative error code on failure.
+ */
+long ttm_bo_shrink(struct ttm_operation_ctx *ctx, struct ttm_buffer_object *bo,
+ const struct ttm_bo_shrink_flags flags)
+{
+ static const struct ttm_place sys_placement_flags = {
+ .fpfn = 0,
+ .lpfn = 0,
+ .mem_type = TTM_PL_SYSTEM,
+ .flags = 0,
+ };
+ static struct ttm_placement sys_placement = {
+ .num_placement = 1,
+ .placement = &sys_placement_flags,
+ };
+ struct ttm_tt *tt = bo->ttm;
+ long lret;
+
+ dma_resv_assert_held(bo->base.resv);
+
+ if (flags.allow_move && bo->resource->mem_type != TTM_PL_SYSTEM) {
+ int ret = ttm_bo_validate(bo, &sys_placement, ctx);
+
+ /* Consider -ENOMEM and -ENOSPC non-fatal. */
+ if (ret) {
+ if (ret == -ENOMEM || ret == -ENOSPC)
+ ret = -EBUSY;
+ return ret;
+ }
+ }
+
+ ttm_bo_unmap_virtual(bo);
+ lret = ttm_bo_wait_ctx(bo, ctx);
+ if (lret < 0)
+ return lret;
+
+ if (bo->bulk_move) {
+ spin_lock(&bo->bdev->lru_lock);
+ ttm_resource_del_bulk_move(bo->resource, bo);
+ spin_unlock(&bo->bdev->lru_lock);
+ }
+
+ lret = ttm_tt_backup(bo->bdev, tt, (struct ttm_backup_flags)
+ {.purge = flags.purge,
+ .writeback = flags.writeback});
+
+ if (lret <= 0 && bo->bulk_move) {
+ spin_lock(&bo->bdev->lru_lock);
+ ttm_resource_add_bulk_move(bo->resource, bo);
+ spin_unlock(&bo->bdev->lru_lock);
+ }
+
+ if (lret < 0 && lret != -EINTR)
+ return -EBUSY;
+
+ return lret;
+}
+EXPORT_SYMBOL(ttm_bo_shrink);
+
+/**
+ * ttm_bo_shrink_suitable() - Whether a bo is suitable for shinking
+ * @ctx: The struct ttm_operation_ctx governing the shrinking.
+ * @bo: The candidate for shrinking.
+ *
+ * Check whether the object, given the information available to TTM,
+ * is suitable for shinking, This function can and should be used
+ * before attempting to shrink an object.
+ *
+ * Return: true if suitable. false if not.
+ */
+bool ttm_bo_shrink_suitable(struct ttm_buffer_object *bo, struct ttm_operation_ctx *ctx)
+{
+ return bo->ttm && ttm_tt_is_populated(bo->ttm) && !bo->pin_count &&
+ (!ctx->no_wait_gpu ||
+ dma_resv_test_signaled(bo->base.resv, DMA_RESV_USAGE_BOOKKEEP));
+}
+EXPORT_SYMBOL(ttm_bo_shrink_suitable);
+
+/**
+ * ttm_bo_shrink_avoid_wait() - Whether to avoid waiting for GPU
+ * during shrinking
+ *
+ * In some situations, like direct reclaim, waiting (in particular gpu waiting)
+ * should be avoided since it may stall a system that could otherwise make progress
+ * shrinking something else less time consuming.
+ *
+ * Return: true if gpu waiting should be avoided, false if not.
+ */
+bool ttm_bo_shrink_avoid_wait(void)
+{
+ return !current_is_kswapd();
+}
+EXPORT_SYMBOL(ttm_bo_shrink_avoid_wait);
diff --git a/drivers/gpu/drm/ttm/ttm_tt.c b/drivers/gpu/drm/ttm/ttm_tt.c
index 00b7c28f2329..df0aa6c4b8b8 100644
--- a/drivers/gpu/drm/ttm/ttm_tt.c
+++ b/drivers/gpu/drm/ttm/ttm_tt.c
@@ -531,3 +531,32 @@ unsigned long ttm_tt_pages_limit(void)
return ttm_pages_limit;
}
EXPORT_SYMBOL(ttm_tt_pages_limit);
+
+/**
+ * ttm_tt_setup_backup() - Allocate and assign a backup structure for a ttm_tt
+ * @tt: The ttm_tt for wich to allocate and assign a backup structure.
+ *
+ * Assign a backup structure to be used for tt backup. This should
+ * typically be done at bo creation, to avoid allocations at shrinking
+ * time.
+ *
+ * Return: 0 on success, negative error code on failure.
+ */
+int ttm_tt_setup_backup(struct ttm_tt *tt)
+{
+ struct ttm_backup *backup =
+ ttm_backup_shmem_create(((loff_t)tt->num_pages) << PAGE_SHIFT);
+
+ if (WARN_ON_ONCE(!(tt->page_flags & TTM_TT_FLAG_EXTERNAL_MAPPABLE)))
+ return -EINVAL;
+
+ if (IS_ERR(backup))
+ return PTR_ERR(backup);
+
+ if (tt->backup)
+ ttm_backup_fini(tt->backup);
+
+ tt->backup = backup;
+ return 0;
+}
+EXPORT_SYMBOL(ttm_tt_setup_backup);
diff --git a/include/drm/ttm/ttm_bo.h b/include/drm/ttm/ttm_bo.h
index 1509268849c0..903cd1030110 100644
--- a/include/drm/ttm/ttm_bo.h
+++ b/include/drm/ttm/ttm_bo.h
@@ -225,6 +225,27 @@ struct ttm_lru_walk {
s64 ttm_lru_walk_for_evict(struct ttm_lru_walk *walk, struct ttm_device *bdev,
struct ttm_resource_manager *man, s64 target);
+/**
+ * struct ttm_bo_shrink_flags - flags to govern the bo shrinking behaviour
+ * @purge: Purge the content rather than backing it up.
+ * @writeback: Attempt to immediately write content to swap space.
+ * @allow_move: Allow moving to system before shrinking. This is typically
+ * not desired for zombie- or ghost objects (with zombie object meaning
+ * objects with a zero gem object refcount)
+ */
+struct ttm_bo_shrink_flags {
+ u32 purge : 1;
+ u32 writeback : 1;
+ u32 allow_move : 1;
+};
+
+long ttm_bo_shrink(struct ttm_operation_ctx *ctx, struct ttm_buffer_object *bo,
+ const struct ttm_bo_shrink_flags flags);
+
+bool ttm_bo_shrink_suitable(struct ttm_buffer_object *bo, struct ttm_operation_ctx *ctx);
+
+bool ttm_bo_shrink_avoid_wait(void);
+
/**
* ttm_bo_get - reference a struct ttm_buffer_object
*
diff --git a/include/drm/ttm/ttm_tt.h b/include/drm/ttm/ttm_tt.h
index c736c01ac2ca..13cf47f3322f 100644
--- a/include/drm/ttm/ttm_tt.h
+++ b/include/drm/ttm/ttm_tt.h
@@ -298,6 +298,8 @@ long ttm_tt_backup(struct ttm_device *bdev, struct ttm_tt *tt,
int ttm_tt_restore(struct ttm_device *bdev, struct ttm_tt *tt,
const struct ttm_operation_ctx *ctx);
+int ttm_tt_setup_backup(struct ttm_tt *tt);
+
#if IS_ENABLED(CONFIG_AGP)
#include <linux/agp_backend.h>
--
2.48.1
^ permalink raw reply related [flat|nested] 26+ messages in thread* [PATCH v16 6/7] drm/xe: Add a shrinker for xe bos
2025-01-30 10:13 [PATCH v16 0/7] TTM shrinker helpers and xe buffer object shrinker Thomas Hellström
` (4 preceding siblings ...)
2025-01-30 10:13 ` [PATCH v16 5/7] drm/ttm: Add helpers for shrinking Thomas Hellström
@ 2025-01-30 10:13 ` Thomas Hellström
2025-02-06 14:06 ` Christian König
2025-01-30 10:13 ` [PATCH v16 7/7] drm/xe: Increase the XE_PL_TT watermark Thomas Hellström
` (8 subsequent siblings)
14 siblings, 1 reply; 26+ messages in thread
From: Thomas Hellström @ 2025-01-30 10:13 UTC (permalink / raw)
To: intel-xe
Cc: Thomas Hellström, Christian König,
Somalapuram Amaranath, Matthew Brost, dri-devel
Rather than relying on the TTM watermark accounting add a shrinker
for xe_bos in TT or system memory.
Leverage the newly added TTM per-page shrinking and shmem backup
support.
Although xe doesn't fully support WONTNEED (purgeable) bos yet,
introduce and add shrinker support for purgeable ttm_tts.
v2:
- Cleanups bugfixes and a KUNIT shrinker test.
- Add writeback support, and activate if kswapd.
v3:
- Move the try_shrink() helper to core TTM.
- Minor cleanups.
v4:
- Add runtime pm for the shrinker. Shrinking may require an active
device for CCS metadata copying.
v5:
- Separately purge ghost- and zombie objects in the shrinker.
- Fix a format specifier - type inconsistency. (Kernel test robot).
v7:
- s/long/s64/ (Christian König)
- s/sofar/progress/ (Matt Brost)
v8:
- Rebase on Xe KUNIT update.
- Add content verifying to the shrinker kunit test.
- Split out TTM changes to a separate patch.
- Get rid of multiple bool arguments for clarity (Matt Brost)
- Avoid an error pointer dereference (Matt Brost)
- Avoid an integer overflow (Matt Auld)
- Address misc review comments by Matt Brost.
v9:
- Fix a compliation error.
- Rebase.
v10:
- Update to new LRU walk interface.
- Rework ghost-, zombie and purged object shrinking.
- Rebase.
v11:
- Use additional TTM helpers.
- Honor __GFP_FS and __GFP_IO
- Rebase.
v13:
- Use ttm_tt_setup_backup().
v14:
- Don't set up backup on imported bos.
v15:
- Rebase on backup interface changes.
Cc: Christian König <christian.koenig@amd.com>
Cc: Somalapuram Amaranath <Amaranath.Somalapuram@amd.com>
Cc: Matthew Brost <matthew.brost@intel.com>
Cc: <dri-devel@lists.freedesktop.org>
Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Reviewed-by: Matthew Brost <matthew.brost@intel.com>
---
drivers/gpu/drm/xe/Makefile | 1 +
drivers/gpu/drm/xe/tests/xe_bo.c | 6 +-
drivers/gpu/drm/xe/xe_bo.c | 202 +++++++++++++++++++--
drivers/gpu/drm/xe/xe_bo.h | 36 ++++
drivers/gpu/drm/xe/xe_device.c | 8 +
drivers/gpu/drm/xe/xe_device_types.h | 2 +
drivers/gpu/drm/xe/xe_shrinker.c | 258 +++++++++++++++++++++++++++
drivers/gpu/drm/xe/xe_shrinker.h | 18 ++
8 files changed, 513 insertions(+), 18 deletions(-)
create mode 100644 drivers/gpu/drm/xe/xe_shrinker.c
create mode 100644 drivers/gpu/drm/xe/xe_shrinker.h
diff --git a/drivers/gpu/drm/xe/Makefile b/drivers/gpu/drm/xe/Makefile
index 328aff36831b..b3738bcea11e 100644
--- a/drivers/gpu/drm/xe/Makefile
+++ b/drivers/gpu/drm/xe/Makefile
@@ -95,6 +95,7 @@ xe-y += xe_bb.o \
xe_ring_ops.o \
xe_sa.o \
xe_sched_job.o \
+ xe_shrinker.o \
xe_step.o \
xe_survivability_mode.o \
xe_sync.o \
diff --git a/drivers/gpu/drm/xe/tests/xe_bo.c b/drivers/gpu/drm/xe/tests/xe_bo.c
index 6795d1d916e4..9fde67ca989f 100644
--- a/drivers/gpu/drm/xe/tests/xe_bo.c
+++ b/drivers/gpu/drm/xe/tests/xe_bo.c
@@ -514,8 +514,13 @@ static int shrink_test_run_device(struct xe_device *xe)
* other way around, they may not be subject to swapping...
*/
if (alloced < purgeable) {
+ xe_ttm_tt_account_subtract(&xe_tt->ttm);
xe_tt->purgeable = true;
+ xe_ttm_tt_account_add(&xe_tt->ttm);
bo->ttm.priority = 0;
+ spin_lock(&bo->ttm.bdev->lru_lock);
+ ttm_bo_move_to_lru_tail(&bo->ttm);
+ spin_unlock(&bo->ttm.bdev->lru_lock);
} else {
int ret = shrink_test_fill_random(bo, &prng, link);
@@ -570,7 +575,6 @@ static int shrink_test_run_device(struct xe_device *xe)
if (ret == -EINTR)
intr = true;
} while (ret == -EINTR && !signal_pending(current));
-
if (!ret && !purgeable)
failed = shrink_test_verify(test, bo, count, &prng, link);
diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c
index c32201123d44..a133d66587b8 100644
--- a/drivers/gpu/drm/xe/xe_bo.c
+++ b/drivers/gpu/drm/xe/xe_bo.c
@@ -10,6 +10,7 @@
#include <drm/drm_drv.h>
#include <drm/drm_gem_ttm_helper.h>
#include <drm/drm_managed.h>
+#include <drm/ttm/ttm_backup.h>
#include <drm/ttm/ttm_device.h>
#include <drm/ttm/ttm_placement.h>
#include <drm/ttm/ttm_tt.h>
@@ -27,6 +28,7 @@
#include "xe_pm.h"
#include "xe_preempt_fence.h"
#include "xe_res_cursor.h"
+#include "xe_shrinker.h"
#include "xe_trace_bo.h"
#include "xe_ttm_stolen_mgr.h"
#include "xe_vm.h"
@@ -283,9 +285,11 @@ static void xe_evict_flags(struct ttm_buffer_object *tbo,
}
}
+/* struct xe_ttm_tt - Subclassed ttm_tt for xe */
struct xe_ttm_tt {
struct ttm_tt ttm;
- struct device *dev;
+ /** @xe - The xe device */
+ struct xe_device *xe;
struct sg_table sgt;
struct sg_table *sg;
/** @purgeable: Whether the content of the pages of @ttm is purgeable. */
@@ -298,7 +302,8 @@ static int xe_tt_map_sg(struct ttm_tt *tt)
unsigned long num_pages = tt->num_pages;
int ret;
- XE_WARN_ON(tt->page_flags & TTM_TT_FLAG_EXTERNAL);
+ XE_WARN_ON((tt->page_flags & TTM_TT_FLAG_EXTERNAL) &&
+ !(tt->page_flags & TTM_TT_FLAG_EXTERNAL_MAPPABLE));
if (xe_tt->sg)
return 0;
@@ -306,13 +311,13 @@ static int xe_tt_map_sg(struct ttm_tt *tt)
ret = sg_alloc_table_from_pages_segment(&xe_tt->sgt, tt->pages,
num_pages, 0,
(u64)num_pages << PAGE_SHIFT,
- xe_sg_segment_size(xe_tt->dev),
+ xe_sg_segment_size(xe_tt->xe->drm.dev),
GFP_KERNEL);
if (ret)
return ret;
xe_tt->sg = &xe_tt->sgt;
- ret = dma_map_sgtable(xe_tt->dev, xe_tt->sg, DMA_BIDIRECTIONAL,
+ ret = dma_map_sgtable(xe_tt->xe->drm.dev, xe_tt->sg, DMA_BIDIRECTIONAL,
DMA_ATTR_SKIP_CPU_SYNC);
if (ret) {
sg_free_table(xe_tt->sg);
@@ -328,7 +333,7 @@ static void xe_tt_unmap_sg(struct ttm_tt *tt)
struct xe_ttm_tt *xe_tt = container_of(tt, struct xe_ttm_tt, ttm);
if (xe_tt->sg) {
- dma_unmap_sgtable(xe_tt->dev, xe_tt->sg,
+ dma_unmap_sgtable(xe_tt->xe->drm.dev, xe_tt->sg,
DMA_BIDIRECTIONAL, 0);
sg_free_table(xe_tt->sg);
xe_tt->sg = NULL;
@@ -343,21 +348,47 @@ struct sg_table *xe_bo_sg(struct xe_bo *bo)
return xe_tt->sg;
}
+/*
+ * Account ttm pages against the device shrinker's shrinkable and
+ * purgeable counts.
+ */
+static void xe_ttm_tt_account_add(struct ttm_tt *tt)
+{
+ struct xe_ttm_tt *xe_tt = container_of(tt, struct xe_ttm_tt, ttm);
+
+ if (xe_tt->purgeable)
+ xe_shrinker_mod_pages(xe_tt->xe->mem.shrinker, 0, tt->num_pages);
+ else
+ xe_shrinker_mod_pages(xe_tt->xe->mem.shrinker, tt->num_pages, 0);
+}
+
+static void xe_ttm_tt_account_subtract(struct ttm_tt *tt)
+{
+ struct xe_ttm_tt *xe_tt = container_of(tt, struct xe_ttm_tt, ttm);
+
+ if (xe_tt->purgeable)
+ xe_shrinker_mod_pages(xe_tt->xe->mem.shrinker, 0, -(long)tt->num_pages);
+ else
+ xe_shrinker_mod_pages(xe_tt->xe->mem.shrinker, -(long)tt->num_pages, 0);
+}
+
static struct ttm_tt *xe_ttm_tt_create(struct ttm_buffer_object *ttm_bo,
u32 page_flags)
{
struct xe_bo *bo = ttm_to_xe_bo(ttm_bo);
struct xe_device *xe = xe_bo_device(bo);
- struct xe_ttm_tt *tt;
+ struct xe_ttm_tt *xe_tt;
+ struct ttm_tt *tt;
unsigned long extra_pages;
enum ttm_caching caching = ttm_cached;
int err;
- tt = kzalloc(sizeof(*tt), GFP_KERNEL);
- if (!tt)
+ xe_tt = kzalloc(sizeof(*xe_tt), GFP_KERNEL);
+ if (!xe_tt)
return NULL;
- tt->dev = xe->drm.dev;
+ tt = &xe_tt->ttm;
+ xe_tt->xe = xe;
extra_pages = 0;
if (xe_bo_needs_ccs_pages(bo))
@@ -403,42 +434,66 @@ static struct ttm_tt *xe_ttm_tt_create(struct ttm_buffer_object *ttm_bo,
caching = ttm_uncached;
}
- err = ttm_tt_init(&tt->ttm, &bo->ttm, page_flags, caching, extra_pages);
+ if (ttm_bo->type != ttm_bo_type_sg)
+ page_flags |= TTM_TT_FLAG_EXTERNAL | TTM_TT_FLAG_EXTERNAL_MAPPABLE;
+
+ err = ttm_tt_init(tt, &bo->ttm, page_flags, caching, extra_pages);
if (err) {
- kfree(tt);
+ kfree(xe_tt);
return NULL;
}
- return &tt->ttm;
+ if (ttm_bo->type != ttm_bo_type_sg) {
+ err = ttm_tt_setup_backup(tt);
+ if (err) {
+ ttm_tt_fini(tt);
+ kfree(xe_tt);
+ return NULL;
+ }
+ }
+
+ return tt;
}
static int xe_ttm_tt_populate(struct ttm_device *ttm_dev, struct ttm_tt *tt,
struct ttm_operation_ctx *ctx)
{
+ struct xe_ttm_tt *xe_tt = container_of(tt, struct xe_ttm_tt, ttm);
int err;
/*
* dma-bufs are not populated with pages, and the dma-
* addresses are set up when moved to XE_PL_TT.
*/
- if (tt->page_flags & TTM_TT_FLAG_EXTERNAL)
+ if ((tt->page_flags & TTM_TT_FLAG_EXTERNAL) &&
+ !(tt->page_flags & TTM_TT_FLAG_EXTERNAL_MAPPABLE))
return 0;
- err = ttm_pool_alloc(&ttm_dev->pool, tt, ctx);
+ if (ttm_tt_is_backed_up(tt) && !xe_tt->purgeable) {
+ err = ttm_tt_restore(ttm_dev, tt, ctx);
+ } else {
+ ttm_tt_clear_backed_up(tt);
+ err = ttm_pool_alloc(&ttm_dev->pool, tt, ctx);
+ }
if (err)
return err;
- return err;
+ xe_tt->purgeable = false;
+ xe_ttm_tt_account_add(tt);
+
+ return 0;
}
static void xe_ttm_tt_unpopulate(struct ttm_device *ttm_dev, struct ttm_tt *tt)
{
- if (tt->page_flags & TTM_TT_FLAG_EXTERNAL)
+ if ((tt->page_flags & TTM_TT_FLAG_EXTERNAL) &&
+ !(tt->page_flags & TTM_TT_FLAG_EXTERNAL_MAPPABLE))
return;
xe_tt_unmap_sg(tt);
- return ttm_pool_free(&ttm_dev->pool, tt);
+ ttm_pool_free(&ttm_dev->pool, tt);
+ xe_ttm_tt_account_subtract(tt);
}
static void xe_ttm_tt_destroy(struct ttm_device *ttm_dev, struct ttm_tt *tt)
@@ -888,6 +943,111 @@ static int xe_bo_move(struct ttm_buffer_object *ttm_bo, bool evict,
return ret;
}
+static long xe_bo_shrink_purge(struct ttm_operation_ctx *ctx,
+ struct ttm_buffer_object *bo,
+ unsigned long *scanned)
+{
+ long lret;
+
+ /* Fake move to system, without copying data. */
+ if (bo->resource->mem_type != XE_PL_SYSTEM) {
+ struct ttm_resource *new_resource;
+
+ lret = ttm_bo_wait_ctx(bo, ctx);
+ if (lret)
+ return lret;
+
+ lret = ttm_bo_mem_space(bo, &sys_placement, &new_resource, ctx);
+ if (lret)
+ return lret;
+
+ xe_tt_unmap_sg(bo->ttm);
+ ttm_bo_move_null(bo, new_resource);
+ }
+
+ *scanned += bo->ttm->num_pages;
+ lret = ttm_bo_shrink(ctx, bo, (struct ttm_bo_shrink_flags)
+ {.purge = true,
+ .writeback = false,
+ .allow_move = false});
+
+ if (lret > 0)
+ xe_ttm_tt_account_subtract(bo->ttm);
+
+ return lret;
+}
+
+/**
+ * xe_bo_shrink() - Try to shrink an xe bo.
+ * @ctx: The struct ttm_operation_ctx used for shrinking.
+ * @bo: The TTM buffer object whose pages to shrink.
+ * @flags: Flags governing the shrink behaviour.
+ * @scanned: Pointer to a counter of the number of pages
+ * attempted to shrink.
+ *
+ * Try to shrink- or purge a bo, and if it succeeds, unmap dma.
+ * Note that we need to be able to handle also non xe bos
+ * (ghost bos), but only if the struct ttm_tt is embedded in
+ * a struct xe_ttm_tt. When the function attempts to shrink
+ * the pages of a buffer object, The value pointed to by @scanned
+ * is updated.
+ *
+ * Return: The number of pages shrunken or purged, or negative error
+ * code on failure.
+ */
+long xe_bo_shrink(struct ttm_operation_ctx *ctx, struct ttm_buffer_object *bo,
+ const struct xe_bo_shrink_flags flags,
+ unsigned long *scanned)
+{
+ struct ttm_tt *tt = bo->ttm;
+ struct xe_ttm_tt *xe_tt = container_of(tt, struct xe_ttm_tt, ttm);
+ struct ttm_place place = {.mem_type = bo->resource->mem_type};
+ struct xe_bo *xe_bo = ttm_to_xe_bo(bo);
+ struct xe_device *xe = xe_tt->xe;
+ bool needs_rpm;
+ long lret = 0L;
+
+ if (!(tt->page_flags & TTM_TT_FLAG_EXTERNAL_MAPPABLE) ||
+ (flags.purge && !xe_tt->purgeable))
+ return -EBUSY;
+
+ if (!ttm_bo_eviction_valuable(bo, &place))
+ return -EBUSY;
+
+ if (!xe_bo_is_xe_bo(bo) || !xe_bo_get_unless_zero(xe_bo))
+ return xe_bo_shrink_purge(ctx, bo, scanned);
+
+ if (xe_tt->purgeable) {
+ if (bo->resource->mem_type != XE_PL_SYSTEM)
+ lret = xe_bo_move_notify(xe_bo, ctx);
+ if (!lret)
+ lret = xe_bo_shrink_purge(ctx, bo, scanned);
+ goto out_unref;
+ }
+
+ /* System CCS needs gpu copy when moving PL_TT -> PL_SYSTEM */
+ needs_rpm = (!IS_DGFX(xe) && bo->resource->mem_type != XE_PL_SYSTEM &&
+ xe_bo_needs_ccs_pages(xe_bo));
+ if (needs_rpm && !xe_pm_runtime_get_if_active(xe))
+ goto out_unref;
+
+ *scanned += tt->num_pages;
+ lret = ttm_bo_shrink(ctx, bo, (struct ttm_bo_shrink_flags)
+ {.purge = false,
+ .writeback = flags.writeback,
+ .allow_move = true});
+ if (needs_rpm)
+ xe_pm_runtime_put(xe);
+
+ if (lret > 0)
+ xe_ttm_tt_account_subtract(tt);
+
+out_unref:
+ xe_bo_put(xe_bo);
+
+ return lret;
+}
+
/**
* xe_bo_evict_pinned() - Evict a pinned VRAM object to system memory
* @bo: The buffer object to move.
@@ -1905,6 +2065,8 @@ int xe_bo_pin_external(struct xe_bo *bo)
}
ttm_bo_pin(&bo->ttm);
+ if (bo->ttm.ttm && ttm_tt_is_populated(bo->ttm.ttm))
+ xe_ttm_tt_account_subtract(bo->ttm.ttm);
/*
* FIXME: If we always use the reserve / unreserve functions for locking
@@ -1964,6 +2126,8 @@ int xe_bo_pin(struct xe_bo *bo)
}
ttm_bo_pin(&bo->ttm);
+ if (bo->ttm.ttm && ttm_tt_is_populated(bo->ttm.ttm))
+ xe_ttm_tt_account_subtract(bo->ttm.ttm);
/*
* FIXME: If we always use the reserve / unreserve functions for locking
@@ -1998,6 +2162,8 @@ void xe_bo_unpin_external(struct xe_bo *bo)
spin_unlock(&xe->pinned.lock);
ttm_bo_unpin(&bo->ttm);
+ if (bo->ttm.ttm && ttm_tt_is_populated(bo->ttm.ttm))
+ xe_ttm_tt_account_add(bo->ttm.ttm);
/*
* FIXME: If we always use the reserve / unreserve functions for locking
@@ -2021,6 +2187,8 @@ void xe_bo_unpin(struct xe_bo *bo)
spin_unlock(&xe->pinned.lock);
}
ttm_bo_unpin(&bo->ttm);
+ if (bo->ttm.ttm && ttm_tt_is_populated(bo->ttm.ttm))
+ xe_ttm_tt_account_add(bo->ttm.ttm);
}
/**
diff --git a/drivers/gpu/drm/xe/xe_bo.h b/drivers/gpu/drm/xe/xe_bo.h
index 04995c5ced32..9ca87973cff7 100644
--- a/drivers/gpu/drm/xe/xe_bo.h
+++ b/drivers/gpu/drm/xe/xe_bo.h
@@ -148,6 +148,28 @@ static inline struct xe_bo *xe_bo_get(struct xe_bo *bo)
void xe_bo_put(struct xe_bo *bo);
+/*
+ * xe_bo_get_unless_zero() - Conditionally obtain a GEM object refcount on an
+ * xe bo
+ * @bo: The bo for which we want to obtain a refcount.
+ *
+ * There is a short window between where the bo's GEM object refcount reaches
+ * zero and where we put the final ttm_bo reference. Code in the eviction- and
+ * shrinking path should therefore attempt to grab a gem object reference before
+ * trying to use members outside of the base class ttm object. This function is
+ * intended for that purpose. On successful return, this function must be paired
+ * with an xe_bo_put().
+ *
+ * Return: @bo on success, NULL on failure.
+ */
+static inline __must_check struct xe_bo *xe_bo_get_unless_zero(struct xe_bo *bo)
+{
+ if (!bo || !kref_get_unless_zero(&bo->ttm.base.refcount))
+ return NULL;
+
+ return bo;
+}
+
static inline void __xe_bo_unset_bulk_move(struct xe_bo *bo)
{
if (bo)
@@ -343,6 +365,20 @@ static inline unsigned int xe_sg_segment_size(struct device *dev)
return round_down(max / 2, PAGE_SIZE);
}
+/**
+ * struct xe_bo_shrink_flags - flags governing the shrink behaviour.
+ * @purge: Only purging allowed. Don't shrink if bo not purgeable.
+ * @writeback: Attempt to immediately move content to swap.
+ */
+struct xe_bo_shrink_flags {
+ u32 purge : 1;
+ u32 writeback : 1;
+};
+
+long xe_bo_shrink(struct ttm_operation_ctx *ctx, struct ttm_buffer_object *bo,
+ const struct xe_bo_shrink_flags flags,
+ unsigned long *scanned);
+
#if IS_ENABLED(CONFIG_DRM_XE_KUNIT_TEST)
/**
* xe_bo_is_mem_type - Whether the bo currently resides in the given
diff --git a/drivers/gpu/drm/xe/xe_device.c b/drivers/gpu/drm/xe/xe_device.c
index 8fedc72e9db4..c4a6062124b0 100644
--- a/drivers/gpu/drm/xe/xe_device.c
+++ b/drivers/gpu/drm/xe/xe_device.c
@@ -51,6 +51,7 @@
#include "xe_pm.h"
#include "xe_pmu.h"
#include "xe_query.h"
+#include "xe_shrinker.h"
#include "xe_sriov.h"
#include "xe_survivability_mode.h"
#include "xe_tile.h"
@@ -396,6 +397,9 @@ static void xe_device_destroy(struct drm_device *dev, void *dummy)
if (xe->unordered_wq)
destroy_workqueue(xe->unordered_wq);
+ if (!IS_ERR_OR_NULL(xe->mem.shrinker))
+ xe_shrinker_destroy(xe->mem.shrinker);
+
if (xe->destroy_wq)
destroy_workqueue(xe->destroy_wq);
@@ -428,6 +432,10 @@ struct xe_device *xe_device_create(struct pci_dev *pdev,
if (err)
goto err;
+ xe->mem.shrinker = xe_shrinker_create(xe);
+ if (IS_ERR(xe->mem.shrinker))
+ return ERR_CAST(xe->mem.shrinker);
+
xe->info.devid = pdev->device;
xe->info.revid = pdev->revision;
xe->info.force_execlist = xe_modparam.force_execlist;
diff --git a/drivers/gpu/drm/xe/xe_device_types.h b/drivers/gpu/drm/xe/xe_device_types.h
index 89f532b67bc4..7406deac0fec 100644
--- a/drivers/gpu/drm/xe/xe_device_types.h
+++ b/drivers/gpu/drm/xe/xe_device_types.h
@@ -369,6 +369,8 @@ struct xe_device {
struct xe_mem_region vram;
/** @mem.sys_mgr: system TTM manager */
struct ttm_resource_manager sys_mgr;
+ /** @mem.sys_mgr: system memory shrinker. */
+ struct xe_shrinker *shrinker;
} mem;
/** @sriov: device level virtualization data */
diff --git a/drivers/gpu/drm/xe/xe_shrinker.c b/drivers/gpu/drm/xe/xe_shrinker.c
new file mode 100644
index 000000000000..8184390f9c7b
--- /dev/null
+++ b/drivers/gpu/drm/xe/xe_shrinker.c
@@ -0,0 +1,258 @@
+// SPDX-License-Identifier: MIT
+/*
+ * Copyright © 2024 Intel Corporation
+ */
+
+#include <linux/shrinker.h>
+
+#include <drm/ttm/ttm_backup.h>
+#include <drm/ttm/ttm_bo.h>
+#include <drm/ttm/ttm_tt.h>
+
+#include "xe_bo.h"
+#include "xe_pm.h"
+#include "xe_shrinker.h"
+
+/**
+ * struct xe_shrinker - per-device shrinker
+ * @xe: Back pointer to the device.
+ * @lock: Lock protecting accounting.
+ * @shrinkable_pages: Number of pages that are currently shrinkable.
+ * @purgeable_pages: Number of pages that are currently purgeable.
+ * @shrink: Pointer to the mm shrinker.
+ * @pm_worker: Worker to wake up the device if required.
+ */
+struct xe_shrinker {
+ struct xe_device *xe;
+ rwlock_t lock;
+ long shrinkable_pages;
+ long purgeable_pages;
+ struct shrinker *shrink;
+ struct work_struct pm_worker;
+};
+
+static struct xe_shrinker *to_xe_shrinker(struct shrinker *shrink)
+{
+ return shrink->private_data;
+}
+
+/**
+ * xe_shrinker_mod_pages() - Modify shrinker page accounting
+ * @shrinker: Pointer to the struct xe_shrinker.
+ * @shrinkable: Shrinkable pages delta. May be negative.
+ * @purgeable: Purgeable page delta. May be negative.
+ *
+ * Modifies the shrinkable and purgeable pages accounting.
+ */
+void
+xe_shrinker_mod_pages(struct xe_shrinker *shrinker, long shrinkable, long purgeable)
+{
+ write_lock(&shrinker->lock);
+ shrinker->shrinkable_pages += shrinkable;
+ shrinker->purgeable_pages += purgeable;
+ write_unlock(&shrinker->lock);
+}
+
+static s64 xe_shrinker_walk(struct xe_device *xe,
+ struct ttm_operation_ctx *ctx,
+ const struct xe_bo_shrink_flags flags,
+ unsigned long to_scan, unsigned long *scanned)
+{
+ unsigned int mem_type;
+ s64 freed = 0, lret;
+
+ for (mem_type = XE_PL_SYSTEM; mem_type <= XE_PL_TT; ++mem_type) {
+ struct ttm_resource_manager *man = ttm_manager_type(&xe->ttm, mem_type);
+ struct ttm_bo_lru_cursor curs;
+ struct ttm_buffer_object *ttm_bo;
+
+ if (!man || !man->use_tt)
+ continue;
+
+ ttm_bo_lru_for_each_reserved_guarded(&curs, man, ctx, ttm_bo) {
+ if (!ttm_bo_shrink_suitable(ttm_bo, ctx))
+ continue;
+
+ lret = xe_bo_shrink(ctx, ttm_bo, flags, scanned);
+ if (lret < 0)
+ return lret;
+
+ freed += lret;
+ if (*scanned >= to_scan)
+ break;
+ }
+ }
+
+ return freed;
+}
+
+static unsigned long
+xe_shrinker_count(struct shrinker *shrink, struct shrink_control *sc)
+{
+ struct xe_shrinker *shrinker = to_xe_shrinker(shrink);
+ unsigned long num_pages;
+ bool can_backup = !!(sc->gfp_mask & __GFP_FS);
+
+ num_pages = ttm_backup_bytes_avail() >> PAGE_SHIFT;
+ read_lock(&shrinker->lock);
+
+ if (can_backup)
+ num_pages = min_t(unsigned long, num_pages, shrinker->shrinkable_pages);
+ else
+ num_pages = 0;
+
+ num_pages += shrinker->purgeable_pages;
+ read_unlock(&shrinker->lock);
+
+ return num_pages ? num_pages : SHRINK_EMPTY;
+}
+
+/*
+ * Check if we need runtime pm, and if so try to grab a reference if
+ * already active. If grabbing a reference fails, queue a worker that
+ * does it for us outside of reclaim, but don't wait for it to complete.
+ * If bo shrinking needs an rpm reference and we don't have it (yet),
+ * that bo will be skipped anyway.
+ */
+static bool xe_shrinker_runtime_pm_get(struct xe_shrinker *shrinker, bool force,
+ unsigned long nr_to_scan, bool can_backup)
+{
+ struct xe_device *xe = shrinker->xe;
+
+ if (IS_DGFX(xe) || !xe_device_has_flat_ccs(xe) ||
+ !ttm_backup_bytes_avail())
+ return false;
+
+ if (!force) {
+ read_lock(&shrinker->lock);
+ force = (nr_to_scan > shrinker->purgeable_pages && can_backup);
+ read_unlock(&shrinker->lock);
+ if (!force)
+ return false;
+ }
+
+ if (!xe_pm_runtime_get_if_active(xe)) {
+ if (xe_rpm_reclaim_safe(xe) && !ttm_bo_shrink_avoid_wait()) {
+ xe_pm_runtime_get(xe);
+ return true;
+ }
+ queue_work(xe->unordered_wq, &shrinker->pm_worker);
+ return false;
+ }
+
+ return true;
+}
+
+static void xe_shrinker_runtime_pm_put(struct xe_shrinker *shrinker, bool runtime_pm)
+{
+ if (runtime_pm)
+ xe_pm_runtime_put(shrinker->xe);
+}
+
+static unsigned long xe_shrinker_scan(struct shrinker *shrink, struct shrink_control *sc)
+{
+ struct xe_shrinker *shrinker = to_xe_shrinker(shrink);
+ struct ttm_operation_ctx ctx = {
+ .interruptible = false,
+ .no_wait_gpu = ttm_bo_shrink_avoid_wait(),
+ };
+ unsigned long nr_to_scan, nr_scanned = 0, freed = 0;
+ struct xe_bo_shrink_flags shrink_flags = {
+ .purge = true,
+ /* Don't request writeback without __GFP_IO. */
+ .writeback = !ctx.no_wait_gpu && (sc->gfp_mask & __GFP_IO),
+ };
+ bool runtime_pm;
+ bool purgeable;
+ bool can_backup = !!(sc->gfp_mask & __GFP_FS);
+ s64 lret;
+
+ nr_to_scan = sc->nr_to_scan;
+
+ read_lock(&shrinker->lock);
+ purgeable = !!shrinker->purgeable_pages;
+ read_unlock(&shrinker->lock);
+
+ /* Might need runtime PM. Try to wake early if it looks like it. */
+ runtime_pm = xe_shrinker_runtime_pm_get(shrinker, false, nr_to_scan, can_backup);
+
+ if (purgeable && nr_scanned < nr_to_scan) {
+ lret = xe_shrinker_walk(shrinker->xe, &ctx, shrink_flags,
+ nr_to_scan, &nr_scanned);
+ if (lret >= 0)
+ freed += lret;
+ }
+
+ sc->nr_scanned = nr_scanned;
+ if (nr_scanned >= nr_to_scan || !can_backup)
+ goto out;
+
+ /* If we didn't wake before, try to do it now if needed. */
+ if (!runtime_pm)
+ runtime_pm = xe_shrinker_runtime_pm_get(shrinker, true, 0, can_backup);
+
+ shrink_flags.purge = false;
+ lret = xe_shrinker_walk(shrinker->xe, &ctx, shrink_flags,
+ nr_to_scan, &nr_scanned);
+ if (lret >= 0)
+ freed += lret;
+
+ sc->nr_scanned = nr_scanned;
+out:
+ xe_shrinker_runtime_pm_put(shrinker, runtime_pm);
+ return nr_scanned ? freed : SHRINK_STOP;
+}
+
+/* Wake up the device for shrinking. */
+static void xe_shrinker_pm(struct work_struct *work)
+{
+ struct xe_shrinker *shrinker =
+ container_of(work, typeof(*shrinker), pm_worker);
+
+ xe_pm_runtime_get(shrinker->xe);
+ xe_pm_runtime_put(shrinker->xe);
+}
+
+/**
+ * xe_shrinker_create() - Create an xe per-device shrinker
+ * @xe: Pointer to the xe device.
+ *
+ * Returns: A pointer to the created shrinker on success,
+ * Negative error code on failure.
+ */
+struct xe_shrinker *xe_shrinker_create(struct xe_device *xe)
+{
+ struct xe_shrinker *shrinker = kzalloc(sizeof(*shrinker), GFP_KERNEL);
+
+ if (!shrinker)
+ return ERR_PTR(-ENOMEM);
+
+ shrinker->shrink = shrinker_alloc(0, "xe system shrinker");
+ if (!shrinker->shrink) {
+ kfree(shrinker);
+ return ERR_PTR(-ENOMEM);
+ }
+
+ INIT_WORK(&shrinker->pm_worker, xe_shrinker_pm);
+ shrinker->xe = xe;
+ rwlock_init(&shrinker->lock);
+ shrinker->shrink->count_objects = xe_shrinker_count;
+ shrinker->shrink->scan_objects = xe_shrinker_scan;
+ shrinker->shrink->private_data = shrinker;
+ shrinker_register(shrinker->shrink);
+
+ return shrinker;
+}
+
+/**
+ * xe_shrinker_destroy() - Destroy an xe per-device shrinker
+ * @shrinker: Pointer to the shrinker to destroy.
+ */
+void xe_shrinker_destroy(struct xe_shrinker *shrinker)
+{
+ xe_assert(shrinker->xe, !shrinker->shrinkable_pages);
+ xe_assert(shrinker->xe, !shrinker->purgeable_pages);
+ shrinker_free(shrinker->shrink);
+ flush_work(&shrinker->pm_worker);
+ kfree(shrinker);
+}
diff --git a/drivers/gpu/drm/xe/xe_shrinker.h b/drivers/gpu/drm/xe/xe_shrinker.h
new file mode 100644
index 000000000000..28a038f4fcbf
--- /dev/null
+++ b/drivers/gpu/drm/xe/xe_shrinker.h
@@ -0,0 +1,18 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright © 2024 Intel Corporation
+ */
+
+#ifndef _XE_SHRINKER_H_
+#define _XE_SHRINKER_H_
+
+struct xe_shrinker;
+struct xe_device;
+
+void xe_shrinker_mod_pages(struct xe_shrinker *shrinker, long shrinkable, long purgeable);
+
+struct xe_shrinker *xe_shrinker_create(struct xe_device *xe);
+
+void xe_shrinker_destroy(struct xe_shrinker *shrinker);
+
+#endif
--
2.48.1
^ permalink raw reply related [flat|nested] 26+ messages in thread* Re: [PATCH v16 6/7] drm/xe: Add a shrinker for xe bos
2025-01-30 10:13 ` [PATCH v16 6/7] drm/xe: Add a shrinker for xe bos Thomas Hellström
@ 2025-02-06 14:06 ` Christian König
0 siblings, 0 replies; 26+ messages in thread
From: Christian König @ 2025-02-06 14:06 UTC (permalink / raw)
To: Thomas Hellström, intel-xe; +Cc: Matthew Brost, dri-devel, Kuehling, Felix
Am 30.01.25 um 11:13 schrieb Thomas Hellström:
> Rather than relying on the TTM watermark accounting add a shrinker
> for xe_bos in TT or system memory.
>
> Leverage the newly added TTM per-page shrinking and shmem backup
> support.
>
> Although xe doesn't fully support WONTNEED (purgeable) bos yet,
> introduce and add shrinker support for purgeable ttm_tts.
>
> v2:
> - Cleanups bugfixes and a KUNIT shrinker test.
> - Add writeback support, and activate if kswapd.
> v3:
> - Move the try_shrink() helper to core TTM.
> - Minor cleanups.
> v4:
> - Add runtime pm for the shrinker. Shrinking may require an active
> device for CCS metadata copying.
> v5:
> - Separately purge ghost- and zombie objects in the shrinker.
> - Fix a format specifier - type inconsistency. (Kernel test robot).
> v7:
> - s/long/s64/ (Christian König)
> - s/sofar/progress/ (Matt Brost)
> v8:
> - Rebase on Xe KUNIT update.
> - Add content verifying to the shrinker kunit test.
> - Split out TTM changes to a separate patch.
> - Get rid of multiple bool arguments for clarity (Matt Brost)
> - Avoid an error pointer dereference (Matt Brost)
> - Avoid an integer overflow (Matt Auld)
> - Address misc review comments by Matt Brost.
> v9:
> - Fix a compliation error.
> - Rebase.
> v10:
> - Update to new LRU walk interface.
> - Rework ghost-, zombie and purged object shrinking.
> - Rebase.
> v11:
> - Use additional TTM helpers.
> - Honor __GFP_FS and __GFP_IO
> - Rebase.
> v13:
> - Use ttm_tt_setup_backup().
> v14:
> - Don't set up backup on imported bos.
> v15:
> - Rebase on backup interface changes.
>
> Cc: Christian König <christian.koenig@amd.com>
> Cc: Somalapuram Amaranath <Amaranath.Somalapuram@amd.com>
> Cc: Matthew Brost <matthew.brost@intel.com>
> Cc: <dri-devel@lists.freedesktop.org>
> Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
> Reviewed-by: Matthew Brost <matthew.brost@intel.com>
Acked-by: Christian König <christian.koenig@amd.com>
@Felix at some point we should do something similar for amdgpu, it
removes the 50% limit we have on TTMs system memory allocations.
Regards,
Christian.
> ---
> drivers/gpu/drm/xe/Makefile | 1 +
> drivers/gpu/drm/xe/tests/xe_bo.c | 6 +-
> drivers/gpu/drm/xe/xe_bo.c | 202 +++++++++++++++++++--
> drivers/gpu/drm/xe/xe_bo.h | 36 ++++
> drivers/gpu/drm/xe/xe_device.c | 8 +
> drivers/gpu/drm/xe/xe_device_types.h | 2 +
> drivers/gpu/drm/xe/xe_shrinker.c | 258 +++++++++++++++++++++++++++
> drivers/gpu/drm/xe/xe_shrinker.h | 18 ++
> 8 files changed, 513 insertions(+), 18 deletions(-)
> create mode 100644 drivers/gpu/drm/xe/xe_shrinker.c
> create mode 100644 drivers/gpu/drm/xe/xe_shrinker.h
>
> diff --git a/drivers/gpu/drm/xe/Makefile b/drivers/gpu/drm/xe/Makefile
> index 328aff36831b..b3738bcea11e 100644
> --- a/drivers/gpu/drm/xe/Makefile
> +++ b/drivers/gpu/drm/xe/Makefile
> @@ -95,6 +95,7 @@ xe-y += xe_bb.o \
> xe_ring_ops.o \
> xe_sa.o \
> xe_sched_job.o \
> + xe_shrinker.o \
> xe_step.o \
> xe_survivability_mode.o \
> xe_sync.o \
> diff --git a/drivers/gpu/drm/xe/tests/xe_bo.c b/drivers/gpu/drm/xe/tests/xe_bo.c
> index 6795d1d916e4..9fde67ca989f 100644
> --- a/drivers/gpu/drm/xe/tests/xe_bo.c
> +++ b/drivers/gpu/drm/xe/tests/xe_bo.c
> @@ -514,8 +514,13 @@ static int shrink_test_run_device(struct xe_device *xe)
> * other way around, they may not be subject to swapping...
> */
> if (alloced < purgeable) {
> + xe_ttm_tt_account_subtract(&xe_tt->ttm);
> xe_tt->purgeable = true;
> + xe_ttm_tt_account_add(&xe_tt->ttm);
> bo->ttm.priority = 0;
> + spin_lock(&bo->ttm.bdev->lru_lock);
> + ttm_bo_move_to_lru_tail(&bo->ttm);
> + spin_unlock(&bo->ttm.bdev->lru_lock);
> } else {
> int ret = shrink_test_fill_random(bo, &prng, link);
>
> @@ -570,7 +575,6 @@ static int shrink_test_run_device(struct xe_device *xe)
> if (ret == -EINTR)
> intr = true;
> } while (ret == -EINTR && !signal_pending(current));
> -
> if (!ret && !purgeable)
> failed = shrink_test_verify(test, bo, count, &prng, link);
>
> diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c
> index c32201123d44..a133d66587b8 100644
> --- a/drivers/gpu/drm/xe/xe_bo.c
> +++ b/drivers/gpu/drm/xe/xe_bo.c
> @@ -10,6 +10,7 @@
> #include <drm/drm_drv.h>
> #include <drm/drm_gem_ttm_helper.h>
> #include <drm/drm_managed.h>
> +#include <drm/ttm/ttm_backup.h>
> #include <drm/ttm/ttm_device.h>
> #include <drm/ttm/ttm_placement.h>
> #include <drm/ttm/ttm_tt.h>
> @@ -27,6 +28,7 @@
> #include "xe_pm.h"
> #include "xe_preempt_fence.h"
> #include "xe_res_cursor.h"
> +#include "xe_shrinker.h"
> #include "xe_trace_bo.h"
> #include "xe_ttm_stolen_mgr.h"
> #include "xe_vm.h"
> @@ -283,9 +285,11 @@ static void xe_evict_flags(struct ttm_buffer_object *tbo,
> }
> }
>
> +/* struct xe_ttm_tt - Subclassed ttm_tt for xe */
> struct xe_ttm_tt {
> struct ttm_tt ttm;
> - struct device *dev;
> + /** @xe - The xe device */
> + struct xe_device *xe;
> struct sg_table sgt;
> struct sg_table *sg;
> /** @purgeable: Whether the content of the pages of @ttm is purgeable. */
> @@ -298,7 +302,8 @@ static int xe_tt_map_sg(struct ttm_tt *tt)
> unsigned long num_pages = tt->num_pages;
> int ret;
>
> - XE_WARN_ON(tt->page_flags & TTM_TT_FLAG_EXTERNAL);
> + XE_WARN_ON((tt->page_flags & TTM_TT_FLAG_EXTERNAL) &&
> + !(tt->page_flags & TTM_TT_FLAG_EXTERNAL_MAPPABLE));
>
> if (xe_tt->sg)
> return 0;
> @@ -306,13 +311,13 @@ static int xe_tt_map_sg(struct ttm_tt *tt)
> ret = sg_alloc_table_from_pages_segment(&xe_tt->sgt, tt->pages,
> num_pages, 0,
> (u64)num_pages << PAGE_SHIFT,
> - xe_sg_segment_size(xe_tt->dev),
> + xe_sg_segment_size(xe_tt->xe->drm.dev),
> GFP_KERNEL);
> if (ret)
> return ret;
>
> xe_tt->sg = &xe_tt->sgt;
> - ret = dma_map_sgtable(xe_tt->dev, xe_tt->sg, DMA_BIDIRECTIONAL,
> + ret = dma_map_sgtable(xe_tt->xe->drm.dev, xe_tt->sg, DMA_BIDIRECTIONAL,
> DMA_ATTR_SKIP_CPU_SYNC);
> if (ret) {
> sg_free_table(xe_tt->sg);
> @@ -328,7 +333,7 @@ static void xe_tt_unmap_sg(struct ttm_tt *tt)
> struct xe_ttm_tt *xe_tt = container_of(tt, struct xe_ttm_tt, ttm);
>
> if (xe_tt->sg) {
> - dma_unmap_sgtable(xe_tt->dev, xe_tt->sg,
> + dma_unmap_sgtable(xe_tt->xe->drm.dev, xe_tt->sg,
> DMA_BIDIRECTIONAL, 0);
> sg_free_table(xe_tt->sg);
> xe_tt->sg = NULL;
> @@ -343,21 +348,47 @@ struct sg_table *xe_bo_sg(struct xe_bo *bo)
> return xe_tt->sg;
> }
>
> +/*
> + * Account ttm pages against the device shrinker's shrinkable and
> + * purgeable counts.
> + */
> +static void xe_ttm_tt_account_add(struct ttm_tt *tt)
> +{
> + struct xe_ttm_tt *xe_tt = container_of(tt, struct xe_ttm_tt, ttm);
> +
> + if (xe_tt->purgeable)
> + xe_shrinker_mod_pages(xe_tt->xe->mem.shrinker, 0, tt->num_pages);
> + else
> + xe_shrinker_mod_pages(xe_tt->xe->mem.shrinker, tt->num_pages, 0);
> +}
> +
> +static void xe_ttm_tt_account_subtract(struct ttm_tt *tt)
> +{
> + struct xe_ttm_tt *xe_tt = container_of(tt, struct xe_ttm_tt, ttm);
> +
> + if (xe_tt->purgeable)
> + xe_shrinker_mod_pages(xe_tt->xe->mem.shrinker, 0, -(long)tt->num_pages);
> + else
> + xe_shrinker_mod_pages(xe_tt->xe->mem.shrinker, -(long)tt->num_pages, 0);
> +}
> +
> static struct ttm_tt *xe_ttm_tt_create(struct ttm_buffer_object *ttm_bo,
> u32 page_flags)
> {
> struct xe_bo *bo = ttm_to_xe_bo(ttm_bo);
> struct xe_device *xe = xe_bo_device(bo);
> - struct xe_ttm_tt *tt;
> + struct xe_ttm_tt *xe_tt;
> + struct ttm_tt *tt;
> unsigned long extra_pages;
> enum ttm_caching caching = ttm_cached;
> int err;
>
> - tt = kzalloc(sizeof(*tt), GFP_KERNEL);
> - if (!tt)
> + xe_tt = kzalloc(sizeof(*xe_tt), GFP_KERNEL);
> + if (!xe_tt)
> return NULL;
>
> - tt->dev = xe->drm.dev;
> + tt = &xe_tt->ttm;
> + xe_tt->xe = xe;
>
> extra_pages = 0;
> if (xe_bo_needs_ccs_pages(bo))
> @@ -403,42 +434,66 @@ static struct ttm_tt *xe_ttm_tt_create(struct ttm_buffer_object *ttm_bo,
> caching = ttm_uncached;
> }
>
> - err = ttm_tt_init(&tt->ttm, &bo->ttm, page_flags, caching, extra_pages);
> + if (ttm_bo->type != ttm_bo_type_sg)
> + page_flags |= TTM_TT_FLAG_EXTERNAL | TTM_TT_FLAG_EXTERNAL_MAPPABLE;
> +
> + err = ttm_tt_init(tt, &bo->ttm, page_flags, caching, extra_pages);
> if (err) {
> - kfree(tt);
> + kfree(xe_tt);
> return NULL;
> }
>
> - return &tt->ttm;
> + if (ttm_bo->type != ttm_bo_type_sg) {
> + err = ttm_tt_setup_backup(tt);
> + if (err) {
> + ttm_tt_fini(tt);
> + kfree(xe_tt);
> + return NULL;
> + }
> + }
> +
> + return tt;
> }
>
> static int xe_ttm_tt_populate(struct ttm_device *ttm_dev, struct ttm_tt *tt,
> struct ttm_operation_ctx *ctx)
> {
> + struct xe_ttm_tt *xe_tt = container_of(tt, struct xe_ttm_tt, ttm);
> int err;
>
> /*
> * dma-bufs are not populated with pages, and the dma-
> * addresses are set up when moved to XE_PL_TT.
> */
> - if (tt->page_flags & TTM_TT_FLAG_EXTERNAL)
> + if ((tt->page_flags & TTM_TT_FLAG_EXTERNAL) &&
> + !(tt->page_flags & TTM_TT_FLAG_EXTERNAL_MAPPABLE))
> return 0;
>
> - err = ttm_pool_alloc(&ttm_dev->pool, tt, ctx);
> + if (ttm_tt_is_backed_up(tt) && !xe_tt->purgeable) {
> + err = ttm_tt_restore(ttm_dev, tt, ctx);
> + } else {
> + ttm_tt_clear_backed_up(tt);
> + err = ttm_pool_alloc(&ttm_dev->pool, tt, ctx);
> + }
> if (err)
> return err;
>
> - return err;
> + xe_tt->purgeable = false;
> + xe_ttm_tt_account_add(tt);
> +
> + return 0;
> }
>
> static void xe_ttm_tt_unpopulate(struct ttm_device *ttm_dev, struct ttm_tt *tt)
> {
> - if (tt->page_flags & TTM_TT_FLAG_EXTERNAL)
> + if ((tt->page_flags & TTM_TT_FLAG_EXTERNAL) &&
> + !(tt->page_flags & TTM_TT_FLAG_EXTERNAL_MAPPABLE))
> return;
>
> xe_tt_unmap_sg(tt);
>
> - return ttm_pool_free(&ttm_dev->pool, tt);
> + ttm_pool_free(&ttm_dev->pool, tt);
> + xe_ttm_tt_account_subtract(tt);
> }
>
> static void xe_ttm_tt_destroy(struct ttm_device *ttm_dev, struct ttm_tt *tt)
> @@ -888,6 +943,111 @@ static int xe_bo_move(struct ttm_buffer_object *ttm_bo, bool evict,
> return ret;
> }
>
> +static long xe_bo_shrink_purge(struct ttm_operation_ctx *ctx,
> + struct ttm_buffer_object *bo,
> + unsigned long *scanned)
> +{
> + long lret;
> +
> + /* Fake move to system, without copying data. */
> + if (bo->resource->mem_type != XE_PL_SYSTEM) {
> + struct ttm_resource *new_resource;
> +
> + lret = ttm_bo_wait_ctx(bo, ctx);
> + if (lret)
> + return lret;
> +
> + lret = ttm_bo_mem_space(bo, &sys_placement, &new_resource, ctx);
> + if (lret)
> + return lret;
> +
> + xe_tt_unmap_sg(bo->ttm);
> + ttm_bo_move_null(bo, new_resource);
> + }
> +
> + *scanned += bo->ttm->num_pages;
> + lret = ttm_bo_shrink(ctx, bo, (struct ttm_bo_shrink_flags)
> + {.purge = true,
> + .writeback = false,
> + .allow_move = false});
> +
> + if (lret > 0)
> + xe_ttm_tt_account_subtract(bo->ttm);
> +
> + return lret;
> +}
> +
> +/**
> + * xe_bo_shrink() - Try to shrink an xe bo.
> + * @ctx: The struct ttm_operation_ctx used for shrinking.
> + * @bo: The TTM buffer object whose pages to shrink.
> + * @flags: Flags governing the shrink behaviour.
> + * @scanned: Pointer to a counter of the number of pages
> + * attempted to shrink.
> + *
> + * Try to shrink- or purge a bo, and if it succeeds, unmap dma.
> + * Note that we need to be able to handle also non xe bos
> + * (ghost bos), but only if the struct ttm_tt is embedded in
> + * a struct xe_ttm_tt. When the function attempts to shrink
> + * the pages of a buffer object, The value pointed to by @scanned
> + * is updated.
> + *
> + * Return: The number of pages shrunken or purged, or negative error
> + * code on failure.
> + */
> +long xe_bo_shrink(struct ttm_operation_ctx *ctx, struct ttm_buffer_object *bo,
> + const struct xe_bo_shrink_flags flags,
> + unsigned long *scanned)
> +{
> + struct ttm_tt *tt = bo->ttm;
> + struct xe_ttm_tt *xe_tt = container_of(tt, struct xe_ttm_tt, ttm);
> + struct ttm_place place = {.mem_type = bo->resource->mem_type};
> + struct xe_bo *xe_bo = ttm_to_xe_bo(bo);
> + struct xe_device *xe = xe_tt->xe;
> + bool needs_rpm;
> + long lret = 0L;
> +
> + if (!(tt->page_flags & TTM_TT_FLAG_EXTERNAL_MAPPABLE) ||
> + (flags.purge && !xe_tt->purgeable))
> + return -EBUSY;
> +
> + if (!ttm_bo_eviction_valuable(bo, &place))
> + return -EBUSY;
> +
> + if (!xe_bo_is_xe_bo(bo) || !xe_bo_get_unless_zero(xe_bo))
> + return xe_bo_shrink_purge(ctx, bo, scanned);
> +
> + if (xe_tt->purgeable) {
> + if (bo->resource->mem_type != XE_PL_SYSTEM)
> + lret = xe_bo_move_notify(xe_bo, ctx);
> + if (!lret)
> + lret = xe_bo_shrink_purge(ctx, bo, scanned);
> + goto out_unref;
> + }
> +
> + /* System CCS needs gpu copy when moving PL_TT -> PL_SYSTEM */
> + needs_rpm = (!IS_DGFX(xe) && bo->resource->mem_type != XE_PL_SYSTEM &&
> + xe_bo_needs_ccs_pages(xe_bo));
> + if (needs_rpm && !xe_pm_runtime_get_if_active(xe))
> + goto out_unref;
> +
> + *scanned += tt->num_pages;
> + lret = ttm_bo_shrink(ctx, bo, (struct ttm_bo_shrink_flags)
> + {.purge = false,
> + .writeback = flags.writeback,
> + .allow_move = true});
> + if (needs_rpm)
> + xe_pm_runtime_put(xe);
> +
> + if (lret > 0)
> + xe_ttm_tt_account_subtract(tt);
> +
> +out_unref:
> + xe_bo_put(xe_bo);
> +
> + return lret;
> +}
> +
> /**
> * xe_bo_evict_pinned() - Evict a pinned VRAM object to system memory
> * @bo: The buffer object to move.
> @@ -1905,6 +2065,8 @@ int xe_bo_pin_external(struct xe_bo *bo)
> }
>
> ttm_bo_pin(&bo->ttm);
> + if (bo->ttm.ttm && ttm_tt_is_populated(bo->ttm.ttm))
> + xe_ttm_tt_account_subtract(bo->ttm.ttm);
>
> /*
> * FIXME: If we always use the reserve / unreserve functions for locking
> @@ -1964,6 +2126,8 @@ int xe_bo_pin(struct xe_bo *bo)
> }
>
> ttm_bo_pin(&bo->ttm);
> + if (bo->ttm.ttm && ttm_tt_is_populated(bo->ttm.ttm))
> + xe_ttm_tt_account_subtract(bo->ttm.ttm);
>
> /*
> * FIXME: If we always use the reserve / unreserve functions for locking
> @@ -1998,6 +2162,8 @@ void xe_bo_unpin_external(struct xe_bo *bo)
> spin_unlock(&xe->pinned.lock);
>
> ttm_bo_unpin(&bo->ttm);
> + if (bo->ttm.ttm && ttm_tt_is_populated(bo->ttm.ttm))
> + xe_ttm_tt_account_add(bo->ttm.ttm);
>
> /*
> * FIXME: If we always use the reserve / unreserve functions for locking
> @@ -2021,6 +2187,8 @@ void xe_bo_unpin(struct xe_bo *bo)
> spin_unlock(&xe->pinned.lock);
> }
> ttm_bo_unpin(&bo->ttm);
> + if (bo->ttm.ttm && ttm_tt_is_populated(bo->ttm.ttm))
> + xe_ttm_tt_account_add(bo->ttm.ttm);
> }
>
> /**
> diff --git a/drivers/gpu/drm/xe/xe_bo.h b/drivers/gpu/drm/xe/xe_bo.h
> index 04995c5ced32..9ca87973cff7 100644
> --- a/drivers/gpu/drm/xe/xe_bo.h
> +++ b/drivers/gpu/drm/xe/xe_bo.h
> @@ -148,6 +148,28 @@ static inline struct xe_bo *xe_bo_get(struct xe_bo *bo)
>
> void xe_bo_put(struct xe_bo *bo);
>
> +/*
> + * xe_bo_get_unless_zero() - Conditionally obtain a GEM object refcount on an
> + * xe bo
> + * @bo: The bo for which we want to obtain a refcount.
> + *
> + * There is a short window between where the bo's GEM object refcount reaches
> + * zero and where we put the final ttm_bo reference. Code in the eviction- and
> + * shrinking path should therefore attempt to grab a gem object reference before
> + * trying to use members outside of the base class ttm object. This function is
> + * intended for that purpose. On successful return, this function must be paired
> + * with an xe_bo_put().
> + *
> + * Return: @bo on success, NULL on failure.
> + */
> +static inline __must_check struct xe_bo *xe_bo_get_unless_zero(struct xe_bo *bo)
> +{
> + if (!bo || !kref_get_unless_zero(&bo->ttm.base.refcount))
> + return NULL;
> +
> + return bo;
> +}
> +
> static inline void __xe_bo_unset_bulk_move(struct xe_bo *bo)
> {
> if (bo)
> @@ -343,6 +365,20 @@ static inline unsigned int xe_sg_segment_size(struct device *dev)
> return round_down(max / 2, PAGE_SIZE);
> }
>
> +/**
> + * struct xe_bo_shrink_flags - flags governing the shrink behaviour.
> + * @purge: Only purging allowed. Don't shrink if bo not purgeable.
> + * @writeback: Attempt to immediately move content to swap.
> + */
> +struct xe_bo_shrink_flags {
> + u32 purge : 1;
> + u32 writeback : 1;
> +};
> +
> +long xe_bo_shrink(struct ttm_operation_ctx *ctx, struct ttm_buffer_object *bo,
> + const struct xe_bo_shrink_flags flags,
> + unsigned long *scanned);
> +
> #if IS_ENABLED(CONFIG_DRM_XE_KUNIT_TEST)
> /**
> * xe_bo_is_mem_type - Whether the bo currently resides in the given
> diff --git a/drivers/gpu/drm/xe/xe_device.c b/drivers/gpu/drm/xe/xe_device.c
> index 8fedc72e9db4..c4a6062124b0 100644
> --- a/drivers/gpu/drm/xe/xe_device.c
> +++ b/drivers/gpu/drm/xe/xe_device.c
> @@ -51,6 +51,7 @@
> #include "xe_pm.h"
> #include "xe_pmu.h"
> #include "xe_query.h"
> +#include "xe_shrinker.h"
> #include "xe_sriov.h"
> #include "xe_survivability_mode.h"
> #include "xe_tile.h"
> @@ -396,6 +397,9 @@ static void xe_device_destroy(struct drm_device *dev, void *dummy)
> if (xe->unordered_wq)
> destroy_workqueue(xe->unordered_wq);
>
> + if (!IS_ERR_OR_NULL(xe->mem.shrinker))
> + xe_shrinker_destroy(xe->mem.shrinker);
> +
> if (xe->destroy_wq)
> destroy_workqueue(xe->destroy_wq);
>
> @@ -428,6 +432,10 @@ struct xe_device *xe_device_create(struct pci_dev *pdev,
> if (err)
> goto err;
>
> + xe->mem.shrinker = xe_shrinker_create(xe);
> + if (IS_ERR(xe->mem.shrinker))
> + return ERR_CAST(xe->mem.shrinker);
> +
> xe->info.devid = pdev->device;
> xe->info.revid = pdev->revision;
> xe->info.force_execlist = xe_modparam.force_execlist;
> diff --git a/drivers/gpu/drm/xe/xe_device_types.h b/drivers/gpu/drm/xe/xe_device_types.h
> index 89f532b67bc4..7406deac0fec 100644
> --- a/drivers/gpu/drm/xe/xe_device_types.h
> +++ b/drivers/gpu/drm/xe/xe_device_types.h
> @@ -369,6 +369,8 @@ struct xe_device {
> struct xe_mem_region vram;
> /** @mem.sys_mgr: system TTM manager */
> struct ttm_resource_manager sys_mgr;
> + /** @mem.sys_mgr: system memory shrinker. */
> + struct xe_shrinker *shrinker;
> } mem;
>
> /** @sriov: device level virtualization data */
> diff --git a/drivers/gpu/drm/xe/xe_shrinker.c b/drivers/gpu/drm/xe/xe_shrinker.c
> new file mode 100644
> index 000000000000..8184390f9c7b
> --- /dev/null
> +++ b/drivers/gpu/drm/xe/xe_shrinker.c
> @@ -0,0 +1,258 @@
> +// SPDX-License-Identifier: MIT
> +/*
> + * Copyright © 2024 Intel Corporation
> + */
> +
> +#include <linux/shrinker.h>
> +
> +#include <drm/ttm/ttm_backup.h>
> +#include <drm/ttm/ttm_bo.h>
> +#include <drm/ttm/ttm_tt.h>
> +
> +#include "xe_bo.h"
> +#include "xe_pm.h"
> +#include "xe_shrinker.h"
> +
> +/**
> + * struct xe_shrinker - per-device shrinker
> + * @xe: Back pointer to the device.
> + * @lock: Lock protecting accounting.
> + * @shrinkable_pages: Number of pages that are currently shrinkable.
> + * @purgeable_pages: Number of pages that are currently purgeable.
> + * @shrink: Pointer to the mm shrinker.
> + * @pm_worker: Worker to wake up the device if required.
> + */
> +struct xe_shrinker {
> + struct xe_device *xe;
> + rwlock_t lock;
> + long shrinkable_pages;
> + long purgeable_pages;
> + struct shrinker *shrink;
> + struct work_struct pm_worker;
> +};
> +
> +static struct xe_shrinker *to_xe_shrinker(struct shrinker *shrink)
> +{
> + return shrink->private_data;
> +}
> +
> +/**
> + * xe_shrinker_mod_pages() - Modify shrinker page accounting
> + * @shrinker: Pointer to the struct xe_shrinker.
> + * @shrinkable: Shrinkable pages delta. May be negative.
> + * @purgeable: Purgeable page delta. May be negative.
> + *
> + * Modifies the shrinkable and purgeable pages accounting.
> + */
> +void
> +xe_shrinker_mod_pages(struct xe_shrinker *shrinker, long shrinkable, long purgeable)
> +{
> + write_lock(&shrinker->lock);
> + shrinker->shrinkable_pages += shrinkable;
> + shrinker->purgeable_pages += purgeable;
> + write_unlock(&shrinker->lock);
> +}
> +
> +static s64 xe_shrinker_walk(struct xe_device *xe,
> + struct ttm_operation_ctx *ctx,
> + const struct xe_bo_shrink_flags flags,
> + unsigned long to_scan, unsigned long *scanned)
> +{
> + unsigned int mem_type;
> + s64 freed = 0, lret;
> +
> + for (mem_type = XE_PL_SYSTEM; mem_type <= XE_PL_TT; ++mem_type) {
> + struct ttm_resource_manager *man = ttm_manager_type(&xe->ttm, mem_type);
> + struct ttm_bo_lru_cursor curs;
> + struct ttm_buffer_object *ttm_bo;
> +
> + if (!man || !man->use_tt)
> + continue;
> +
> + ttm_bo_lru_for_each_reserved_guarded(&curs, man, ctx, ttm_bo) {
> + if (!ttm_bo_shrink_suitable(ttm_bo, ctx))
> + continue;
> +
> + lret = xe_bo_shrink(ctx, ttm_bo, flags, scanned);
> + if (lret < 0)
> + return lret;
> +
> + freed += lret;
> + if (*scanned >= to_scan)
> + break;
> + }
> + }
> +
> + return freed;
> +}
> +
> +static unsigned long
> +xe_shrinker_count(struct shrinker *shrink, struct shrink_control *sc)
> +{
> + struct xe_shrinker *shrinker = to_xe_shrinker(shrink);
> + unsigned long num_pages;
> + bool can_backup = !!(sc->gfp_mask & __GFP_FS);
> +
> + num_pages = ttm_backup_bytes_avail() >> PAGE_SHIFT;
> + read_lock(&shrinker->lock);
> +
> + if (can_backup)
> + num_pages = min_t(unsigned long, num_pages, shrinker->shrinkable_pages);
> + else
> + num_pages = 0;
> +
> + num_pages += shrinker->purgeable_pages;
> + read_unlock(&shrinker->lock);
> +
> + return num_pages ? num_pages : SHRINK_EMPTY;
> +}
> +
> +/*
> + * Check if we need runtime pm, and if so try to grab a reference if
> + * already active. If grabbing a reference fails, queue a worker that
> + * does it for us outside of reclaim, but don't wait for it to complete.
> + * If bo shrinking needs an rpm reference and we don't have it (yet),
> + * that bo will be skipped anyway.
> + */
> +static bool xe_shrinker_runtime_pm_get(struct xe_shrinker *shrinker, bool force,
> + unsigned long nr_to_scan, bool can_backup)
> +{
> + struct xe_device *xe = shrinker->xe;
> +
> + if (IS_DGFX(xe) || !xe_device_has_flat_ccs(xe) ||
> + !ttm_backup_bytes_avail())
> + return false;
> +
> + if (!force) {
> + read_lock(&shrinker->lock);
> + force = (nr_to_scan > shrinker->purgeable_pages && can_backup);
> + read_unlock(&shrinker->lock);
> + if (!force)
> + return false;
> + }
> +
> + if (!xe_pm_runtime_get_if_active(xe)) {
> + if (xe_rpm_reclaim_safe(xe) && !ttm_bo_shrink_avoid_wait()) {
> + xe_pm_runtime_get(xe);
> + return true;
> + }
> + queue_work(xe->unordered_wq, &shrinker->pm_worker);
> + return false;
> + }
> +
> + return true;
> +}
> +
> +static void xe_shrinker_runtime_pm_put(struct xe_shrinker *shrinker, bool runtime_pm)
> +{
> + if (runtime_pm)
> + xe_pm_runtime_put(shrinker->xe);
> +}
> +
> +static unsigned long xe_shrinker_scan(struct shrinker *shrink, struct shrink_control *sc)
> +{
> + struct xe_shrinker *shrinker = to_xe_shrinker(shrink);
> + struct ttm_operation_ctx ctx = {
> + .interruptible = false,
> + .no_wait_gpu = ttm_bo_shrink_avoid_wait(),
> + };
> + unsigned long nr_to_scan, nr_scanned = 0, freed = 0;
> + struct xe_bo_shrink_flags shrink_flags = {
> + .purge = true,
> + /* Don't request writeback without __GFP_IO. */
> + .writeback = !ctx.no_wait_gpu && (sc->gfp_mask & __GFP_IO),
> + };
> + bool runtime_pm;
> + bool purgeable;
> + bool can_backup = !!(sc->gfp_mask & __GFP_FS);
> + s64 lret;
> +
> + nr_to_scan = sc->nr_to_scan;
> +
> + read_lock(&shrinker->lock);
> + purgeable = !!shrinker->purgeable_pages;
> + read_unlock(&shrinker->lock);
> +
> + /* Might need runtime PM. Try to wake early if it looks like it. */
> + runtime_pm = xe_shrinker_runtime_pm_get(shrinker, false, nr_to_scan, can_backup);
> +
> + if (purgeable && nr_scanned < nr_to_scan) {
> + lret = xe_shrinker_walk(shrinker->xe, &ctx, shrink_flags,
> + nr_to_scan, &nr_scanned);
> + if (lret >= 0)
> + freed += lret;
> + }
> +
> + sc->nr_scanned = nr_scanned;
> + if (nr_scanned >= nr_to_scan || !can_backup)
> + goto out;
> +
> + /* If we didn't wake before, try to do it now if needed. */
> + if (!runtime_pm)
> + runtime_pm = xe_shrinker_runtime_pm_get(shrinker, true, 0, can_backup);
> +
> + shrink_flags.purge = false;
> + lret = xe_shrinker_walk(shrinker->xe, &ctx, shrink_flags,
> + nr_to_scan, &nr_scanned);
> + if (lret >= 0)
> + freed += lret;
> +
> + sc->nr_scanned = nr_scanned;
> +out:
> + xe_shrinker_runtime_pm_put(shrinker, runtime_pm);
> + return nr_scanned ? freed : SHRINK_STOP;
> +}
> +
> +/* Wake up the device for shrinking. */
> +static void xe_shrinker_pm(struct work_struct *work)
> +{
> + struct xe_shrinker *shrinker =
> + container_of(work, typeof(*shrinker), pm_worker);
> +
> + xe_pm_runtime_get(shrinker->xe);
> + xe_pm_runtime_put(shrinker->xe);
> +}
> +
> +/**
> + * xe_shrinker_create() - Create an xe per-device shrinker
> + * @xe: Pointer to the xe device.
> + *
> + * Returns: A pointer to the created shrinker on success,
> + * Negative error code on failure.
> + */
> +struct xe_shrinker *xe_shrinker_create(struct xe_device *xe)
> +{
> + struct xe_shrinker *shrinker = kzalloc(sizeof(*shrinker), GFP_KERNEL);
> +
> + if (!shrinker)
> + return ERR_PTR(-ENOMEM);
> +
> + shrinker->shrink = shrinker_alloc(0, "xe system shrinker");
> + if (!shrinker->shrink) {
> + kfree(shrinker);
> + return ERR_PTR(-ENOMEM);
> + }
> +
> + INIT_WORK(&shrinker->pm_worker, xe_shrinker_pm);
> + shrinker->xe = xe;
> + rwlock_init(&shrinker->lock);
> + shrinker->shrink->count_objects = xe_shrinker_count;
> + shrinker->shrink->scan_objects = xe_shrinker_scan;
> + shrinker->shrink->private_data = shrinker;
> + shrinker_register(shrinker->shrink);
> +
> + return shrinker;
> +}
> +
> +/**
> + * xe_shrinker_destroy() - Destroy an xe per-device shrinker
> + * @shrinker: Pointer to the shrinker to destroy.
> + */
> +void xe_shrinker_destroy(struct xe_shrinker *shrinker)
> +{
> + xe_assert(shrinker->xe, !shrinker->shrinkable_pages);
> + xe_assert(shrinker->xe, !shrinker->purgeable_pages);
> + shrinker_free(shrinker->shrink);
> + flush_work(&shrinker->pm_worker);
> + kfree(shrinker);
> +}
> diff --git a/drivers/gpu/drm/xe/xe_shrinker.h b/drivers/gpu/drm/xe/xe_shrinker.h
> new file mode 100644
> index 000000000000..28a038f4fcbf
> --- /dev/null
> +++ b/drivers/gpu/drm/xe/xe_shrinker.h
> @@ -0,0 +1,18 @@
> +/* SPDX-License-Identifier: MIT */
> +/*
> + * Copyright © 2024 Intel Corporation
> + */
> +
> +#ifndef _XE_SHRINKER_H_
> +#define _XE_SHRINKER_H_
> +
> +struct xe_shrinker;
> +struct xe_device;
> +
> +void xe_shrinker_mod_pages(struct xe_shrinker *shrinker, long shrinkable, long purgeable);
> +
> +struct xe_shrinker *xe_shrinker_create(struct xe_device *xe);
> +
> +void xe_shrinker_destroy(struct xe_shrinker *shrinker);
> +
> +#endif
^ permalink raw reply [flat|nested] 26+ messages in thread
* [PATCH v16 7/7] drm/xe: Increase the XE_PL_TT watermark
2025-01-30 10:13 [PATCH v16 0/7] TTM shrinker helpers and xe buffer object shrinker Thomas Hellström
` (5 preceding siblings ...)
2025-01-30 10:13 ` [PATCH v16 6/7] drm/xe: Add a shrinker for xe bos Thomas Hellström
@ 2025-01-30 10:13 ` Thomas Hellström
2025-01-30 10:52 ` ✓ CI.Patch_applied: success for TTM shrinker helpers and xe buffer object shrinker (rev17) Patchwork
` (7 subsequent siblings)
14 siblings, 0 replies; 26+ messages in thread
From: Thomas Hellström @ 2025-01-30 10:13 UTC (permalink / raw)
To: intel-xe; +Cc: Thomas Hellström, Matthew Brost
The XE_PL_TT watermark was set to 50% of system memory.
The idea behind that was unclear since the net effect is that
TT memory will be evicted to TTM_PL_SYSTEM memory if that
watermark is exceeded, requiring PPGTT rebinds and dma
remapping. But there is no similar watermark for TTM_PL_1SYSTEM
memory.
The TTM functionality that tries to swap out system memory to
shmem objects if a 50% limit of total system memory is reached
is orthogonal to this, and with the shrinker added, it's no
longer in effect.
Replace the 50% TTM_PL_TT limit with a 100% limit, in effect
allowing all graphics memory to be bound to the device unless it
has been swapped out by the shrinker.
Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Reviewed-by: Matthew Brost <matthew.brost@intel.com>
---
drivers/gpu/drm/xe/xe_ttm_sys_mgr.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/xe/xe_ttm_sys_mgr.c b/drivers/gpu/drm/xe/xe_ttm_sys_mgr.c
index 9844a8edbfe1..d38b91872da3 100644
--- a/drivers/gpu/drm/xe/xe_ttm_sys_mgr.c
+++ b/drivers/gpu/drm/xe/xe_ttm_sys_mgr.c
@@ -108,9 +108,8 @@ int xe_ttm_sys_mgr_init(struct xe_device *xe)
u64 gtt_size;
si_meminfo(&si);
+ /* Potentially restrict amount of TT memory here. */
gtt_size = (u64)si.totalram * si.mem_unit;
- /* TTM limits allocation of all TTM devices by 50% of system memory */
- gtt_size /= 2;
man->use_tt = true;
man->func = &xe_ttm_sys_mgr_func;
--
2.48.1
^ permalink raw reply related [flat|nested] 26+ messages in thread* ✓ CI.Patch_applied: success for TTM shrinker helpers and xe buffer object shrinker (rev17)
2025-01-30 10:13 [PATCH v16 0/7] TTM shrinker helpers and xe buffer object shrinker Thomas Hellström
` (6 preceding siblings ...)
2025-01-30 10:13 ` [PATCH v16 7/7] drm/xe: Increase the XE_PL_TT watermark Thomas Hellström
@ 2025-01-30 10:52 ` Patchwork
2025-01-30 10:52 ` ✗ CI.checkpatch: warning " Patchwork
` (6 subsequent siblings)
14 siblings, 0 replies; 26+ messages in thread
From: Patchwork @ 2025-01-30 10:52 UTC (permalink / raw)
To: Thomas Hellström; +Cc: intel-xe
== Series Details ==
Series: TTM shrinker helpers and xe buffer object shrinker (rev17)
URL : https://patchwork.freedesktop.org/series/131815/
State : success
== Summary ==
=== Applying kernel patches on branch 'drm-tip' with base: ===
Base commit: c2a5da40b8b1 drm-tip: 2025y-01m-29d-20h-15m-11s UTC integration manifest
=== git am output follows ===
Applying: drm/ttm: Provide a shmem backup implementation
Applying: drm/ttm/pool, drm/ttm/tt: Provide a helper to shrink pages
Applying: drm/ttm: Use fault-injection to test error paths
Applying: drm/ttm: Add a macro to perform LRU iteration
Applying: drm/ttm: Add helpers for shrinking
Applying: drm/xe: Add a shrinker for xe bos
Applying: drm/xe: Increase the XE_PL_TT watermark
^ permalink raw reply [flat|nested] 26+ messages in thread* ✗ CI.checkpatch: warning for TTM shrinker helpers and xe buffer object shrinker (rev17)
2025-01-30 10:13 [PATCH v16 0/7] TTM shrinker helpers and xe buffer object shrinker Thomas Hellström
` (7 preceding siblings ...)
2025-01-30 10:52 ` ✓ CI.Patch_applied: success for TTM shrinker helpers and xe buffer object shrinker (rev17) Patchwork
@ 2025-01-30 10:52 ` Patchwork
2025-01-30 10:54 ` ✓ CI.KUnit: success " Patchwork
` (5 subsequent siblings)
14 siblings, 0 replies; 26+ messages in thread
From: Patchwork @ 2025-01-30 10:52 UTC (permalink / raw)
To: Thomas Hellström; +Cc: intel-xe
== Series Details ==
Series: TTM shrinker helpers and xe buffer object shrinker (rev17)
URL : https://patchwork.freedesktop.org/series/131815/
State : warning
== Summary ==
+ KERNEL=/kernel
+ git clone https://gitlab.freedesktop.org/drm/maintainer-tools mt
Cloning into 'mt'...
warning: redirecting to https://gitlab.freedesktop.org/drm/maintainer-tools.git/
+ git -C mt rev-list -n1 origin/master
30ab6715fc09baee6cc14cb3c89ad8858688d474
+ cd /kernel
+ git config --global --add safe.directory /kernel
+ git log -n1
commit 1ce29bb61f8837a7f81aad9117cc2f6b0e22654a
Author: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Date: Thu Jan 30 11:13:25 2025 +0100
drm/xe: Increase the XE_PL_TT watermark
The XE_PL_TT watermark was set to 50% of system memory.
The idea behind that was unclear since the net effect is that
TT memory will be evicted to TTM_PL_SYSTEM memory if that
watermark is exceeded, requiring PPGTT rebinds and dma
remapping. But there is no similar watermark for TTM_PL_1SYSTEM
memory.
The TTM functionality that tries to swap out system memory to
shmem objects if a 50% limit of total system memory is reached
is orthogonal to this, and with the shrinker added, it's no
longer in effect.
Replace the 50% TTM_PL_TT limit with a 100% limit, in effect
allowing all graphics memory to be bound to the device unless it
has been swapped out by the shrinker.
Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Reviewed-by: Matthew Brost <matthew.brost@intel.com>
+ /mt/dim checkpatch c2a5da40b8b1c5af77dcdabed8516069949fea3b drm-intel
66458b481e4d drm/ttm: Provide a shmem backup implementation
-:56: WARNING:FILE_PATH_CHANGES: added, moved or deleted file(s), does MAINTAINERS need updating?
#56:
new file mode 100644
total: 0 errors, 1 warnings, 0 checks, 289 lines checked
b2c00a58e480 drm/ttm/pool, drm/ttm/tt: Provide a helper to shrink pages
c7e4d970ff7c drm/ttm: Use fault-injection to test error paths
15ed3011bf88 drm/ttm: Add a macro to perform LRU iteration
-:11: WARNING:COMMIT_LOG_LONG_LINE: Prefer a maximum 75 chars per line (possible unwrapped commit description?)
#11:
https://lore.kernel.org/linux-mm/b7491378-defd-4f1c-31e2-29e4c77e2d67@amd.com/T/#ma918844aa8a6efe8768fdcda0c6590d5c93850c9
-:256: WARNING:TABSTOP: Statements should start on a tabstop
#256: FILE: include/drm/ttm/ttm_bo.h:510:
+ if (_T) {ttm_bo_lru_cursor_fini(_T); },
-:256: ERROR:TRAILING_STATEMENTS: trailing statements should be on next line
#256: FILE: include/drm/ttm/ttm_bo.h:510:
+ if (_T) {ttm_bo_lru_cursor_fini(_T); },
-:256: WARNING:BRACES: braces {} are not necessary for single statement blocks
#256: FILE: include/drm/ttm/ttm_bo.h:510:
+ if (_T) {ttm_bo_lru_cursor_fini(_T); },
-:283: ERROR:COMPLEX_MACRO: Macros with complex values should be enclosed in parentheses
#283: FILE: include/drm/ttm/ttm_bo.h:537:
+#define ttm_bo_lru_for_each_reserved_guarded(_cursor, _man, _ctx, _bo) \
+ scoped_guard(ttm_bo_lru_cursor, _cursor, _man, _ctx) \
+ for ((_bo) = ttm_bo_lru_cursor_first(_cursor); (_bo); \
+ (_bo) = ttm_bo_lru_cursor_next(_cursor))
-:283: CHECK:MACRO_ARG_REUSE: Macro argument reuse '_cursor' - possible side-effects?
#283: FILE: include/drm/ttm/ttm_bo.h:537:
+#define ttm_bo_lru_for_each_reserved_guarded(_cursor, _man, _ctx, _bo) \
+ scoped_guard(ttm_bo_lru_cursor, _cursor, _man, _ctx) \
+ for ((_bo) = ttm_bo_lru_cursor_first(_cursor); (_bo); \
+ (_bo) = ttm_bo_lru_cursor_next(_cursor))
-:283: CHECK:MACRO_ARG_REUSE: Macro argument reuse '_bo' - possible side-effects?
#283: FILE: include/drm/ttm/ttm_bo.h:537:
+#define ttm_bo_lru_for_each_reserved_guarded(_cursor, _man, _ctx, _bo) \
+ scoped_guard(ttm_bo_lru_cursor, _cursor, _man, _ctx) \
+ for ((_bo) = ttm_bo_lru_cursor_first(_cursor); (_bo); \
+ (_bo) = ttm_bo_lru_cursor_next(_cursor))
total: 2 errors, 3 warnings, 2 checks, 234 lines checked
36e548cf803f drm/ttm: Add helpers for shrinking
19a1147867dc drm/xe: Add a shrinker for xe bos
-:548: WARNING:FILE_PATH_CHANGES: added, moved or deleted file(s), does MAINTAINERS need updating?
#548:
new file mode 100644
total: 0 errors, 1 warnings, 0 checks, 711 lines checked
1ce29bb61f88 drm/xe: Increase the XE_PL_TT watermark
^ permalink raw reply [flat|nested] 26+ messages in thread* ✓ CI.KUnit: success for TTM shrinker helpers and xe buffer object shrinker (rev17)
2025-01-30 10:13 [PATCH v16 0/7] TTM shrinker helpers and xe buffer object shrinker Thomas Hellström
` (8 preceding siblings ...)
2025-01-30 10:52 ` ✗ CI.checkpatch: warning " Patchwork
@ 2025-01-30 10:54 ` Patchwork
2025-01-30 11:10 ` ✓ CI.Build: " Patchwork
` (4 subsequent siblings)
14 siblings, 0 replies; 26+ messages in thread
From: Patchwork @ 2025-01-30 10:54 UTC (permalink / raw)
To: Thomas Hellström; +Cc: intel-xe
== Series Details ==
Series: TTM shrinker helpers and xe buffer object shrinker (rev17)
URL : https://patchwork.freedesktop.org/series/131815/
State : success
== Summary ==
+ trap cleanup EXIT
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/xe/.kunitconfig
[10:52:56] Configuring KUnit Kernel ...
Generating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[10:53:00] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make all compile_commands.json ARCH=um O=.kunit --jobs=48
../lib/iomap.c:156:5: warning: no previous prototype for ‘ioread64_lo_hi’ [-Wmissing-prototypes]
156 | u64 ioread64_lo_hi(const void __iomem *addr)
| ^~~~~~~~~~~~~~
../lib/iomap.c:163:5: warning: no previous prototype for ‘ioread64_hi_lo’ [-Wmissing-prototypes]
163 | u64 ioread64_hi_lo(const void __iomem *addr)
| ^~~~~~~~~~~~~~
../lib/iomap.c:170:5: warning: no previous prototype for ‘ioread64be_lo_hi’ [-Wmissing-prototypes]
170 | u64 ioread64be_lo_hi(const void __iomem *addr)
| ^~~~~~~~~~~~~~~~
../lib/iomap.c:178:5: warning: no previous prototype for ‘ioread64be_hi_lo’ [-Wmissing-prototypes]
178 | u64 ioread64be_hi_lo(const void __iomem *addr)
| ^~~~~~~~~~~~~~~~
../lib/iomap.c:264:6: warning: no previous prototype for ‘iowrite64_lo_hi’ [-Wmissing-prototypes]
264 | void iowrite64_lo_hi(u64 val, void __iomem *addr)
| ^~~~~~~~~~~~~~~
../lib/iomap.c:272:6: warning: no previous prototype for ‘iowrite64_hi_lo’ [-Wmissing-prototypes]
272 | void iowrite64_hi_lo(u64 val, void __iomem *addr)
| ^~~~~~~~~~~~~~~
../lib/iomap.c:280:6: warning: no previous prototype for ‘iowrite64be_lo_hi’ [-Wmissing-prototypes]
280 | void iowrite64be_lo_hi(u64 val, void __iomem *addr)
| ^~~~~~~~~~~~~~~~~
../lib/iomap.c:288:6: warning: no previous prototype for ‘iowrite64be_hi_lo’ [-Wmissing-prototypes]
288 | void iowrite64be_hi_lo(u64 val, void __iomem *addr)
| ^~~~~~~~~~~~~~~~~
[10:53:26] Starting KUnit Kernel (1/1)...
[10:53:26] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[10:53:26] ================== guc_buf (11 subtests) ===================
[10:53:26] [PASSED] test_smallest
[10:53:26] [PASSED] test_largest
[10:53:26] [PASSED] test_granular
[10:53:26] [PASSED] test_unique
[10:53:26] [PASSED] test_overlap
[10:53:26] [PASSED] test_reusable
[10:53:26] [PASSED] test_too_big
[10:53:26] [PASSED] test_flush
[10:53:26] [PASSED] test_lookup
[10:53:26] [PASSED] test_data
[10:53:26] [PASSED] test_class
[10:53:26] ===================== [PASSED] guc_buf =====================
[10:53:26] =================== guc_dbm (7 subtests) ===================
[10:53:26] [PASSED] test_empty
[10:53:26] [PASSED] test_default
[10:53:26] ======================== test_size ========================
[10:53:26] [PASSED] 4
[10:53:26] [PASSED] 8
[10:53:26] [PASSED] 32
[10:53:26] [PASSED] 256
[10:53:26] ==================== [PASSED] test_size ====================
[10:53:26] ======================= test_reuse ========================
[10:53:26] [PASSED] 4
[10:53:26] [PASSED] 8
[10:53:26] [PASSED] 32
[10:53:26] [PASSED] 256
[10:53:26] =================== [PASSED] test_reuse ====================
[10:53:26] =================== test_range_overlap ====================
[10:53:26] [PASSED] 4
[10:53:26] [PASSED] 8
[10:53:26] [PASSED] 32
[10:53:26] [PASSED] 256
[10:53:26] =============== [PASSED] test_range_overlap ================
[10:53:26] =================== test_range_compact ====================
[10:53:26] [PASSED] 4
[10:53:26] [PASSED] 8
[10:53:26] [PASSED] 32
[10:53:26] [PASSED] 256
[10:53:26] =============== [PASSED] test_range_compact ================
[10:53:26] ==================== test_range_spare =====================
[10:53:26] [PASSED] 4
[10:53:26] [PASSED] 8
[10:53:26] [PASSED] 32
[10:53:26] [PASSED] 256
[10:53:26] ================ [PASSED] test_range_spare =================
[10:53:26] ===================== [PASSED] guc_dbm =====================
[10:53:26] =================== guc_idm (6 subtests) ===================
[10:53:26] [PASSED] bad_init
[10:53:26] [PASSED] no_init
[10:53:26] [PASSED] init_fini
[10:53:26] [PASSED] check_used
[10:53:26] [PASSED] check_quota
[10:53:26] [PASSED] check_all
[10:53:26] ===================== [PASSED] guc_idm =====================
[10:53:26] ================== no_relay (3 subtests) ===================
[10:53:26] [PASSED] xe_drops_guc2pf_if_not_ready
[10:53:26] [PASSED] xe_drops_guc2vf_if_not_ready
[10:53:26] [PASSED] xe_rejects_send_if_not_ready
[10:53:26] ==================== [PASSED] no_relay =====================
[10:53:26] ================== pf_relay (14 subtests) ==================
[10:53:26] [PASSED] pf_rejects_guc2pf_too_short
[10:53:26] [PASSED] pf_rejects_guc2pf_too_long
[10:53:26] [PASSED] pf_rejects_guc2pf_no_payload
[10:53:26] [PASSED] pf_fails_no_payload
[10:53:26] [PASSED] pf_fails_bad_origin
[10:53:26] [PASSED] pf_fails_bad_type
[10:53:26] [PASSED] pf_txn_reports_error
[10:53:26] [PASSED] pf_txn_sends_pf2guc
[10:53:26] [PASSED] pf_sends_pf2guc
[10:53:26] [SKIPPED] pf_loopback_nop
[10:53:26] [SKIPPED] pf_loopback_echo
[10:53:26] [SKIPPED] pf_loopback_fail
[10:53:26] [SKIPPED] pf_loopback_busy
[10:53:26] [SKIPPED] pf_loopback_retry
[10:53:26] ==================== [PASSED] pf_relay =====================
[10:53:26] ================== vf_relay (3 subtests) ===================
[10:53:26] [PASSED] vf_rejects_guc2vf_too_short
[10:53:26] [PASSED] vf_rejects_guc2vf_too_long
[10:53:26] [PASSED] vf_rejects_guc2vf_no_payload
[10:53:26] ==================== [PASSED] vf_relay =====================
[10:53:26] ================= pf_service (11 subtests) =================
[10:53:26] [PASSED] pf_negotiate_any
[10:53:26] [PASSED] pf_negotiate_base_match
[10:53:26] [PASSED] pf_negotiate_base_newer
[10:53:26] [PASSED] pf_negotiate_base_next
[10:53:26] [SKIPPED] pf_negotiate_base_older
[10:53:26] [PASSED] pf_negotiate_base_prev
[10:53:26] [PASSED] pf_negotiate_latest_match
[10:53:26] [PASSED] pf_negotiate_latest_newer
[10:53:26] [PASSED] pf_negotiate_latest_next
[10:53:26] [SKIPPED] pf_negotiate_latest_older
[10:53:26] [SKIPPED] pf_negotiate_latest_prev
[10:53:26] =================== [PASSED] pf_service ====================
[10:53:26] ===================== lmtt (1 subtest) =====================
[10:53:26] ======================== test_ops =========================
[10:53:26] [PASSED] 2-level
[10:53:26] [PASSED] multi-level
[10:53:26] ==================== [PASSED] test_ops =====================
[10:53:26] ====================== [PASSED] lmtt =======================
[10:53:26] =================== xe_mocs (2 subtests) ===================
[10:53:26] ================ xe_live_mocs_kernel_kunit ================
[10:53:26] =========== [SKIPPED] xe_live_mocs_kernel_kunit ============
[10:53:26] ================ xe_live_mocs_reset_kunit =================
[10:53:26] ============ [SKIPPED] xe_live_mocs_reset_kunit ============
[10:53:26] ==================== [SKIPPED] xe_mocs =====================
[10:53:26] ================= xe_migrate (2 subtests) ==================
[10:53:26] ================= xe_migrate_sanity_kunit =================
[10:53:26] ============ [SKIPPED] xe_migrate_sanity_kunit =============
[10:53:26] ================== xe_validate_ccs_kunit ==================
[10:53:26] ============= [SKIPPED] xe_validate_ccs_kunit ==============
[10:53:26] =================== [SKIPPED] xe_migrate ===================
[10:53:26] ================== xe_dma_buf (1 subtest) ==================
[10:53:26] ==================== xe_dma_buf_kunit =====================
[10:53:26] ================ [SKIPPED] xe_dma_buf_kunit ================
[10:53:26] =================== [SKIPPED] xe_dma_buf ===================
[10:53:26] ================= xe_bo_shrink (1 subtest) =================
[10:53:26] =================== xe_bo_shrink_kunit ====================
[10:53:26] =============== [SKIPPED] xe_bo_shrink_kunit ===============
[10:53:26] ================== [SKIPPED] xe_bo_shrink ==================
[10:53:26] ==================== xe_bo (2 subtests) ====================
[10:53:26] ================== xe_ccs_migrate_kunit ===================
[10:53:26] ============== [SKIPPED] xe_ccs_migrate_kunit ==============
stty: 'standard input': Inappropriate ioctl for device
[10:53:26] ==================== xe_bo_evict_kunit ====================
[10:53:26] =============== [SKIPPED] xe_bo_evict_kunit ================
[10:53:26] ===================== [SKIPPED] xe_bo ======================
[10:53:26] ==================== args (11 subtests) ====================
[10:53:26] [PASSED] count_args_test
[10:53:26] [PASSED] call_args_example
[10:53:26] [PASSED] call_args_test
[10:53:26] [PASSED] drop_first_arg_example
[10:53:26] [PASSED] drop_first_arg_test
[10:53:26] [PASSED] first_arg_example
[10:53:26] [PASSED] first_arg_test
[10:53:26] [PASSED] last_arg_example
[10:53:26] [PASSED] last_arg_test
[10:53:26] [PASSED] pick_arg_example
[10:53:26] [PASSED] sep_comma_example
[10:53:26] ====================== [PASSED] args =======================
[10:53:26] =================== xe_pci (2 subtests) ====================
[10:53:26] [PASSED] xe_gmdid_graphics_ip
[10:53:26] [PASSED] xe_gmdid_media_ip
[10:53:26] ===================== [PASSED] xe_pci ======================
[10:53:26] =================== xe_rtp (2 subtests) ====================
[10:53:26] =============== xe_rtp_process_to_sr_tests ================
[10:53:26] [PASSED] coalesce-same-reg
[10:53:26] [PASSED] no-match-no-add
[10:53:26] [PASSED] match-or
[10:53:26] [PASSED] match-or-xfail
[10:53:26] [PASSED] no-match-no-add-multiple-rules
[10:53:26] [PASSED] two-regs-two-entries
[10:53:26] [PASSED] clr-one-set-other
[10:53:26] [PASSED] set-field
[10:53:26] [PASSED] conflict-duplicate
[10:53:26] [PASSED] conflict-not-disjoint
[10:53:26] [PASSED] conflict-reg-type
[10:53:26] =========== [PASSED] xe_rtp_process_to_sr_tests ============
[10:53:26] ================== xe_rtp_process_tests ===================
[10:53:26] [PASSED] active1
[10:53:26] [PASSED] active2
[10:53:26] [PASSED] active-inactive
[10:53:26] [PASSED] inactive-active
[10:53:26] [PASSED] inactive-1st_or_active-inactive
[10:53:26] [PASSED] inactive-2nd_or_active-inactive
[10:53:26] [PASSED] inactive-last_or_active-inactive
[10:53:26] [PASSED] inactive-no_or_active-inactive
[10:53:26] ============== [PASSED] xe_rtp_process_tests ===============
[10:53:26] ===================== [PASSED] xe_rtp ======================
[10:53:26] ==================== xe_wa (1 subtest) =====================
[10:53:26] ======================== xe_wa_gt =========================
[10:53:26] [PASSED] TIGERLAKE (B0)
[10:53:26] [PASSED] DG1 (A0)
[10:53:26] [PASSED] DG1 (B0)
[10:53:26] [PASSED] ALDERLAKE_S (A0)
[10:53:26] [PASSED] ALDERLAKE_S (B0)
[10:53:26] [PASSED] ALDERLAKE_S (C0)
[10:53:26] [PASSED] ALDERLAKE_S (D0)
[10:53:26] [PASSED] ALDERLAKE_P (A0)
[10:53:26] [PASSED] ALDERLAKE_P (B0)
[10:53:26] [PASSED] ALDERLAKE_P (C0)
[10:53:26] [PASSED] ALDERLAKE_S_RPLS (D0)
[10:53:26] [PASSED] ALDERLAKE_P_RPLU (E0)
[10:53:26] [PASSED] DG2_G10 (C0)
[10:53:26] [PASSED] DG2_G11 (B1)
[10:53:26] [PASSED] DG2_G12 (A1)
[10:53:26] [PASSED] METEORLAKE (g:A0, m:A0)
[10:53:26] [PASSED] METEORLAKE (g:A0, m:A0)
[10:53:26] [PASSED] METEORLAKE (g:A0, m:A0)
[10:53:26] [PASSED] LUNARLAKE (g:A0, m:A0)
[10:53:26] [PASSED] LUNARLAKE (g:B0, m:A0)
[10:53:26] [PASSED] BATTLEMAGE (g:A0, m:A1)
[10:53:26] ==================== [PASSED] xe_wa_gt =====================
[10:53:26] ====================== [PASSED] xe_wa ======================
[10:53:26] ============================================================
[10:53:26] Testing complete. Ran 133 tests: passed: 117, skipped: 16
[10:53:26] Elapsed time: 30.319s total, 4.130s configuring, 25.922s building, 0.248s running
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/tests/.kunitconfig
[10:53:26] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[10:53:28] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make all compile_commands.json ARCH=um O=.kunit --jobs=48
../lib/iomap.c:156:5: warning: no previous prototype for ‘ioread64_lo_hi’ [-Wmissing-prototypes]
156 | u64 ioread64_lo_hi(const void __iomem *addr)
| ^~~~~~~~~~~~~~
../lib/iomap.c:163:5: warning: no previous prototype for ‘ioread64_hi_lo’ [-Wmissing-prototypes]
163 | u64 ioread64_hi_lo(const void __iomem *addr)
| ^~~~~~~~~~~~~~
../lib/iomap.c:170:5: warning: no previous prototype for ‘ioread64be_lo_hi’ [-Wmissing-prototypes]
170 | u64 ioread64be_lo_hi(const void __iomem *addr)
| ^~~~~~~~~~~~~~~~
../lib/iomap.c:178:5: warning: no previous prototype for ‘ioread64be_hi_lo’ [-Wmissing-prototypes]
178 | u64 ioread64be_hi_lo(const void __iomem *addr)
| ^~~~~~~~~~~~~~~~
../lib/iomap.c:264:6: warning: no previous prototype for ‘iowrite64_lo_hi’ [-Wmissing-prototypes]
264 | void iowrite64_lo_hi(u64 val, void __iomem *addr)
| ^~~~~~~~~~~~~~~
../lib/iomap.c:272:6: warning: no previous prototype for ‘iowrite64_hi_lo’ [-Wmissing-prototypes]
272 | void iowrite64_hi_lo(u64 val, void __iomem *addr)
| ^~~~~~~~~~~~~~~
../lib/iomap.c:280:6: warning: no previous prototype for ‘iowrite64be_lo_hi’ [-Wmissing-prototypes]
280 | void iowrite64be_lo_hi(u64 val, void __iomem *addr)
| ^~~~~~~~~~~~~~~~~
../lib/iomap.c:288:6: warning: no previous prototype for ‘iowrite64be_hi_lo’ [-Wmissing-prototypes]
288 | void iowrite64be_hi_lo(u64 val, void __iomem *addr)
| ^~~~~~~~~~~~~~~~~
[10:53:49] Starting KUnit Kernel (1/1)...
[10:53:49] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[10:53:49] =========== drm_validate_clone_mode (2 subtests) ===========
[10:53:49] ============== drm_test_check_in_clone_mode ===============
[10:53:49] [PASSED] in_clone_mode
[10:53:49] [PASSED] not_in_clone_mode
[10:53:49] ========== [PASSED] drm_test_check_in_clone_mode ===========
[10:53:49] =============== drm_test_check_valid_clones ===============
[10:53:49] [PASSED] not_in_clone_mode
[10:53:49] [PASSED] valid_clone
[10:53:49] [PASSED] invalid_clone
[10:53:49] =========== [PASSED] drm_test_check_valid_clones ===========
[10:53:49] ============= [PASSED] drm_validate_clone_mode =============
[10:53:49] ============= drm_validate_modeset (1 subtest) =============
[10:53:49] [PASSED] drm_test_check_connector_changed_modeset
[10:53:49] ============== [PASSED] drm_validate_modeset ===============
[10:53:49] ================== drm_buddy (7 subtests) ==================
[10:53:49] [PASSED] drm_test_buddy_alloc_limit
[10:53:49] [PASSED] drm_test_buddy_alloc_optimistic
[10:53:49] [PASSED] drm_test_buddy_alloc_pessimistic
[10:53:49] [PASSED] drm_test_buddy_alloc_pathological
[10:53:49] [PASSED] drm_test_buddy_alloc_contiguous
[10:53:49] [PASSED] drm_test_buddy_alloc_clear
[10:53:49] [PASSED] drm_test_buddy_alloc_range_bias
[10:53:49] ==================== [PASSED] drm_buddy ====================
[10:53:49] ============= drm_cmdline_parser (40 subtests) =============
[10:53:49] [PASSED] drm_test_cmdline_force_d_only
[10:53:49] [PASSED] drm_test_cmdline_force_D_only_dvi
[10:53:49] [PASSED] drm_test_cmdline_force_D_only_hdmi
[10:53:49] [PASSED] drm_test_cmdline_force_D_only_not_digital
[10:53:49] [PASSED] drm_test_cmdline_force_e_only
[10:53:49] [PASSED] drm_test_cmdline_res
[10:53:49] [PASSED] drm_test_cmdline_res_vesa
[10:53:49] [PASSED] drm_test_cmdline_res_vesa_rblank
[10:53:49] [PASSED] drm_test_cmdline_res_rblank
[10:53:49] [PASSED] drm_test_cmdline_res_bpp
[10:53:49] [PASSED] drm_test_cmdline_res_refresh
[10:53:49] [PASSED] drm_test_cmdline_res_bpp_refresh
[10:53:49] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced
[10:53:49] [PASSED] drm_test_cmdline_res_bpp_refresh_margins
[10:53:49] [PASSED] drm_test_cmdline_res_bpp_refresh_force_off
[10:53:49] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on
[10:53:49] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_analog
[10:53:49] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_digital
[10:53:49] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced_margins_force_on
[10:53:49] [PASSED] drm_test_cmdline_res_margins_force_on
[10:53:49] [PASSED] drm_test_cmdline_res_vesa_margins
[10:53:49] [PASSED] drm_test_cmdline_name
[10:53:49] [PASSED] drm_test_cmdline_name_bpp
[10:53:49] [PASSED] drm_test_cmdline_name_option
[10:53:49] [PASSED] drm_test_cmdline_name_bpp_option
[10:53:49] [PASSED] drm_test_cmdline_rotate_0
[10:53:49] [PASSED] drm_test_cmdline_rotate_90
[10:53:49] [PASSED] drm_test_cmdline_rotate_180
[10:53:49] [PASSED] drm_test_cmdline_rotate_270
[10:53:49] [PASSED] drm_test_cmdline_hmirror
[10:53:49] [PASSED] drm_test_cmdline_vmirror
[10:53:49] [PASSED] drm_test_cmdline_margin_options
[10:53:49] [PASSED] drm_test_cmdline_multiple_options
[10:53:49] [PASSED] drm_test_cmdline_bpp_extra_and_option
[10:53:49] [PASSED] drm_test_cmdline_extra_and_option
[10:53:49] [PASSED] drm_test_cmdline_freestanding_options
[10:53:49] [PASSED] drm_test_cmdline_freestanding_force_e_and_options
[10:53:49] [PASSED] drm_test_cmdline_panel_orientation
[10:53:49] ================ drm_test_cmdline_invalid =================
[10:53:49] [PASSED] margin_only
[10:53:49] [PASSED] interlace_only
[10:53:49] [PASSED] res_missing_x
[10:53:49] [PASSED] res_missing_y
[10:53:49] [PASSED] res_bad_y
[10:53:49] [PASSED] res_missing_y_bpp
[10:53:49] [PASSED] res_bad_bpp
[10:53:49] [PASSED] res_bad_refresh
[10:53:49] [PASSED] res_bpp_refresh_force_on_off
[10:53:49] [PASSED] res_invalid_mode
[10:53:49] [PASSED] res_bpp_wrong_place_mode
[10:53:49] [PASSED] name_bpp_refresh
[10:53:49] [PASSED] name_refresh
[10:53:49] [PASSED] name_refresh_wrong_mode
[10:53:49] [PASSED] name_refresh_invalid_mode
[10:53:49] [PASSED] rotate_multiple
[10:53:49] [PASSED] rotate_invalid_val
[10:53:49] [PASSED] rotate_truncated
[10:53:49] [PASSED] invalid_option
[10:53:49] [PASSED] invalid_tv_option
[10:53:49] [PASSED] truncated_tv_option
[10:53:49] ============ [PASSED] drm_test_cmdline_invalid =============
[10:53:49] =============== drm_test_cmdline_tv_options ===============
[10:53:49] [PASSED] NTSC
[10:53:49] [PASSED] NTSC_443
[10:53:49] [PASSED] NTSC_J
[10:53:49] [PASSED] PAL
[10:53:49] [PASSED] PAL_M
[10:53:49] [PASSED] PAL_N
[10:53:49] [PASSED] SECAM
[10:53:49] [PASSED] MONO_525
[10:53:49] [PASSED] MONO_625
[10:53:49] =========== [PASSED] drm_test_cmdline_tv_options ===========
[10:53:49] =============== [PASSED] drm_cmdline_parser ================
[10:53:49] ========== drmm_connector_hdmi_init (20 subtests) ==========
[10:53:49] [PASSED] drm_test_connector_hdmi_init_valid
[10:53:49] [PASSED] drm_test_connector_hdmi_init_bpc_8
[10:53:49] [PASSED] drm_test_connector_hdmi_init_bpc_10
[10:53:49] [PASSED] drm_test_connector_hdmi_init_bpc_12
[10:53:49] [PASSED] drm_test_connector_hdmi_init_bpc_invalid
[10:53:49] [PASSED] drm_test_connector_hdmi_init_bpc_null
[10:53:49] [PASSED] drm_test_connector_hdmi_init_formats_empty
[10:53:49] [PASSED] drm_test_connector_hdmi_init_formats_no_rgb
[10:53:49] === drm_test_connector_hdmi_init_formats_yuv420_allowed ===
[10:53:49] [PASSED] supported_formats=0x9 yuv420_allowed=1
[10:53:49] [PASSED] supported_formats=0x9 yuv420_allowed=0
[10:53:49] [PASSED] supported_formats=0x3 yuv420_allowed=1
[10:53:49] [PASSED] supported_formats=0x3 yuv420_allowed=0
[10:53:49] === [PASSED] drm_test_connector_hdmi_init_formats_yuv420_allowed ===
[10:53:49] [PASSED] drm_test_connector_hdmi_init_null_ddc
[10:53:49] [PASSED] drm_test_connector_hdmi_init_null_product
[10:53:49] [PASSED] drm_test_connector_hdmi_init_null_vendor
[10:53:49] [PASSED] drm_test_connector_hdmi_init_product_length_exact
[10:53:49] [PASSED] drm_test_connector_hdmi_init_product_length_too_long
[10:53:49] [PASSED] drm_test_connector_hdmi_init_product_valid
[10:53:49] [PASSED] drm_test_connector_hdmi_init_vendor_length_exact
[10:53:49] [PASSED] drm_test_connector_hdmi_init_vendor_length_too_long
[10:53:49] [PASSED] drm_test_connector_hdmi_init_vendor_valid
[10:53:49] ========= drm_test_connector_hdmi_init_type_valid =========
[10:53:49] [PASSED] HDMI-A
[10:53:49] [PASSED] HDMI-B
[10:53:49] ===== [PASSED] drm_test_connector_hdmi_init_type_valid =====
[10:53:49] ======== drm_test_connector_hdmi_init_type_invalid ========
[10:53:49] [PASSED] Unknown
[10:53:49] [PASSED] VGA
[10:53:49] [PASSED] DVI-I
[10:53:49] [PASSED] DVI-D
[10:53:49] [PASSED] DVI-A
[10:53:49] [PASSED] Composite
[10:53:49] [PASSED] SVIDEO
[10:53:49] [PASSED] LVDS
[10:53:49] [PASSED] Component
[10:53:49] [PASSED] DIN
[10:53:49] [PASSED] DP
[10:53:49] [PASSED] TV
[10:53:49] [PASSED] eDP
[10:53:49] [PASSED] Virtual
[10:53:49] [PASSED] DSI
[10:53:49] [PASSED] DPI
[10:53:49] [PASSED] Writeback
[10:53:49] [PASSED] SPI
[10:53:49] [PASSED] USB
[10:53:49] ==== [PASSED] drm_test_connector_hdmi_init_type_invalid ====
[10:53:49] ============ [PASSED] drmm_connector_hdmi_init =============
[10:53:49] ============= drmm_connector_init (3 subtests) =============
[10:53:49] [PASSED] drm_test_drmm_connector_init
[10:53:49] [PASSED] drm_test_drmm_connector_init_null_ddc
[10:53:49] ========= drm_test_drmm_connector_init_type_valid =========
[10:53:49] [PASSED] Unknown
[10:53:49] [PASSED] VGA
[10:53:49] [PASSED] DVI-I
[10:53:49] [PASSED] DVI-D
[10:53:49] [PASSED] DVI-A
[10:53:49] [PASSED] Composite
[10:53:49] [PASSED] SVIDEO
[10:53:49] [PASSED] LVDS
[10:53:49] [PASSED] Component
[10:53:49] [PASSED] DIN
[10:53:49] [PASSED] DP
[10:53:49] [PASSED] HDMI-A
[10:53:49] [PASSED] HDMI-B
[10:53:49] [PASSED] TV
[10:53:49] [PASSED] eDP
[10:53:49] [PASSED] Virtual
[10:53:49] [PASSED] DSI
[10:53:49] [PASSED] DPI
[10:53:49] [PASSED] Writeback
[10:53:49] [PASSED] SPI
[10:53:49] [PASSED] USB
[10:53:49] ===== [PASSED] drm_test_drmm_connector_init_type_valid =====
[10:53:49] =============== [PASSED] drmm_connector_init ===============
[10:53:49] ========= drm_connector_dynamic_init (6 subtests) ==========
[10:53:49] [PASSED] drm_test_drm_connector_dynamic_init
[10:53:49] [PASSED] drm_test_drm_connector_dynamic_init_null_ddc
[10:53:49] [PASSED] drm_test_drm_connector_dynamic_init_not_added
[10:53:49] [PASSED] drm_test_drm_connector_dynamic_init_properties
[10:53:49] ===== drm_test_drm_connector_dynamic_init_type_valid ======
[10:53:49] [PASSED] Unknown
[10:53:49] [PASSED] VGA
[10:53:49] [PASSED] DVI-I
[10:53:49] [PASSED] DVI-D
[10:53:49] [PASSED] DVI-A
[10:53:49] [PASSED] Composite
[10:53:49] [PASSED] SVIDEO
[10:53:49] [PASSED] LVDS
[10:53:49] [PASSED] Component
[10:53:49] [PASSED] DIN
[10:53:49] [PASSED] DP
[10:53:49] [PASSED] HDMI-A
[10:53:49] [PASSED] HDMI-B
[10:53:49] [PASSED] TV
[10:53:49] [PASSED] eDP
[10:53:49] [PASSED] Virtual
[10:53:49] [PASSED] DSI
[10:53:49] [PASSED] DPI
[10:53:49] [PASSED] Writeback
[10:53:49] [PASSED] SPI
[10:53:49] [PASSED] USB
[10:53:49] = [PASSED] drm_test_drm_connector_dynamic_init_type_valid ==
[10:53:49] ======== drm_test_drm_connector_dynamic_init_name =========
[10:53:49] [PASSED] Unknown
[10:53:49] [PASSED] VGA
[10:53:49] [PASSED] DVI-I
[10:53:49] [PASSED] DVI-D
[10:53:49] [PASSED] DVI-A
[10:53:49] [PASSED] Composite
[10:53:49] [PASSED] SVIDEO
[10:53:49] [PASSED] LVDS
[10:53:49] [PASSED] Component
[10:53:49] [PASSED] DIN
[10:53:49] [PASSED] DP
[10:53:49] [PASSED] HDMI-A
[10:53:49] [PASSED] HDMI-B
[10:53:49] [PASSED] TV
[10:53:49] [PASSED] eDP
[10:53:49] [PASSED] Virtual
[10:53:49] [PASSED] DSI
[10:53:49] [PASSED] DPI
[10:53:49] [PASSED] Writeback
[10:53:49] [PASSED] SPI
[10:53:49] [PASSED] USB
[10:53:49] ==== [PASSED] drm_test_drm_connector_dynamic_init_name =====
[10:53:49] =========== [PASSED] drm_connector_dynamic_init ============
[10:53:49] ==== drm_connector_dynamic_register_early (4 subtests) =====
[10:53:49] [PASSED] drm_test_drm_connector_dynamic_register_early_on_list
[10:53:49] [PASSED] drm_test_drm_connector_dynamic_register_early_defer
[10:53:49] [PASSED] drm_test_drm_connector_dynamic_register_early_no_init
[10:53:49] [PASSED] drm_test_drm_connector_dynamic_register_early_no_mode_object
[10:53:49] ====== [PASSED] drm_connector_dynamic_register_early =======
[10:53:49] ======= drm_connector_dynamic_register (7 subtests) ========
[10:53:49] [PASSED] drm_test_drm_connector_dynamic_register_on_list
[10:53:49] [PASSED] drm_test_drm_connector_dynamic_register_no_defer
[10:53:49] [PASSED] drm_test_drm_connector_dynamic_register_no_init
[10:53:49] [PASSED] drm_test_drm_connector_dynamic_register_mode_object
[10:53:49] [PASSED] drm_test_drm_connector_dynamic_register_sysfs
[10:53:49] [PASSED] drm_test_drm_connector_dynamic_register_sysfs_name
[10:53:49] [PASSED] drm_test_drm_connector_dynamic_register_debugfs
[10:53:49] ========= [PASSED] drm_connector_dynamic_register ==========
[10:53:49] = drm_connector_attach_broadcast_rgb_property (2 subtests) =
[10:53:49] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property
[10:53:49] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property_hdmi_connector
[10:53:49] === [PASSED] drm_connector_attach_broadcast_rgb_property ===
[10:53:49] ========== drm_get_tv_mode_from_name (2 subtests) ==========
[10:53:49] ========== drm_test_get_tv_mode_from_name_valid ===========
[10:53:49] [PASSED] NTSC
[10:53:49] [PASSED] NTSC-443
[10:53:49] [PASSED] NTSC-J
[10:53:49] [PASSED] PAL
[10:53:49] [PASSED] PAL-M
[10:53:49] [PASSED] PAL-N
[10:53:49] [PASSED] SECAM
[10:53:49] [PASSED] Mono
[10:53:49] ====== [PASSED] drm_test_get_tv_mode_from_name_valid =======
[10:53:49] [PASSED] drm_test_get_tv_mode_from_name_truncated
[10:53:49] ============ [PASSED] drm_get_tv_mode_from_name ============
[10:53:49] = drm_test_connector_hdmi_compute_mode_clock (12 subtests) =
[10:53:49] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb
[10:53:49] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc
[10:53:49] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc_vic_1
[10:53:49] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc
[10:53:49] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc_vic_1
[10:53:49] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_double
[10:53:49] = drm_test_connector_hdmi_compute_mode_clock_yuv420_valid =
[10:53:49] [PASSED] VIC 96
[10:53:49] [PASSED] VIC 97
[10:53:49] [PASSED] VIC 101
[10:53:49] [PASSED] VIC 102
[10:53:49] [PASSED] VIC 106
[10:53:49] [PASSED] VIC 107
[10:53:49] === [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_valid ===
[10:53:49] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_10_bpc
[10:53:49] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_12_bpc
[10:53:49] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_8_bpc
[10:53:49] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_10_bpc
[10:53:49] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_12_bpc
[10:53:49] === [PASSED] drm_test_connector_hdmi_compute_mode_clock ====
[10:53:49] == drm_hdmi_connector_get_broadcast_rgb_name (2 subtests) ==
[10:53:49] === drm_test_drm_hdmi_connector_get_broadcast_rgb_name ====
[10:53:49] [PASSED] Automatic
[10:53:49] [PASSED] Full
[10:53:49] [PASSED] Limited 16:235
[10:53:49] === [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name ===
[10:53:49] [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name_invalid
[10:53:49] ==== [PASSED] drm_hdmi_connector_get_broadcast_rgb_name ====
[10:53:49] == drm_hdmi_connector_get_output_format_name (2 subtests) ==
[10:53:49] === drm_test_drm_hdmi_connector_get_output_format_name ====
[10:53:49] [PASSED] RGB
[10:53:49] [PASSED] YUV 4:2:0
[10:53:49] [PASSED] YUV 4:2:2
[10:53:49] [PASSED] YUV 4:4:4
[10:53:49] === [PASSED] drm_test_drm_hdmi_connector_get_output_format_name ===
[10:53:49] [PASSED] drm_test_drm_hdmi_connector_get_output_format_name_invalid
[10:53:49] ==== [PASSED] drm_hdmi_connector_get_output_format_name ====
[10:53:49] ============= drm_damage_helper (21 subtests) ==============
[10:53:49] [PASSED] drm_test_damage_iter_no_damage
[10:53:49] [PASSED] drm_test_damage_iter_no_damage_fractional_src
[10:53:49] [PASSED] drm_test_damage_iter_no_damage_src_moved
[10:53:49] [PASSED] drm_test_damage_iter_no_damage_fractional_src_moved
[10:53:49] [PASSED] drm_test_damage_iter_no_damage_not_visible
[10:53:49] [PASSED] drm_test_damage_iter_no_damage_no_crtc
[10:53:49] [PASSED] drm_test_damage_iter_no_damage_no_fb
[10:53:49] [PASSED] drm_test_damage_iter_simple_damage
[10:53:49] [PASSED] drm_test_damage_iter_single_damage
[10:53:49] [PASSED] drm_test_damage_iter_single_damage_intersect_src
[10:53:49] [PASSED] drm_test_damage_iter_single_damage_outside_src
[10:53:49] [PASSED] drm_test_damage_iter_single_damage_fractional_src
[10:53:49] [PASSED] drm_test_damage_iter_single_damage_intersect_fractional_src
[10:53:49] [PASSED] drm_test_damage_iter_single_damage_outside_fractional_src
[10:53:49] [PASSED] drm_test_damage_iter_single_damage_src_moved
[10:53:49] [PASSED] drm_test_damage_iter_single_damage_fractional_src_moved
[10:53:49] [PASSED] drm_test_damage_iter_damage
[10:53:49] [PASSED] drm_test_damage_iter_damage_one_intersect
[10:53:49] [PASSED] drm_test_damage_iter_damage_one_outside
[10:53:49] [PASSED] drm_test_damage_iter_damage_src_moved
[10:53:49] [PASSED] drm_test_damage_iter_damage_not_visible
[10:53:49] ================ [PASSED] drm_damage_helper ================
[10:53:49] ============== drm_dp_mst_helper (3 subtests) ==============
[10:53:49] ============== drm_test_dp_mst_calc_pbn_mode ==============
[10:53:49] [PASSED] Clock 154000 BPP 30 DSC disabled
[10:53:49] [PASSED] Clock 234000 BPP 30 DSC disabled
[10:53:49] [PASSED] Clock 297000 BPP 24 DSC disabled
[10:53:49] [PASSED] Clock 332880 BPP 24 DSC enabled
[10:53:49] [PASSED] Clock 324540 BPP 24 DSC enabled
[10:53:49] ========== [PASSED] drm_test_dp_mst_calc_pbn_mode ==========
[10:53:49] ============== drm_test_dp_mst_calc_pbn_div ===============
[10:53:49] [PASSED] Link rate 2000000 lane count 4
[10:53:49] [PASSED] Link rate 2000000 lane count 2
[10:53:49] [PASSED] Link rate 2000000 lane count 1
[10:53:49] [PASSED] Link rate 1350000 lane count 4
[10:53:49] [PASSED] Link rate 1350000 lane count 2
[10:53:49] [PASSED] Link rate 1350000 lane count 1
[10:53:49] [PASSED] Link rate 1000000 lane count 4
[10:53:49] [PASSED] Link rate 1000000 lane count 2
[10:53:49] [PASSED] Link rate 1000000 lane count 1
[10:53:49] [PASSED] Link rate 810000 lane count 4
[10:53:49] [PASSED] Link rate 810000 lane count 2
[10:53:49] [PASSED] Link rate 810000 lane count 1
[10:53:49] [PASSED] Link rate 540000 lane count 4
[10:53:49] [PASSED] Link rate 540000 lane count 2
[10:53:49] [PASSED] Link rate 540000 lane count 1
[10:53:49] [PASSED] Link rate 270000 lane count 4
[10:53:49] [PASSED] Link rate 270000 lane count 2
[10:53:49] [PASSED] Link rate 270000 lane count 1
[10:53:49] [PASSED] Link rate 162000 lane count 4
[10:53:49] [PASSED] Link rate 162000 lane count 2
[10:53:49] [PASSED] Link rate 162000 lane count 1
[10:53:49] ========== [PASSED] drm_test_dp_mst_calc_pbn_div ===========
[10:53:49] ========= drm_test_dp_mst_sideband_msg_req_decode =========
[10:53:49] [PASSED] DP_ENUM_PATH_RESOURCES with port number
[10:53:49] [PASSED] DP_POWER_UP_PHY with port number
[10:53:49] [PASSED] DP_POWER_DOWN_PHY with port number
[10:53:49] [PASSED] DP_ALLOCATE_PAYLOAD with SDP stream sinks
[10:53:49] [PASSED] DP_ALLOCATE_PAYLOAD with port number
[10:53:49] [PASSED] DP_ALLOCATE_PAYLOAD with VCPI
[10:53:49] [PASSED] DP_ALLOCATE_PAYLOAD with PBN
[10:53:49] [PASSED] DP_QUERY_PAYLOAD with port number
[10:53:49] [PASSED] DP_QUERY_PAYLOAD with VCPI
[10:53:49] [PASSED] DP_REMOTE_DPCD_READ with port number
[10:53:49] [PASSED] DP_REMOTE_DPCD_READ with DPCD address
[10:53:49] [PASSED] DP_REMOTE_DPCD_READ with max number of bytes
[10:53:49] [PASSED] DP_REMOTE_DPCD_WRITE with port number
[10:53:49] [PASSED] DP_REMOTE_DPCD_WRITE with DPCD address
[10:53:49] [PASSED] DP_REMOTE_DPCD_WRITE with data array
[10:53:49] [PASSED] DP_REMOTE_I2C_READ with port number
[10:53:49] [PASSED] DP_REMOTE_I2C_READ with I2C device ID
[10:53:49] [PASSED] DP_REMOTE_I2C_READ with transactions array
[10:53:49] [PASSED] DP_REMOTE_I2C_WRITE with port number
[10:53:49] [PASSED] DP_REMOTE_I2C_WRITE with I2C device ID
[10:53:49] [PASSED] DP_REMOTE_I2C_WRITE with data array
[10:53:49] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream ID
[10:53:49] [PASSED] DP_QUERY_STREAM_ENC_STATUS with client ID
[10:53:49] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream event
[10:53:49] [PASSED] DP_QUERY_STREAM_ENC_STATUS with valid stream event
[10:53:49] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream behavior
[10:53:49] [PASSED] DP_QUERY_STREAM_ENC_STATUS with a valid stream behavior
[10:53:49] ===== [PASSED] drm_test_dp_mst_sideband_msg_req_decode =====
[10:53:49] ================ [PASSED] drm_dp_mst_helper ================
[10:53:49] ================== drm_exec (7 subtests) ===================
[10:53:49] [PASSED] sanitycheck
[10:53:49] [PASSED] test_lock
[10:53:49] [PASSED] test_lock_unlock
[10:53:49] [PASSED] test_duplicates
[10:53:49] [PASSED] test_prepare
[10:53:49] [PASSED] test_prepare_array
[10:53:49] [PASSED] test_multiple_loops
[10:53:49] ==================== [PASSED] drm_exec =====================
[10:53:49] =========== drm_format_helper_test (17 subtests) ===========
[10:53:49] ============== drm_test_fb_xrgb8888_to_gray8 ==============
[10:53:49] [PASSED] single_pixel_source_buffer
[10:53:49] [PASSED] single_pixel_clip_rectangle
[10:53:49] [PASSED] well_known_colors
[10:53:49] [PASSED] destination_pitch
[10:53:49] ========== [PASSED] drm_test_fb_xrgb8888_to_gray8 ==========
[10:53:49] ============= drm_test_fb_xrgb8888_to_rgb332 ==============
[10:53:49] [PASSED] single_pixel_source_buffer
[10:53:49] [PASSED] single_pixel_clip_rectangle
[10:53:49] [PASSED] well_known_colors
[10:53:49] [PASSED] destination_pitch
[10:53:49] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb332 ==========
[10:53:49] ============= drm_test_fb_xrgb8888_to_rgb565 ==============
[10:53:49] [PASSED] single_pixel_source_buffer
[10:53:49] [PASSED] single_pixel_clip_rectangle
[10:53:49] [PASSED] well_known_colors
[10:53:49] [PASSED] destination_pitch
[10:53:49] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb565 ==========
[10:53:49] ============ drm_test_fb_xrgb8888_to_xrgb1555 =============
[10:53:49] [PASSED] single_pixel_source_buffer
[10:53:49] [PASSED] single_pixel_clip_rectangle
[10:53:49] [PASSED] well_known_colors
[10:53:49] [PASSED] destination_pitch
[10:53:49] ======== [PASSED] drm_test_fb_xrgb8888_to_xrgb1555 =========
[10:53:49] ============ drm_test_fb_xrgb8888_to_argb1555 =============
[10:53:49] [PASSED] single_pixel_source_buffer
[10:53:49] [PASSED] single_pixel_clip_rectangle
[10:53:49] [PASSED] well_known_colors
[10:53:49] [PASSED] destination_pitch
[10:53:49] ======== [PASSED] drm_test_fb_xrgb8888_to_argb1555 =========
[10:53:49] ============ drm_test_fb_xrgb8888_to_rgba5551 =============
[10:53:49] [PASSED] single_pixel_source_buffer
[10:53:49] [PASSED] single_pixel_clip_rectangle
[10:53:49] [PASSED] well_known_colors
[10:53:49] [PASSED] destination_pitch
[10:53:49] ======== [PASSED] drm_test_fb_xrgb8888_to_rgba5551 =========
[10:53:49] ============= drm_test_fb_xrgb8888_to_rgb888 ==============
[10:53:49] [PASSED] single_pixel_source_buffer
[10:53:49] [PASSED] single_pixel_clip_rectangle
[10:53:49] [PASSED] well_known_colors
[10:53:49] [PASSED] destination_pitch
[10:53:49] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb888 ==========
[10:53:49] ============ drm_test_fb_xrgb8888_to_argb8888 =============
[10:53:49] [PASSED] single_pixel_source_buffer
[10:53:49] [PASSED] single_pixel_clip_rectangle
[10:53:49] [PASSED] well_known_colors
[10:53:49] [PASSED] destination_pitch
[10:53:49] ======== [PASSED] drm_test_fb_xrgb8888_to_argb8888 =========
[10:53:49] =========== drm_test_fb_xrgb8888_to_xrgb2101010 ===========
[10:53:49] [PASSED] single_pixel_source_buffer
[10:53:49] [PASSED] single_pixel_clip_rectangle
[10:53:49] [PASSED] well_known_colors
[10:53:49] [PASSED] destination_pitch
[10:53:49] ======= [PASSED] drm_test_fb_xrgb8888_to_xrgb2101010 =======
[10:53:49] =========== drm_test_fb_xrgb8888_to_argb2101010 ===========
[10:53:49] [PASSED] single_pixel_source_buffer
[10:53:49] [PASSED] single_pixel_clip_rectangle
[10:53:49] [PASSED] well_known_colors
[10:53:49] [PASSED] destination_pitch
[10:53:49] ======= [PASSED] drm_test_fb_xrgb8888_to_argb2101010 =======
[10:53:49] ============== drm_test_fb_xrgb8888_to_mono ===============
[10:53:49] [PASSED] single_pixel_source_buffer
[10:53:49] [PASSED] single_pixel_clip_rectangle
[10:53:49] [PASSED] well_known_colors
[10:53:49] [PASSED] destination_pitch
[10:53:49] ========== [PASSED] drm_test_fb_xrgb8888_to_mono ===========
[10:53:49] ==================== drm_test_fb_swab =====================
[10:53:49] [PASSED] single_pixel_source_buffer
[10:53:49] [PASSED] single_pixel_clip_rectangle
[10:53:49] [PASSED] well_known_colors
[10:53:49] [PASSED] destination_pitch
[10:53:49] ================ [PASSED] drm_test_fb_swab =================
[10:53:49] ============ drm_test_fb_xrgb8888_to_xbgr8888 =============
[10:53:49] [PASSED] single_pixel_source_buffer
[10:53:49] [PASSED] single_pixel_clip_rectangle
[10:53:49] [PASSED] well_known_colors
[10:53:49] [PASSED] destination_pitch
[10:53:49] ======== [PASSED] drm_test_fb_xrgb8888_to_xbgr8888 =========
[10:53:49] ============ drm_test_fb_xrgb8888_to_abgr8888 =============
[10:53:49] [PASSED] single_pixel_source_buffer
[10:53:49] [PASSED] single_pixel_clip_rectangle
[10:53:49] [PASSED] well_known_colors
[10:53:49] [PASSED] destination_pitch
[10:53:49] ======== [PASSED] drm_test_fb_xrgb8888_to_abgr8888 =========
[10:53:49] ================= drm_test_fb_clip_offset =================
[10:53:49] [PASSED] pass through
[10:53:49] [PASSED] horizontal offset
[10:53:49] [PASSED] vertical offset
[10:53:49] [PASSED] horizontal and vertical offset
[10:53:49] [PASSED] horizontal offset (custom pitch)
[10:53:49] [PASSED] vertical offset (custom pitch)
[10:53:49] [PASSED] horizontal and vertical offset (custom pitch)
[10:53:49] ============= [PASSED] drm_test_fb_clip_offset =============
[10:53:49] ============== drm_test_fb_build_fourcc_list ==============
[10:53:49] [PASSED] no native formats
[10:53:49] [PASSED] XRGB8888 as native format
[10:53:49] [PASSED] remove duplicates
[10:53:49] [PASSED] convert alpha formats
[10:53:49] [PASSED] random formats
[10:53:49] ========== [PASSED] drm_test_fb_build_fourcc_list ==========
[10:53:49] =================== drm_test_fb_memcpy ====================
[10:53:49] [PASSED] single_pixel_source_buffer: XR24 little-endian (0x34325258)
[10:53:49] [PASSED] single_pixel_source_buffer: XRA8 little-endian (0x38415258)
[10:53:49] [PASSED] single_pixel_source_buffer: YU24 little-endian (0x34325559)
[10:53:49] [PASSED] single_pixel_clip_rectangle: XB24 little-endian (0x34324258)
[10:53:49] [PASSED] single_pixel_clip_rectangle: XRA8 little-endian (0x38415258)
[10:53:49] [PASSED] single_pixel_clip_rectangle: YU24 little-endian (0x34325559)
[10:53:49] [PASSED] well_known_colors: XB24 little-endian (0x34324258)
[10:53:49] [PASSED] well_known_colors: XRA8 little-endian (0x38415258)
[10:53:49] [PASSED] well_known_colors: YU24 little-endian (0x34325559)
[10:53:49] [PASSED] destination_pitch: XB24 little-endian (0x34324258)
[10:53:49] [PASSED] destination_pitch: XRA8 little-endian (0x38415258)
[10:53:49] [PASSED] destination_pitch: YU24 little-endian (0x34325559)
[10:53:49] =============== [PASSED] drm_test_fb_memcpy ================
[10:53:49] ============= [PASSED] drm_format_helper_test ==============
[10:53:49] ================= drm_format (18 subtests) =================
[10:53:49] [PASSED] drm_test_format_block_width_invalid
[10:53:49] [PASSED] drm_test_format_block_width_one_plane
[10:53:49] [PASSED] drm_test_format_block_width_two_plane
[10:53:49] [PASSED] drm_test_format_block_width_three_plane
[10:53:49] [PASSED] drm_test_format_block_width_tiled
[10:53:49] [PASSED] drm_test_format_block_height_invalid
[10:53:49] [PASSED] drm_test_format_block_height_one_plane
[10:53:49] [PASSED] drm_test_format_block_height_two_plane
[10:53:49] [PASSED] drm_test_format_block_height_three_plane
[10:53:49] [PASSED] drm_test_format_block_height_tiled
[10:53:49] [PASSED] drm_test_format_min_pitch_invalid
[10:53:49] [PASSED] drm_test_format_min_pitch_one_plane_8bpp
[10:53:49] [PASSED] drm_test_format_min_pitch_one_plane_16bpp
[10:53:49] [PASSED] drm_test_format_min_pitch_one_plane_24bpp
[10:53:49] [PASSED] drm_test_format_min_pitch_one_plane_32bpp
[10:53:49] [PASSED] drm_test_format_min_pitch_two_plane
[10:53:49] [PASSED] drm_test_format_min_pitch_three_plane_8bpp
[10:53:49] [PASSED] drm_test_format_min_pitch_tiled
[10:53:49] =================== [PASSED] drm_format ====================
[10:53:49] ============== drm_framebuffer (10 subtests) ===============
[10:53:49] ========== drm_test_framebuffer_check_src_coords ==========
[10:53:49] [PASSED] Success: source fits into fb
[10:53:49] [PASSED] Fail: overflowing fb with x-axis coordinate
[10:53:49] [PASSED] Fail: overflowing fb with y-axis coordinate
[10:53:49] [PASSED] Fail: overflowing fb with source width
[10:53:49] [PASSED] Fail: overflowing fb with source height
[10:53:49] ====== [PASSED] drm_test_framebuffer_check_src_coords ======
[10:53:49] [PASSED] drm_test_framebuffer_cleanup
[10:53:49] =============== drm_test_framebuffer_create ===============
[10:53:49] [PASSED] ABGR8888 normal sizes
[10:53:49] [PASSED] ABGR8888 max sizes
[10:53:49] [PASSED] ABGR8888 pitch greater than min required
[10:53:49] [PASSED] ABGR8888 pitch less than min required
[10:53:49] [PASSED] ABGR8888 Invalid width
[10:53:49] [PASSED] ABGR8888 Invalid buffer handle
[10:53:49] [PASSED] No pixel format
[10:53:49] [PASSED] ABGR8888 Width 0
[10:53:49] [PASSED] ABGR8888 Height 0
[10:53:49] [PASSED] ABGR8888 Out of bound height * pitch combination
[10:53:49] [PASSED] ABGR8888 Large buffer offset
[10:53:49] [PASSED] ABGR8888 Buffer offset for inexistent plane
[10:53:49] [PASSED] ABGR8888 Invalid flag
[10:53:49] [PASSED] ABGR8888 Set DRM_MODE_FB_MODIFIERS without modifiers
[10:53:49] [PASSED] ABGR8888 Valid buffer modifier
[10:53:49] [PASSED] ABGR8888 Invalid buffer modifier(DRM_FORMAT_MOD_SAMSUNG_64_32_TILE)
[10:53:49] [PASSED] ABGR8888 Extra pitches without DRM_MODE_FB_MODIFIERS
[10:53:49] [PASSED] ABGR8888 Extra pitches with DRM_MODE_FB_MODIFIERS
[10:53:49] [PASSED] NV12 Normal sizes
[10:53:49] [PASSED] NV12 Max sizes
[10:53:49] [PASSED] NV12 Invalid pitch
[10:53:49] [PASSED] NV12 Invalid modifier/missing DRM_MODE_FB_MODIFIERS flag
[10:53:49] [PASSED] NV12 different modifier per-plane
[10:53:49] [PASSED] NV12 with DRM_FORMAT_MOD_SAMSUNG_64_32_TILE
[10:53:49] [PASSED] NV12 Valid modifiers without DRM_MODE_FB_MODIFIERS
[10:53:49] [PASSED] NV12 Modifier for inexistent plane
[10:53:49] [PASSED] NV12 Handle for inexistent plane
[10:53:49] [PASSED] NV12 Handle for inexistent plane without DRM_MODE_FB_MODIFIERS
[10:53:49] [PASSED] YVU420 DRM_MODE_FB_MODIFIERS set without modifier
[10:53:49] [PASSED] YVU420 Normal sizes
[10:53:49] [PASSED] YVU420 Max sizes
[10:53:49] [PASSED] YVU420 Invalid pitch
[10:53:49] [PASSED] YVU420 Different pitches
[10:53:49] [PASSED] YVU420 Different buffer offsets/pitches
[10:53:49] [PASSED] YVU420 Modifier set just for plane 0, without DRM_MODE_FB_MODIFIERS
[10:53:49] [PASSED] YVU420 Modifier set just for planes 0, 1, without DRM_MODE_FB_MODIFIERS
[10:53:49] [PASSED] YVU420 Modifier set just for plane 0, 1, with DRM_MODE_FB_MODIFIERS
[10:53:49] [PASSED] YVU420 Valid modifier
[10:53:49] [PASSED] YVU420 Different modifiers per plane
[10:53:49] [PASSED] YVU420 Modifier for inexistent plane
[10:53:49] [PASSED] YUV420_10BIT Invalid modifier(DRM_FORMAT_MOD_LINEAR)
[10:53:49] [PASSED] X0L2 Normal sizes
[10:53:49] [PASSED] X0L2 Max sizes
[10:53:49] [PASSED] X0L2 Invalid pitch
[10:53:49] [PASSED] X0L2 Pitch greater than minimum required
[10:53:49] [PASSED] X0L2 Handle for inexistent plane
[10:53:49] [PASSED] X0L2 Offset for inexistent plane, without DRM_MODE_FB_MODIFIERS set
[10:53:49] [PASSED] X0L2 Modifier without DRM_MODE_FB_MODIFIERS set
[10:53:49] [PASSED] X0L2 Valid modifier
[10:53:49] [PASSED] X0L2 Modifier for inexistent plane
[10:53:49] =========== [PASSED] drm_test_framebuffer_create ===========
[10:53:49] [PASSED] drm_test_framebuffer_free
[10:53:49] [PASSED] drm_test_framebuffer_init
[10:53:49] [PASSED] drm_test_framebuffer_init_bad_format
[10:53:49] [PASSED] drm_test_framebuffer_init_dev_mismatch
[10:53:49] [PASSED] drm_test_framebuffer_lookup
[10:53:49] [PASSED] drm_test_framebuffer_lookup_inexistent
[10:53:49] [PASSED] drm_test_framebuffer_modifiers_not_supported
[10:53:49] ================= [PASSED] drm_framebuffer =================
[10:53:49] ================ drm_gem_shmem (8 subtests) ================
[10:53:49] [PASSED] drm_gem_shmem_test_obj_create
[10:53:49] [PASSED] drm_gem_shmem_test_obj_create_private
[10:53:49] [PASSED] drm_gem_shmem_test_pin_pages
[10:53:49] [PASSED] drm_gem_shmem_test_vmap
[10:53:49] [PASSED] drm_gem_shmem_test_get_pages_sgt
[10:53:49] [PASSED] drm_gem_shmem_test_get_sg_table
[10:53:49] [PASSED] drm_gem_shmem_test_madvise
[10:53:49] [PASSED] drm_gem_shmem_test_purge
[10:53:49] ================== [PASSED] drm_gem_shmem ==================
[10:53:49] === drm_atomic_helper_connector_hdmi_check (23 subtests) ===
[10:53:49] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode
[10:53:49] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode_vic_1
[10:53:49] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode
[10:53:49] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode_vic_1
[10:53:49] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode
[10:53:49] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode_vic_1
[10:53:49] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_changed
[10:53:49] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_not_changed
[10:53:49] [PASSED] drm_test_check_disable_connector
[10:53:49] [PASSED] drm_test_check_hdmi_funcs_reject_rate
[10:53:49] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback
[10:53:49] [PASSED] drm_test_check_max_tmds_rate_format_fallback
[10:53:49] [PASSED] drm_test_check_output_bpc_crtc_mode_changed
[10:53:49] [PASSED] drm_test_check_output_bpc_crtc_mode_not_changed
[10:53:49] [PASSED] drm_test_check_output_bpc_dvi
[10:53:49] [PASSED] drm_test_check_output_bpc_format_vic_1
[10:53:49] [PASSED] drm_test_check_output_bpc_format_display_8bpc_only
[10:53:49] [PASSED] drm_test_check_output_bpc_format_display_rgb_only
[10:53:49] [PASSED] drm_test_check_output_bpc_format_driver_8bpc_only
[10:53:49] [PASSED] drm_test_check_output_bpc_format_driver_rgb_only
[10:53:49] [PASSED] drm_test_check_tmds_char_rate_rgb_8bpc
[10:53:49] [PASSED] drm_test_check_tmds_char_rate_rgb_10bpc
[10:53:49] [PASSED] drm_test_check_tmds_char_rate_rgb_12bpc
[10:53:49] ===== [PASSED] drm_atomic_helper_connector_hdmi_check ======
[10:53:49] === drm_atomic_helper_connector_hdmi_reset (6 subtests) ====
[10:53:49] [PASSED] drm_test_check_broadcast_rgb_value
[10:53:49] [PASSED] drm_test_check_bpc_8_value
[10:53:49] [PASSED] drm_test_check_bpc_10_value
[10:53:49] [PASSED] drm_test_check_bpc_12_value
[10:53:49] [PASSED] drm_test_check_format_value
[10:53:49] [PASSED] drm_test_check_tmds_char_value
[10:53:49] ===== [PASSED] drm_atomic_helper_connector_hdmi_reset ======
[10:53:49] = drm_atomic_helper_connector_hdmi_mode_valid (4 subtests) =
[10:53:49] [PASSED] drm_test_check_mode_valid
[10:53:49] [PASSED] drm_test_check_mode_valid_reject
[10:53:49] [PASSED] drm_test_check_mode_valid_reject_rate
[10:53:49] [PASSED] drm_test_check_mode_valid_reject_max_clock
[10:53:49] === [PASSED] drm_atomic_helper_connector_hdmi_mode_valid ===
[10:53:49] ================= drm_managed (2 subtests) =================
[10:53:49] [PASSED] drm_test_managed_release_action
[10:53:49] [PASSED] drm_test_managed_run_action
[10:53:49] =================== [PASSED] drm_managed ===================
[10:53:49] =================== drm_mm (6 subtests) ====================
[10:53:49] [PASSED] drm_test_mm_init
[10:53:49] [PASSED] drm_test_mm_debug
[10:53:49] [PASSED] drm_test_mm_align32
[10:53:49] [PASSED] drm_test_mm_align64
[10:53:49] [PASSED] drm_test_mm_lowest
[10:53:49] [PASSED] drm_test_mm_highest
[10:53:49] ===================== [PASSED] drm_mm ======================
[10:53:49] ============= drm_modes_analog_tv (5 subtests) =============
[10:53:49] [PASSED] drm_test_modes_analog_tv_mono_576i
[10:53:49] [PASSED] drm_test_modes_analog_tv_ntsc_480i
[10:53:49] [PASSED] drm_test_modes_analog_tv_ntsc_480i_inlined
[10:53:49] [PASSED] drm_test_modes_analog_tv_pal_576i
[10:53:49] [PASSED] drm_test_modes_analog_tv_pal_576i_inlined
[10:53:49] =============== [PASSED] drm_modes_analog_tv ===============
[10:53:49] ============== drm_plane_helper (2 subtests) ===============
[10:53:49] =============== drm_test_check_plane_state ================
[10:53:49] [PASSED] clipping_simple
[10:53:49] [PASSED] clipping_rotate_reflect
[10:53:49] [PASSED] positioning_simple
[10:53:49] [PASSED] upscaling
[10:53:49] [PASSED] downscaling
[10:53:49] [PASSED] rounding1
[10:53:49] [PASSED] rounding2
[10:53:49] [PASSED] rounding3
[10:53:49] [PASSED] rounding4
[10:53:49] =========== [PASSED] drm_test_check_plane_state ============
[10:53:49] =========== drm_test_check_invalid_plane_state ============
[10:53:49] [PASSED] positioning_invalid
[10:53:49] [PASSED] upscaling_invalid
[10:53:49] [PASSED] downscaling_invalid
[10:53:49] ======= [PASSED] drm_test_check_invalid_plane_state ========
[10:53:49] ================ [PASSED] drm_plane_helper =================
[10:53:49] ====== drm_connector_helper_tv_get_modes (1 subtest) =======
[10:53:49] ====== drm_test_connector_helper_tv_get_modes_check =======
[10:53:49] [PASSED] None
[10:53:49] [PASSED] PAL
[10:53:49] [PASSED] NTSC
[10:53:49] [PASSED] Both, NTSC Default
[10:53:49] [PASSED] Both, PAL Default
[10:53:49] [PASSED] Both, NTSC Default, with PAL on command-line
[10:53:49] [PASSED] Both, PAL Default, with NTSC on command-line
[10:53:49] == [PASSED] drm_test_connector_helper_tv_get_modes_check ===
[10:53:49] ======== [PASSED] drm_connector_helper_tv_get_modes ========
[10:53:49] ================== drm_rect (9 subtests) ===================
[10:53:49] [PASSED] drm_test_rect_clip_scaled_div_by_zero
[10:53:49] [PASSED] drm_test_rect_clip_scaled_not_clipped
[10:53:49] [PASSED] drm_test_rect_clip_scaled_clipped
[10:53:49] [PASSED] drm_test_rect_clip_scaled_signed_vs_unsigned
[10:53:49] ================= drm_test_rect_intersect =================
[10:53:49] [PASSED] top-left x bottom-right: 2x2+1+1 x 2x2+0+0
[10:53:49] [PASSED] top-right x bottom-left: 2x2+0+0 x 2x2+1-1
[10:53:49] [PASSED] bottom-left x top-right: 2x2+1-1 x 2x2+0+0
[10:53:49] [PASSED] bottom-right x top-left: 2x2+0+0 x 2x2+1+1
[10:53:49] [PASSED] right x left: 2x1+0+0 x 3x1+1+0
[10:53:49] [PASSED] left x right: 3x1+1+0 x 2x1+0+0
[10:53:49] [PASSED] up x bottom: 1x2+0+0 x 1x3+0-1
[10:53:49] [PASSED] bottom x up: 1x3+0-1 x 1x2+0+0
[10:53:49] [PASSED] touching corner: 1x1+0+0 x 2x2+1+1
[10:53:49] [PASSED] touching side: 1x1+0+0 x 1x1+1+0
[10:53:49] [PASSED] equal rects: 2x2+0+0 x 2x2+0+0
[10:53:49] [PASSED] inside another: 2x2+0+0 x 1x1+1+1
[10:53:49] [PASSED] far away: 1x1+0+0 x 1x1+3+6
[10:53:49] [PASSED] points intersecting: 0x0+5+10 x 0x0+5+10
[10:53:49] [PASSED] points not intersecting: 0x0+0+0 x 0x0+5+10
[10:53:49] ============= [PASSED] drm_test_rect_intersect =============
[10:53:49] ================ drm_test_rect_calc_hscale ================
[10:53:49] [PASSED] normal use
[10:53:49] [PASSED] out of max range
[10:53:49] [PASSED] out of min range
[10:53:49] [PASSED] zero dst
[10:53:49] [PASSED] negative src
[10:53:49] [PASSED] negative dst
[10:53:49] ============ [PASSED] drm_test_rect_calc_hscale ============
[10:53:49] ================ drm_test_rect_calc_vscale ================
[10:53:49] [PASSED] normal use
[10:53:49] [PASSED] out of max range
[10:53:49] [PASSED] out of min range
[10:53:49] [PASSED] zero dst
[10:53:49] [PASSED] negative src
[10:53:49] [PASSED] negative dst
[10:53:49] ============ [PASSED] drm_test_rect_calc_vscale ============
[10:53:49] ================== drm_test_rect_rotate ===================
[10:53:49] [PASSED] reflect-x
[10:53:49] [PASSED] reflect-y
[10:53:49] [PASSED] rotate-0
[10:53:49] [PASSED] rotate-90
[10:53:49] [PASSED] rotate-180
[10:53:49] [PASSED] rotate-270
stty: 'standard input': Inappropriate ioctl for device
[10:53:49] ============== [PASSED] drm_test_rect_rotate ===============
[10:53:49] ================ drm_test_rect_rotate_inv =================
[10:53:49] [PASSED] reflect-x
[10:53:49] [PASSED] reflect-y
[10:53:49] [PASSED] rotate-0
[10:53:49] [PASSED] rotate-90
[10:53:49] [PASSED] rotate-180
[10:53:49] [PASSED] rotate-270
[10:53:49] ============ [PASSED] drm_test_rect_rotate_inv =============
[10:53:49] ==================== [PASSED] drm_rect =====================
[10:53:49] ============================================================
[10:53:49] Testing complete. Ran 598 tests: passed: 598
[10:53:49] Elapsed time: 22.671s total, 1.669s configuring, 20.834s building, 0.128s running
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/ttm/tests/.kunitconfig
[10:53:49] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[10:53:51] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make all compile_commands.json ARCH=um O=.kunit --jobs=48
[10:53:58] Starting KUnit Kernel (1/1)...
[10:53:58] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[10:53:59] ================= ttm_device (5 subtests) ==================
[10:53:59] [PASSED] ttm_device_init_basic
[10:53:59] [PASSED] ttm_device_init_multiple
[10:53:59] [PASSED] ttm_device_fini_basic
[10:53:59] [PASSED] ttm_device_init_no_vma_man
[10:53:59] ================== ttm_device_init_pools ==================
[10:53:59] [PASSED] No DMA allocations, no DMA32 required
[10:53:59] [PASSED] DMA allocations, DMA32 required
[10:53:59] [PASSED] No DMA allocations, DMA32 required
[10:53:59] [PASSED] DMA allocations, no DMA32 required
[10:53:59] ============== [PASSED] ttm_device_init_pools ==============
[10:53:59] =================== [PASSED] ttm_device ====================
[10:53:59] ================== ttm_pool (8 subtests) ===================
[10:53:59] ================== ttm_pool_alloc_basic ===================
[10:53:59] [PASSED] One page
[10:53:59] [PASSED] More than one page
[10:53:59] [PASSED] Above the allocation limit
[10:53:59] [PASSED] One page, with coherent DMA mappings enabled
[10:53:59] [PASSED] Above the allocation limit, with coherent DMA mappings enabled
[10:53:59] ============== [PASSED] ttm_pool_alloc_basic ===============
[10:53:59] ============== ttm_pool_alloc_basic_dma_addr ==============
[10:53:59] [PASSED] One page
[10:53:59] [PASSED] More than one page
[10:53:59] [PASSED] Above the allocation limit
[10:53:59] [PASSED] One page, with coherent DMA mappings enabled
[10:53:59] [PASSED] Above the allocation limit, with coherent DMA mappings enabled
[10:53:59] ========== [PASSED] ttm_pool_alloc_basic_dma_addr ==========
[10:53:59] [PASSED] ttm_pool_alloc_order_caching_match
[10:53:59] [PASSED] ttm_pool_alloc_caching_mismatch
[10:53:59] [PASSED] ttm_pool_alloc_order_mismatch
[10:53:59] [PASSED] ttm_pool_free_dma_alloc
[10:53:59] [PASSED] ttm_pool_free_no_dma_alloc
[10:53:59] [PASSED] ttm_pool_fini_basic
[10:53:59] ==================== [PASSED] ttm_pool =====================
[10:53:59] ================ ttm_resource (8 subtests) =================
[10:53:59] ================= ttm_resource_init_basic =================
[10:53:59] [PASSED] Init resource in TTM_PL_SYSTEM
[10:53:59] [PASSED] Init resource in TTM_PL_VRAM
[10:53:59] [PASSED] Init resource in a private placement
[10:53:59] [PASSED] Init resource in TTM_PL_SYSTEM, set placement flags
[10:53:59] ============= [PASSED] ttm_resource_init_basic =============
[10:53:59] [PASSED] ttm_resource_init_pinned
[10:53:59] [PASSED] ttm_resource_fini_basic
[10:53:59] [PASSED] ttm_resource_manager_init_basic
[10:53:59] [PASSED] ttm_resource_manager_usage_basic
[10:53:59] [PASSED] ttm_resource_manager_set_used_basic
[10:53:59] [PASSED] ttm_sys_man_alloc_basic
[10:53:59] [PASSED] ttm_sys_man_free_basic
[10:53:59] ================== [PASSED] ttm_resource ===================
[10:53:59] =================== ttm_tt (15 subtests) ===================
[10:53:59] ==================== ttm_tt_init_basic ====================
[10:53:59] [PASSED] Page-aligned size
[10:53:59] [PASSED] Extra pages requested
[10:53:59] ================ [PASSED] ttm_tt_init_basic ================
[10:53:59] [PASSED] ttm_tt_init_misaligned
[10:53:59] [PASSED] ttm_tt_fini_basic
[10:53:59] [PASSED] ttm_tt_fini_sg
[10:53:59] [PASSED] ttm_tt_fini_shmem
[10:53:59] [PASSED] ttm_tt_create_basic
[10:53:59] [PASSED] ttm_tt_create_invalid_bo_type
[10:53:59] [PASSED] ttm_tt_create_ttm_exists
[10:53:59] [PASSED] ttm_tt_create_failed
[10:53:59] [PASSED] ttm_tt_destroy_basic
[10:53:59] [PASSED] ttm_tt_populate_null_ttm
[10:53:59] [PASSED] ttm_tt_populate_populated_ttm
[10:53:59] [PASSED] ttm_tt_unpopulate_basic
[10:53:59] [PASSED] ttm_tt_unpopulate_empty_ttm
[10:53:59] [PASSED] ttm_tt_swapin_basic
[10:53:59] ===================== [PASSED] ttm_tt ======================
[10:53:59] =================== ttm_bo (14 subtests) ===================
[10:53:59] =========== ttm_bo_reserve_optimistic_no_ticket ===========
[10:53:59] [PASSED] Cannot be interrupted and sleeps
[10:53:59] [PASSED] Cannot be interrupted, locks straight away
[10:53:59] [PASSED] Can be interrupted, sleeps
[10:53:59] ======= [PASSED] ttm_bo_reserve_optimistic_no_ticket =======
[10:53:59] [PASSED] ttm_bo_reserve_locked_no_sleep
[10:53:59] [PASSED] ttm_bo_reserve_no_wait_ticket
[10:53:59] [PASSED] ttm_bo_reserve_double_resv
[10:53:59] [PASSED] ttm_bo_reserve_interrupted
[10:53:59] [PASSED] ttm_bo_reserve_deadlock
[10:53:59] [PASSED] ttm_bo_unreserve_basic
[10:53:59] [PASSED] ttm_bo_unreserve_pinned
[10:53:59] [PASSED] ttm_bo_unreserve_bulk
[10:53:59] [PASSED] ttm_bo_put_basic
[10:53:59] [PASSED] ttm_bo_put_shared_resv
[10:53:59] [PASSED] ttm_bo_pin_basic
[10:53:59] [PASSED] ttm_bo_pin_unpin_resource
[10:53:59] [PASSED] ttm_bo_multiple_pin_one_unpin
[10:53:59] ===================== [PASSED] ttm_bo ======================
[10:53:59] ============== ttm_bo_validate (22 subtests) ===============
[10:53:59] ============== ttm_bo_init_reserved_sys_man ===============
[10:53:59] [PASSED] Buffer object for userspace
[10:53:59] [PASSED] Kernel buffer object
[10:53:59] [PASSED] Shared buffer object
[10:53:59] ========== [PASSED] ttm_bo_init_reserved_sys_man ===========
[10:53:59] ============== ttm_bo_init_reserved_mock_man ==============
[10:53:59] [PASSED] Buffer object for userspace
[10:53:59] [PASSED] Kernel buffer object
[10:53:59] [PASSED] Shared buffer object
[10:53:59] ========== [PASSED] ttm_bo_init_reserved_mock_man ==========
[10:53:59] [PASSED] ttm_bo_init_reserved_resv
[10:53:59] ================== ttm_bo_validate_basic ==================
[10:53:59] [PASSED] Buffer object for userspace
[10:53:59] [PASSED] Kernel buffer object
[10:53:59] [PASSED] Shared buffer object
[10:53:59] ============== [PASSED] ttm_bo_validate_basic ==============
[10:53:59] [PASSED] ttm_bo_validate_invalid_placement
[10:53:59] ============= ttm_bo_validate_same_placement ==============
[10:53:59] [PASSED] System manager
[10:53:59] [PASSED] VRAM manager
[10:53:59] ========= [PASSED] ttm_bo_validate_same_placement ==========
[10:53:59] [PASSED] ttm_bo_validate_failed_alloc
[10:53:59] [PASSED] ttm_bo_validate_pinned
[10:53:59] [PASSED] ttm_bo_validate_busy_placement
[10:53:59] ================ ttm_bo_validate_multihop =================
[10:53:59] [PASSED] Buffer object for userspace
[10:53:59] [PASSED] Kernel buffer object
[10:53:59] [PASSED] Shared buffer object
[10:53:59] ============ [PASSED] ttm_bo_validate_multihop =============
[10:53:59] ========== ttm_bo_validate_no_placement_signaled ==========
[10:53:59] [PASSED] Buffer object in system domain, no page vector
[10:53:59] [PASSED] Buffer object in system domain with an existing page vector
[10:53:59] ====== [PASSED] ttm_bo_validate_no_placement_signaled ======
[10:53:59] ======== ttm_bo_validate_no_placement_not_signaled ========
[10:53:59] [PASSED] Buffer object for userspace
[10:53:59] [PASSED] Kernel buffer object
[10:53:59] [PASSED] Shared buffer object
[10:53:59] ==== [PASSED] ttm_bo_validate_no_placement_not_signaled ====
[10:53:59] [PASSED] ttm_bo_validate_move_fence_signaled
[10:53:59] ========= ttm_bo_validate_move_fence_not_signaled =========
[10:53:59] [PASSED] Waits for GPU
[10:53:59] [PASSED] Tries to lock straight away
[10:53:59] ===== [PASSED] ttm_bo_validate_move_fence_not_signaled =====
[10:53:59] [PASSED] ttm_bo_validate_swapout
[10:53:59] [PASSED] ttm_bo_validate_happy_evict
[10:53:59] [PASSED] ttm_bo_validate_all_pinned_evict
[10:53:59] [PASSED] ttm_bo_validate_allowed_only_evict
[10:53:59] [PASSED] ttm_bo_validate_deleted_evict
[10:53:59] [PASSED] ttm_bo_validate_busy_domain_evict
[10:53:59] [PASSED] ttm_bo_validate_evict_gutting
[10:53:59] [PASSED] ttm_bo_validate_recrusive_evict
stty: 'standard input': Inappropriate ioctl for device
[10:53:59] ================= [PASSED] ttm_bo_validate =================
[10:53:59] ============================================================
[10:53:59] Testing complete. Ran 102 tests: passed: 102
[10:53:59] Elapsed time: 9.950s total, 1.678s configuring, 7.605s building, 0.570s running
+ cleanup
++ stat -c %u:%g /kernel
+ chown -R 1003:1003 /kernel
^ permalink raw reply [flat|nested] 26+ messages in thread* ✓ CI.Build: success for TTM shrinker helpers and xe buffer object shrinker (rev17)
2025-01-30 10:13 [PATCH v16 0/7] TTM shrinker helpers and xe buffer object shrinker Thomas Hellström
` (9 preceding siblings ...)
2025-01-30 10:54 ` ✓ CI.KUnit: success " Patchwork
@ 2025-01-30 11:10 ` Patchwork
2025-01-30 11:16 ` ✓ CI.Hooks: " Patchwork
` (3 subsequent siblings)
14 siblings, 0 replies; 26+ messages in thread
From: Patchwork @ 2025-01-30 11:10 UTC (permalink / raw)
To: Thomas Hellström; +Cc: intel-xe
== Series Details ==
Series: TTM shrinker helpers and xe buffer object shrinker (rev17)
URL : https://patchwork.freedesktop.org/series/131815/
State : success
== Summary ==
lib/modules/6.13.0-xe+/kernel/arch/x86/events/rapl.ko
lib/modules/6.13.0-xe+/kernel/arch/x86/kvm/
lib/modules/6.13.0-xe+/kernel/arch/x86/kvm/kvm.ko
lib/modules/6.13.0-xe+/kernel/arch/x86/kvm/kvm-intel.ko
lib/modules/6.13.0-xe+/kernel/arch/x86/kvm/kvm-amd.ko
lib/modules/6.13.0-xe+/kernel/kernel/
lib/modules/6.13.0-xe+/kernel/kernel/kheaders.ko
lib/modules/6.13.0-xe+/kernel/crypto/
lib/modules/6.13.0-xe+/kernel/crypto/ecrdsa_generic.ko
lib/modules/6.13.0-xe+/kernel/crypto/xcbc.ko
lib/modules/6.13.0-xe+/kernel/crypto/serpent_generic.ko
lib/modules/6.13.0-xe+/kernel/crypto/aria_generic.ko
lib/modules/6.13.0-xe+/kernel/crypto/crypto_simd.ko
lib/modules/6.13.0-xe+/kernel/crypto/adiantum.ko
lib/modules/6.13.0-xe+/kernel/crypto/tcrypt.ko
lib/modules/6.13.0-xe+/kernel/crypto/crypto_engine.ko
lib/modules/6.13.0-xe+/kernel/crypto/zstd.ko
lib/modules/6.13.0-xe+/kernel/crypto/asymmetric_keys/
lib/modules/6.13.0-xe+/kernel/crypto/asymmetric_keys/pkcs7_test_key.ko
lib/modules/6.13.0-xe+/kernel/crypto/asymmetric_keys/pkcs8_key_parser.ko
lib/modules/6.13.0-xe+/kernel/crypto/des_generic.ko
lib/modules/6.13.0-xe+/kernel/crypto/xctr.ko
lib/modules/6.13.0-xe+/kernel/crypto/authenc.ko
lib/modules/6.13.0-xe+/kernel/crypto/sm4_generic.ko
lib/modules/6.13.0-xe+/kernel/crypto/keywrap.ko
lib/modules/6.13.0-xe+/kernel/crypto/camellia_generic.ko
lib/modules/6.13.0-xe+/kernel/crypto/sm3.ko
lib/modules/6.13.0-xe+/kernel/crypto/pcrypt.ko
lib/modules/6.13.0-xe+/kernel/crypto/aegis128.ko
lib/modules/6.13.0-xe+/kernel/crypto/af_alg.ko
lib/modules/6.13.0-xe+/kernel/crypto/algif_aead.ko
lib/modules/6.13.0-xe+/kernel/crypto/cmac.ko
lib/modules/6.13.0-xe+/kernel/crypto/sm3_generic.ko
lib/modules/6.13.0-xe+/kernel/crypto/aes_ti.ko
lib/modules/6.13.0-xe+/kernel/crypto/chacha_generic.ko
lib/modules/6.13.0-xe+/kernel/crypto/poly1305_generic.ko
lib/modules/6.13.0-xe+/kernel/crypto/nhpoly1305.ko
lib/modules/6.13.0-xe+/kernel/crypto/crc32_generic.ko
lib/modules/6.13.0-xe+/kernel/crypto/essiv.ko
lib/modules/6.13.0-xe+/kernel/crypto/ccm.ko
lib/modules/6.13.0-xe+/kernel/crypto/wp512.ko
lib/modules/6.13.0-xe+/kernel/crypto/streebog_generic.ko
lib/modules/6.13.0-xe+/kernel/crypto/authencesn.ko
lib/modules/6.13.0-xe+/kernel/crypto/echainiv.ko
lib/modules/6.13.0-xe+/kernel/crypto/lrw.ko
lib/modules/6.13.0-xe+/kernel/crypto/cryptd.ko
lib/modules/6.13.0-xe+/kernel/crypto/crypto_user.ko
lib/modules/6.13.0-xe+/kernel/crypto/algif_hash.ko
lib/modules/6.13.0-xe+/kernel/crypto/vmac.ko
lib/modules/6.13.0-xe+/kernel/crypto/polyval-generic.ko
lib/modules/6.13.0-xe+/kernel/crypto/hctr2.ko
lib/modules/6.13.0-xe+/kernel/crypto/842.ko
lib/modules/6.13.0-xe+/kernel/crypto/pcbc.ko
lib/modules/6.13.0-xe+/kernel/crypto/ansi_cprng.ko
lib/modules/6.13.0-xe+/kernel/crypto/cast6_generic.ko
lib/modules/6.13.0-xe+/kernel/crypto/twofish_common.ko
lib/modules/6.13.0-xe+/kernel/crypto/twofish_generic.ko
lib/modules/6.13.0-xe+/kernel/crypto/lz4hc.ko
lib/modules/6.13.0-xe+/kernel/crypto/blowfish_generic.ko
lib/modules/6.13.0-xe+/kernel/crypto/md4.ko
lib/modules/6.13.0-xe+/kernel/crypto/chacha20poly1305.ko
lib/modules/6.13.0-xe+/kernel/crypto/curve25519-generic.ko
lib/modules/6.13.0-xe+/kernel/crypto/lz4.ko
lib/modules/6.13.0-xe+/kernel/crypto/rmd160.ko
lib/modules/6.13.0-xe+/kernel/crypto/algif_skcipher.ko
lib/modules/6.13.0-xe+/kernel/crypto/cast5_generic.ko
lib/modules/6.13.0-xe+/kernel/crypto/fcrypt.ko
lib/modules/6.13.0-xe+/kernel/crypto/ecdsa_generic.ko
lib/modules/6.13.0-xe+/kernel/crypto/sm4.ko
lib/modules/6.13.0-xe+/kernel/crypto/cast_common.ko
lib/modules/6.13.0-xe+/kernel/crypto/blowfish_common.ko
lib/modules/6.13.0-xe+/kernel/crypto/michael_mic.ko
lib/modules/6.13.0-xe+/kernel/crypto/async_tx/
lib/modules/6.13.0-xe+/kernel/crypto/async_tx/async_xor.ko
lib/modules/6.13.0-xe+/kernel/crypto/async_tx/async_tx.ko
lib/modules/6.13.0-xe+/kernel/crypto/async_tx/async_memcpy.ko
lib/modules/6.13.0-xe+/kernel/crypto/async_tx/async_pq.ko
lib/modules/6.13.0-xe+/kernel/crypto/async_tx/async_raid6_recov.ko
lib/modules/6.13.0-xe+/kernel/crypto/algif_rng.ko
lib/modules/6.13.0-xe+/kernel/block/
lib/modules/6.13.0-xe+/kernel/block/bfq.ko
lib/modules/6.13.0-xe+/kernel/block/kyber-iosched.ko
lib/modules/6.13.0-xe+/build
lib/modules/6.13.0-xe+/modules.alias.bin
lib/modules/6.13.0-xe+/modules.builtin
lib/modules/6.13.0-xe+/modules.softdep
lib/modules/6.13.0-xe+/modules.alias
lib/modules/6.13.0-xe+/modules.order
lib/modules/6.13.0-xe+/modules.symbols
lib/modules/6.13.0-xe+/modules.dep.bin
+ mv kernel-nodebug.tar.gz ..
+ cd ..
+ rm -rf archive
++ date +%s
+ echo -e '\e[0Ksection_end:1738235419:package_x86_64_nodebug\r\e[0K'
^[[0Ksection_end:1738235419:package_x86_64_nodebug
^[[0K
+ sync
+ cleanup
++ stat -c %u:%g /kernel
+ chown -R 1003:1003 /kernel
^ permalink raw reply [flat|nested] 26+ messages in thread* ✓ CI.Hooks: success for TTM shrinker helpers and xe buffer object shrinker (rev17)
2025-01-30 10:13 [PATCH v16 0/7] TTM shrinker helpers and xe buffer object shrinker Thomas Hellström
` (10 preceding siblings ...)
2025-01-30 11:10 ` ✓ CI.Build: " Patchwork
@ 2025-01-30 11:16 ` Patchwork
2025-01-30 11:27 ` ✗ CI.checksparse: warning " Patchwork
` (2 subsequent siblings)
14 siblings, 0 replies; 26+ messages in thread
From: Patchwork @ 2025-01-30 11:16 UTC (permalink / raw)
To: Thomas Hellström; +Cc: intel-xe
== Series Details ==
Series: TTM shrinker helpers and xe buffer object shrinker (rev17)
URL : https://patchwork.freedesktop.org/series/131815/
State : success
== Summary ==
run-parts: executing /workspace/ci/hooks/00-showenv
+ export
+ grep -Ei '(^|\W)CI_'
declare -x CI_KERNEL_BUILD_DIR="/workspace/kernel/build64-default"
declare -x CI_KERNEL_SRC_DIR="/workspace/kernel"
declare -x CI_TOOLS_SRC_DIR="/workspace/ci"
declare -x CI_WORKSPACE_DIR="/workspace"
run-parts: executing /workspace/ci/hooks/10-build-W1
+ SRC_DIR=/workspace/kernel
+ RESTORE_DISPLAY_CONFIG=0
+ '[' -n /workspace/kernel/build64-default ']'
+ BUILD_DIR=/workspace/kernel/build64-default
+ cd /workspace/kernel
++ nproc
+ make -j48 O=/workspace/kernel/build64-default modules_prepare
make[1]: Entering directory '/workspace/kernel/build64-default'
GEN Makefile
mkdir -p /workspace/kernel/build64-default/tools/objtool && make O=/workspace/kernel/build64-default subdir=tools/objtool --no-print-directory -C objtool
CALL ../scripts/checksyscalls.sh
INSTALL libsubcmd_headers
CC /workspace/kernel/build64-default/tools/objtool/libsubcmd/exec-cmd.o
CC /workspace/kernel/build64-default/tools/objtool/libsubcmd/help.o
CC /workspace/kernel/build64-default/tools/objtool/libsubcmd/pager.o
CC /workspace/kernel/build64-default/tools/objtool/libsubcmd/parse-options.o
CC /workspace/kernel/build64-default/tools/objtool/libsubcmd/run-command.o
CC /workspace/kernel/build64-default/tools/objtool/libsubcmd/sigchain.o
CC /workspace/kernel/build64-default/tools/objtool/libsubcmd/subcmd-config.o
LD /workspace/kernel/build64-default/tools/objtool/libsubcmd/libsubcmd-in.o
AR /workspace/kernel/build64-default/tools/objtool/libsubcmd/libsubcmd.a
CC /workspace/kernel/build64-default/tools/objtool/weak.o
CC /workspace/kernel/build64-default/tools/objtool/check.o
CC /workspace/kernel/build64-default/tools/objtool/special.o
CC /workspace/kernel/build64-default/tools/objtool/builtin-check.o
CC /workspace/kernel/build64-default/tools/objtool/elf.o
CC /workspace/kernel/build64-default/tools/objtool/objtool.o
CC /workspace/kernel/build64-default/tools/objtool/orc_gen.o
CC /workspace/kernel/build64-default/tools/objtool/orc_dump.o
CC /workspace/kernel/build64-default/tools/objtool/libctype.o
CC /workspace/kernel/build64-default/tools/objtool/arch/x86/special.o
CC /workspace/kernel/build64-default/tools/objtool/libstring.o
CC /workspace/kernel/build64-default/tools/objtool/str_error_r.o
CC /workspace/kernel/build64-default/tools/objtool/arch/x86/decode.o
CC /workspace/kernel/build64-default/tools/objtool/librbtree.o
CC /workspace/kernel/build64-default/tools/objtool/arch/x86/orc.o
LD /workspace/kernel/build64-default/tools/objtool/arch/x86/objtool-in.o
LD /workspace/kernel/build64-default/tools/objtool/objtool-in.o
LINK /workspace/kernel/build64-default/tools/objtool/objtool
make[1]: Leaving directory '/workspace/kernel/build64-default'
++ nproc
+ make -j48 O=/workspace/kernel/build64-default W=1 drivers/gpu/drm/xe
make[1]: Entering directory '/workspace/kernel/build64-default'
make[2]: Nothing to be done for 'drivers/gpu/drm/xe'.
make[1]: Leaving directory '/workspace/kernel/build64-default'
run-parts: executing /workspace/ci/hooks/11-build-32b
+++ realpath /workspace/ci/hooks/11-build-32b
++ dirname /workspace/ci/hooks/11-build-32b
+ THIS_SCRIPT_DIR=/workspace/ci/hooks
+ SRC_DIR=/workspace/kernel
+ TOOLS_SRC_DIR=/workspace/ci
+ '[' -n /workspace/kernel/build64-default ']'
+ BUILD_DIR=/workspace/kernel/build64-default
+ BUILD_DIR=/workspace/kernel/build64-default/build32
+ cd /workspace/kernel
+ mkdir -p /workspace/kernel/build64-default/build32
++ nproc
+ make -j48 ARCH=i386 O=/workspace/kernel/build64-default/build32 defconfig
make[1]: Entering directory '/workspace/kernel/build64-default/build32'
GEN Makefile
HOSTCC scripts/basic/fixdep
HOSTCC scripts/kconfig/conf.o
HOSTCC scripts/kconfig/confdata.o
LEX scripts/kconfig/lexer.lex.c
HOSTCC scripts/kconfig/expr.o
YACC scripts/kconfig/parser.tab.[ch]
HOSTCC scripts/kconfig/menu.o
HOSTCC scripts/kconfig/preprocess.o
HOSTCC scripts/kconfig/symbol.o
HOSTCC scripts/kconfig/util.o
HOSTCC scripts/kconfig/lexer.lex.o
HOSTCC scripts/kconfig/parser.tab.o
HOSTLD scripts/kconfig/conf
*** Default configuration is based on 'i386_defconfig'
#
# configuration written to .config
#
make[1]: Leaving directory '/workspace/kernel/build64-default/build32'
+ cd /workspace/kernel/build64-default/build32
+ /workspace/kernel/scripts/kconfig/merge_config.sh .config /workspace/ci/kernel/fragments/10-xe.fragment
Using .config as base
Merging /workspace/ci/kernel/fragments/10-xe.fragment
Value of CONFIG_DRM_XE is redefined by fragment /workspace/ci/kernel/fragments/10-xe.fragment:
Previous value: # CONFIG_DRM_XE is not set
New value: CONFIG_DRM_XE=m
GEN Makefile
WARNING: unmet direct dependencies detected for FB_IOMEM_HELPERS
Depends on [n]: HAS_IOMEM [=y] && FB_CORE [=n]
Selected by [m]:
- DRM_XE_DISPLAY [=y] && HAS_IOMEM [=y] && DRM [=y] && DRM_XE [=m] && DRM_XE [=m]=m [=m] && HAS_IOPORT [=y]
#
# configuration written to .config
#
Value requested for CONFIG_HAVE_UID16 not in final .config
Requested value: CONFIG_HAVE_UID16=y
Actual value:
Value requested for CONFIG_UID16 not in final .config
Requested value: CONFIG_UID16=y
Actual value:
Value requested for CONFIG_X86_32 not in final .config
Requested value: CONFIG_X86_32=y
Actual value:
Value requested for CONFIG_OUTPUT_FORMAT not in final .config
Requested value: CONFIG_OUTPUT_FORMAT="elf32-i386"
Actual value: CONFIG_OUTPUT_FORMAT="elf64-x86-64"
Value requested for CONFIG_ARCH_MMAP_RND_BITS_MIN not in final .config
Requested value: CONFIG_ARCH_MMAP_RND_BITS_MIN=8
Actual value: CONFIG_ARCH_MMAP_RND_BITS_MIN=28
Value requested for CONFIG_ARCH_MMAP_RND_BITS_MAX not in final .config
Requested value: CONFIG_ARCH_MMAP_RND_BITS_MAX=16
Actual value: CONFIG_ARCH_MMAP_RND_BITS_MAX=32
Value requested for CONFIG_PGTABLE_LEVELS not in final .config
Requested value: CONFIG_PGTABLE_LEVELS=2
Actual value: CONFIG_PGTABLE_LEVELS=5
Value requested for CONFIG_X86_BIGSMP not in final .config
Requested value: # CONFIG_X86_BIGSMP is not set
Actual value:
Value requested for CONFIG_X86_INTEL_QUARK not in final .config
Requested value: # CONFIG_X86_INTEL_QUARK is not set
Actual value:
Value requested for CONFIG_X86_RDC321X not in final .config
Requested value: # CONFIG_X86_RDC321X is not set
Actual value:
Value requested for CONFIG_X86_32_NON_STANDARD not in final .config
Requested value: # CONFIG_X86_32_NON_STANDARD is not set
Actual value:
Value requested for CONFIG_X86_32_IRIS not in final .config
Requested value: # CONFIG_X86_32_IRIS is not set
Actual value:
Value requested for CONFIG_M486SX not in final .config
Requested value: # CONFIG_M486SX is not set
Actual value:
Value requested for CONFIG_M486 not in final .config
Requested value: # CONFIG_M486 is not set
Actual value:
Value requested for CONFIG_M586 not in final .config
Requested value: # CONFIG_M586 is not set
Actual value:
Value requested for CONFIG_M586TSC not in final .config
Requested value: # CONFIG_M586TSC is not set
Actual value:
Value requested for CONFIG_M586MMX not in final .config
Requested value: # CONFIG_M586MMX is not set
Actual value:
Value requested for CONFIG_M686 not in final .config
Requested value: CONFIG_M686=y
Actual value:
Value requested for CONFIG_MPENTIUMII not in final .config
Requested value: # CONFIG_MPENTIUMII is not set
Actual value:
Value requested for CONFIG_MPENTIUMIII not in final .config
Requested value: # CONFIG_MPENTIUMIII is not set
Actual value:
Value requested for CONFIG_MPENTIUMM not in final .config
Requested value: # CONFIG_MPENTIUMM is not set
Actual value:
Value requested for CONFIG_MPENTIUM4 not in final .config
Requested value: # CONFIG_MPENTIUM4 is not set
Actual value:
Value requested for CONFIG_MK6 not in final .config
Requested value: # CONFIG_MK6 is not set
Actual value:
Value requested for CONFIG_MK7 not in final .config
Requested value: # CONFIG_MK7 is not set
Actual value:
Value requested for CONFIG_MCRUSOE not in final .config
Requested value: # CONFIG_MCRUSOE is not set
Actual value:
Value requested for CONFIG_MEFFICEON not in final .config
Requested value: # CONFIG_MEFFICEON is not set
Actual value:
Value requested for CONFIG_MWINCHIPC6 not in final .config
Requested value: # CONFIG_MWINCHIPC6 is not set
Actual value:
Value requested for CONFIG_MWINCHIP3D not in final .config
Requested value: # CONFIG_MWINCHIP3D is not set
Actual value:
Value requested for CONFIG_MELAN not in final .config
Requested value: # CONFIG_MELAN is not set
Actual value:
Value requested for CONFIG_MGEODEGX1 not in final .config
Requested value: # CONFIG_MGEODEGX1 is not set
Actual value:
Value requested for CONFIG_MGEODE_LX not in final .config
Requested value: # CONFIG_MGEODE_LX is not set
Actual value:
Value requested for CONFIG_MCYRIXIII not in final .config
Requested value: # CONFIG_MCYRIXIII is not set
Actual value:
Value requested for CONFIG_MVIAC3_2 not in final .config
Requested value: # CONFIG_MVIAC3_2 is not set
Actual value:
Value requested for CONFIG_MVIAC7 not in final .config
Requested value: # CONFIG_MVIAC7 is not set
Actual value:
Value requested for CONFIG_X86_GENERIC not in final .config
Requested value: # CONFIG_X86_GENERIC is not set
Actual value:
Value requested for CONFIG_X86_INTERNODE_CACHE_SHIFT not in final .config
Requested value: CONFIG_X86_INTERNODE_CACHE_SHIFT=5
Actual value: CONFIG_X86_INTERNODE_CACHE_SHIFT=6
Value requested for CONFIG_X86_L1_CACHE_SHIFT not in final .config
Requested value: CONFIG_X86_L1_CACHE_SHIFT=5
Actual value: CONFIG_X86_L1_CACHE_SHIFT=6
Value requested for CONFIG_X86_USE_PPRO_CHECKSUM not in final .config
Requested value: CONFIG_X86_USE_PPRO_CHECKSUM=y
Actual value:
Value requested for CONFIG_X86_MINIMUM_CPU_FAMILY not in final .config
Requested value: CONFIG_X86_MINIMUM_CPU_FAMILY=6
Actual value: CONFIG_X86_MINIMUM_CPU_FAMILY=64
Value requested for CONFIG_CPU_SUP_TRANSMETA_32 not in final .config
Requested value: CONFIG_CPU_SUP_TRANSMETA_32=y
Actual value:
Value requested for CONFIG_CPU_SUP_VORTEX_32 not in final .config
Requested value: CONFIG_CPU_SUP_VORTEX_32=y
Actual value:
Value requested for CONFIG_HPET_TIMER not in final .config
Requested value: # CONFIG_HPET_TIMER is not set
Actual value: CONFIG_HPET_TIMER=y
Value requested for CONFIG_NR_CPUS_RANGE_END not in final .config
Requested value: CONFIG_NR_CPUS_RANGE_END=8
Actual value: CONFIG_NR_CPUS_RANGE_END=512
Value requested for CONFIG_NR_CPUS_DEFAULT not in final .config
Requested value: CONFIG_NR_CPUS_DEFAULT=8
Actual value: CONFIG_NR_CPUS_DEFAULT=64
Value requested for CONFIG_X86_ANCIENT_MCE not in final .config
Requested value: # CONFIG_X86_ANCIENT_MCE is not set
Actual value:
Value requested for CONFIG_X86_LEGACY_VM86 not in final .config
Requested value: # CONFIG_X86_LEGACY_VM86 is not set
Actual value:
Value requested for CONFIG_X86_ESPFIX32 not in final .config
Requested value: CONFIG_X86_ESPFIX32=y
Actual value:
Value requested for CONFIG_TOSHIBA not in final .config
Requested value: # CONFIG_TOSHIBA is not set
Actual value:
Value requested for CONFIG_X86_REBOOTFIXUPS not in final .config
Requested value: # CONFIG_X86_REBOOTFIXUPS is not set
Actual value:
Value requested for CONFIG_MICROCODE_INITRD32 not in final .config
Requested value: CONFIG_MICROCODE_INITRD32=y
Actual value:
Value requested for CONFIG_NOHIGHMEM not in final .config
Requested value: # CONFIG_NOHIGHMEM is not set
Actual value:
Value requested for CONFIG_HIGHMEM4G not in final .config
Requested value: CONFIG_HIGHMEM4G=y
Actual value:
Value requested for CONFIG_HIGHMEM64G not in final .config
Requested value: # CONFIG_HIGHMEM64G is not set
Actual value:
Value requested for CONFIG_VMSPLIT_3G not in final .config
Requested value: CONFIG_VMSPLIT_3G=y
Actual value:
Value requested for CONFIG_VMSPLIT_3G_OPT not in final .config
Requested value: # CONFIG_VMSPLIT_3G_OPT is not set
Actual value:
Value requested for CONFIG_VMSPLIT_2G not in final .config
Requested value: # CONFIG_VMSPLIT_2G is not set
Actual value:
Value requested for CONFIG_VMSPLIT_2G_OPT not in final .config
Requested value: # CONFIG_VMSPLIT_2G_OPT is not set
Actual value:
Value requested for CONFIG_VMSPLIT_1G not in final .config
Requested value: # CONFIG_VMSPLIT_1G is not set
Actual value:
Value requested for CONFIG_PAGE_OFFSET not in final .config
Requested value: CONFIG_PAGE_OFFSET=0xC0000000
Actual value:
Value requested for CONFIG_HIGHMEM not in final .config
Requested value: CONFIG_HIGHMEM=y
Actual value:
Value requested for CONFIG_X86_PAE not in final .config
Requested value: # CONFIG_X86_PAE is not set
Actual value:
Value requested for CONFIG_ARCH_FLATMEM_ENABLE not in final .config
Requested value: CONFIG_ARCH_FLATMEM_ENABLE=y
Actual value:
Value requested for CONFIG_ARCH_SELECT_MEMORY_MODEL not in final .config
Requested value: CONFIG_ARCH_SELECT_MEMORY_MODEL=y
Actual value:
Value requested for CONFIG_ILLEGAL_POINTER_VALUE not in final .config
Requested value: CONFIG_ILLEGAL_POINTER_VALUE=0
Actual value: CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000
Value requested for CONFIG_HIGHPTE not in final .config
Requested value: # CONFIG_HIGHPTE is not set
Actual value:
Value requested for CONFIG_COMPAT_VDSO not in final .config
Requested value: # CONFIG_COMPAT_VDSO is not set
Actual value:
Value requested for CONFIG_FUNCTION_PADDING_CFI not in final .config
Requested value: CONFIG_FUNCTION_PADDING_CFI=0
Actual value: CONFIG_FUNCTION_PADDING_CFI=11
Value requested for CONFIG_FUNCTION_PADDING_BYTES not in final .config
Requested value: CONFIG_FUNCTION_PADDING_BYTES=4
Actual value: CONFIG_FUNCTION_PADDING_BYTES=16
Value requested for CONFIG_APM not in final .config
Requested value: # CONFIG_APM is not set
Actual value:
Value requested for CONFIG_X86_POWERNOW_K6 not in final .config
Requested value: # CONFIG_X86_POWERNOW_K6 is not set
Actual value:
Value requested for CONFIG_X86_POWERNOW_K7 not in final .config
Requested value: # CONFIG_X86_POWERNOW_K7 is not set
Actual value:
Value requested for CONFIG_X86_GX_SUSPMOD not in final .config
Requested value: # CONFIG_X86_GX_SUSPMOD is not set
Actual value:
Value requested for CONFIG_X86_SPEEDSTEP_ICH not in final .config
Requested value: # CONFIG_X86_SPEEDSTEP_ICH is not set
Actual value:
Value requested for CONFIG_X86_SPEEDSTEP_SMI not in final .config
Requested value: # CONFIG_X86_SPEEDSTEP_SMI is not set
Actual value:
Value requested for CONFIG_X86_CPUFREQ_NFORCE2 not in final .config
Requested value: # CONFIG_X86_CPUFREQ_NFORCE2 is not set
Actual value:
Value requested for CONFIG_X86_LONGRUN not in final .config
Requested value: # CONFIG_X86_LONGRUN is not set
Actual value:
Value requested for CONFIG_X86_LONGHAUL not in final .config
Requested value: # CONFIG_X86_LONGHAUL is not set
Actual value:
Value requested for CONFIG_X86_E_POWERSAVER not in final .config
Requested value: # CONFIG_X86_E_POWERSAVER is not set
Actual value:
Value requested for CONFIG_PCI_GOBIOS not in final .config
Requested value: # CONFIG_PCI_GOBIOS is not set
Actual value:
Value requested for CONFIG_PCI_GOMMCONFIG not in final .config
Requested value: # CONFIG_PCI_GOMMCONFIG is not set
Actual value:
Value requested for CONFIG_PCI_GODIRECT not in final .config
Requested value: # CONFIG_PCI_GODIRECT is not set
Actual value:
Value requested for CONFIG_PCI_GOANY not in final .config
Requested value: CONFIG_PCI_GOANY=y
Actual value:
Value requested for CONFIG_PCI_BIOS not in final .config
Requested value: CONFIG_PCI_BIOS=y
Actual value:
Value requested for CONFIG_ISA not in final .config
Requested value: # CONFIG_ISA is not set
Actual value:
Value requested for CONFIG_SCx200 not in final .config
Requested value: # CONFIG_SCx200 is not set
Actual value:
Value requested for CONFIG_OLPC not in final .config
Requested value: # CONFIG_OLPC is not set
Actual value:
Value requested for CONFIG_ALIX not in final .config
Requested value: # CONFIG_ALIX is not set
Actual value:
Value requested for CONFIG_NET5501 not in final .config
Requested value: # CONFIG_NET5501 is not set
Actual value:
Value requested for CONFIG_GEOS not in final .config
Requested value: # CONFIG_GEOS is not set
Actual value:
Value requested for CONFIG_COMPAT_32 not in final .config
Requested value: CONFIG_COMPAT_32=y
Actual value:
Value requested for CONFIG_HAVE_ATOMIC_IOMAP not in final .config
Requested value: CONFIG_HAVE_ATOMIC_IOMAP=y
Actual value:
Value requested for CONFIG_ARCH_32BIT_OFF_T not in final .config
Requested value: CONFIG_ARCH_32BIT_OFF_T=y
Actual value:
Value requested for CONFIG_ARCH_WANT_IPC_PARSE_VERSION not in final .config
Requested value: CONFIG_ARCH_WANT_IPC_PARSE_VERSION=y
Actual value:
Value requested for CONFIG_MODULES_USE_ELF_REL not in final .config
Requested value: CONFIG_MODULES_USE_ELF_REL=y
Actual value:
Value requested for CONFIG_ARCH_MMAP_RND_BITS not in final .config
Requested value: CONFIG_ARCH_MMAP_RND_BITS=8
Actual value: CONFIG_ARCH_MMAP_RND_BITS=28
Value requested for CONFIG_CLONE_BACKWARDS not in final .config
Requested value: CONFIG_CLONE_BACKWARDS=y
Actual value:
Value requested for CONFIG_OLD_SIGSUSPEND3 not in final .config
Requested value: CONFIG_OLD_SIGSUSPEND3=y
Actual value:
Value requested for CONFIG_OLD_SIGACTION not in final .config
Requested value: CONFIG_OLD_SIGACTION=y
Actual value:
Value requested for CONFIG_ARCH_SPLIT_ARG64 not in final .config
Requested value: CONFIG_ARCH_SPLIT_ARG64=y
Actual value:
Value requested for CONFIG_FUNCTION_ALIGNMENT not in final .config
Requested value: CONFIG_FUNCTION_ALIGNMENT=4
Actual value: CONFIG_FUNCTION_ALIGNMENT=16
Value requested for CONFIG_SELECT_MEMORY_MODEL not in final .config
Requested value: CONFIG_SELECT_MEMORY_MODEL=y
Actual value:
Value requested for CONFIG_FLATMEM_MANUAL not in final .config
Requested value: CONFIG_FLATMEM_MANUAL=y
Actual value:
Value requested for CONFIG_SPARSEMEM_MANUAL not in final .config
Requested value: # CONFIG_SPARSEMEM_MANUAL is not set
Actual value:
Value requested for CONFIG_FLATMEM not in final .config
Requested value: CONFIG_FLATMEM=y
Actual value:
Value requested for CONFIG_SPARSEMEM_STATIC not in final .config
Requested value: CONFIG_SPARSEMEM_STATIC=y
Actual value:
Value requested for CONFIG_BOUNCE not in final .config
Requested value: CONFIG_BOUNCE=y
Actual value:
Value requested for CONFIG_KMAP_LOCAL not in final .config
Requested value: CONFIG_KMAP_LOCAL=y
Actual value:
Value requested for CONFIG_HOTPLUG_PCI_COMPAQ not in final .config
Requested value: # CONFIG_HOTPLUG_PCI_COMPAQ is not set
Actual value:
Value requested for CONFIG_HOTPLUG_PCI_IBM not in final .config
Requested value: # CONFIG_HOTPLUG_PCI_IBM is not set
Actual value:
Value requested for CONFIG_EFI_CAPSULE_QUIRK_QUARK_CSH not in final .config
Requested value: CONFIG_EFI_CAPSULE_QUIRK_QUARK_CSH=y
Actual value:
Value requested for CONFIG_PCH_PHUB not in final .config
Requested value: # CONFIG_PCH_PHUB is not set
Actual value:
Value requested for CONFIG_SCSI_NSP32 not in final .config
Requested value: # CONFIG_SCSI_NSP32 is not set
Actual value:
Value requested for CONFIG_PATA_CS5520 not in final .config
Requested value: # CONFIG_PATA_CS5520 is not set
Actual value:
Value requested for CONFIG_PATA_CS5530 not in final .config
Requested value: # CONFIG_PATA_CS5530 is not set
Actual value:
Value requested for CONFIG_PATA_CS5535 not in final .config
Requested value: # CONFIG_PATA_CS5535 is not set
Actual value:
Value requested for CONFIG_PATA_CS5536 not in final .config
Requested value: # CONFIG_PATA_CS5536 is not set
Actual value:
Value requested for CONFIG_PATA_SC1200 not in final .config
Requested value: # CONFIG_PATA_SC1200 is not set
Actual value:
Value requested for CONFIG_PCH_GBE not in final .config
Requested value: # CONFIG_PCH_GBE is not set
Actual value:
Value requested for CONFIG_INPUT_WISTRON_BTNS not in final .config
Requested value: # CONFIG_INPUT_WISTRON_BTNS is not set
Actual value:
Value requested for CONFIG_SERIAL_TIMBERDALE not in final .config
Requested value: # CONFIG_SERIAL_TIMBERDALE is not set
Actual value:
Value requested for CONFIG_SERIAL_PCH_UART not in final .config
Requested value: # CONFIG_SERIAL_PCH_UART is not set
Actual value:
Value requested for CONFIG_HW_RANDOM_GEODE not in final .config
Requested value: CONFIG_HW_RANDOM_GEODE=y
Actual value:
Value requested for CONFIG_SONYPI not in final .config
Requested value: # CONFIG_SONYPI is not set
Actual value:
Value requested for CONFIG_PC8736x_GPIO not in final .config
Requested value: # CONFIG_PC8736x_GPIO is not set
Actual value:
Value requested for CONFIG_NSC_GPIO not in final .config
Requested value: # CONFIG_NSC_GPIO is not set
Actual value:
Value requested for CONFIG_I2C_EG20T not in final .config
Requested value: # CONFIG_I2C_EG20T is not set
Actual value:
Value requested for CONFIG_SCx200_ACB not in final .config
Requested value: # CONFIG_SCx200_ACB is not set
Actual value:
Value requested for CONFIG_PTP_1588_CLOCK_PCH not in final .config
Requested value: # CONFIG_PTP_1588_CLOCK_PCH is not set
Actual value:
Value requested for CONFIG_SBC8360_WDT not in final .config
Requested value: # CONFIG_SBC8360_WDT is not set
Actual value:
Value requested for CONFIG_SBC7240_WDT not in final .config
Requested value: # CONFIG_SBC7240_WDT is not set
Actual value:
Value requested for CONFIG_MFD_CS5535 not in final .config
Requested value: # CONFIG_MFD_CS5535 is not set
Actual value:
Value requested for CONFIG_AGP_ALI not in final .config
Requested value: # CONFIG_AGP_ALI is not set
Actual value:
Value requested for CONFIG_AGP_ATI not in final .config
Requested value: # CONFIG_AGP_ATI is not set
Actual value:
Value requested for CONFIG_AGP_AMD not in final .config
Requested value: # CONFIG_AGP_AMD is not set
Actual value:
Value requested for CONFIG_AGP_NVIDIA not in final .config
Requested value: # CONFIG_AGP_NVIDIA is not set
Actual value:
Value requested for CONFIG_AGP_SWORKS not in final .config
Requested value: # CONFIG_AGP_SWORKS is not set
Actual value:
Value requested for CONFIG_AGP_EFFICEON not in final .config
Requested value: # CONFIG_AGP_EFFICEON is not set
Actual value:
Value requested for CONFIG_SND_CS5530 not in final .config
Requested value: # CONFIG_SND_CS5530 is not set
Actual value:
Value requested for CONFIG_SND_CS5535AUDIO not in final .config
Requested value: # CONFIG_SND_CS5535AUDIO is not set
Actual value:
Value requested for CONFIG_SND_SIS7019 not in final .config
Requested value: # CONFIG_SND_SIS7019 is not set
Actual value:
Value requested for CONFIG_LEDS_OT200 not in final .config
Requested value: # CONFIG_LEDS_OT200 is not set
Actual value:
Value requested for CONFIG_PCH_DMA not in final .config
Requested value: # CONFIG_PCH_DMA is not set
Actual value:
Value requested for CONFIG_CLKSRC_I8253 not in final .config
Requested value: CONFIG_CLKSRC_I8253=y
Actual value:
Value requested for CONFIG_MAILBOX not in final .config
Requested value: # CONFIG_MAILBOX is not set
Actual value: CONFIG_MAILBOX=y
Value requested for CONFIG_CRYPTO_SERPENT_SSE2_586 not in final .config
Requested value: # CONFIG_CRYPTO_SERPENT_SSE2_586 is not set
Actual value:
Value requested for CONFIG_CRYPTO_TWOFISH_586 not in final .config
Requested value: # CONFIG_CRYPTO_TWOFISH_586 is not set
Actual value:
Value requested for CONFIG_CRYPTO_DEV_GEODE not in final .config
Requested value: # CONFIG_CRYPTO_DEV_GEODE is not set
Actual value:
Value requested for CONFIG_CRYPTO_DEV_HIFN_795X not in final .config
Requested value: # CONFIG_CRYPTO_DEV_HIFN_795X is not set
Actual value:
Value requested for CONFIG_CRYPTO_LIB_POLY1305_RSIZE not in final .config
Requested value: CONFIG_CRYPTO_LIB_POLY1305_RSIZE=1
Actual value: CONFIG_CRYPTO_LIB_POLY1305_RSIZE=11
Value requested for CONFIG_AUDIT_GENERIC not in final .config
Requested value: CONFIG_AUDIT_GENERIC=y
Actual value:
Value requested for CONFIG_GENERIC_VDSO_32 not in final .config
Requested value: CONFIG_GENERIC_VDSO_32=y
Actual value:
Value requested for CONFIG_DEBUG_KMAP_LOCAL not in final .config
Requested value: # CONFIG_DEBUG_KMAP_LOCAL is not set
Actual value:
Value requested for CONFIG_DEBUG_HIGHMEM not in final .config
Requested value: # CONFIG_DEBUG_HIGHMEM is not set
Actual value:
Value requested for CONFIG_HAVE_DEBUG_STACKOVERFLOW not in final .config
Requested value: CONFIG_HAVE_DEBUG_STACKOVERFLOW=y
Actual value:
Value requested for CONFIG_DEBUG_STACKOVERFLOW not in final .config
Requested value: # CONFIG_DEBUG_STACKOVERFLOW is not set
Actual value:
Value requested for CONFIG_HAVE_FUNCTION_GRAPH_TRACER not in final .config
Requested value: CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
Actual value:
Value requested for CONFIG_HAVE_FUNCTION_GRAPH_RETVAL not in final .config
Requested value: CONFIG_HAVE_FUNCTION_GRAPH_RETVAL=y
Actual value:
Value requested for CONFIG_DRM_KUNIT_TEST not in final .config
Requested value: CONFIG_DRM_KUNIT_TEST=m
Actual value:
Value requested for CONFIG_DRM_XE_WERROR not in final .config
Requested value: CONFIG_DRM_XE_WERROR=y
Actual value:
Value requested for CONFIG_DRM_XE_DEBUG not in final .config
Requested value: CONFIG_DRM_XE_DEBUG=y
Actual value:
Value requested for CONFIG_DRM_XE_DEBUG_MEM not in final .config
Requested value: CONFIG_DRM_XE_DEBUG_MEM=y
Actual value:
Value requested for CONFIG_DRM_XE_KUNIT_TEST not in final .config
Requested value: CONFIG_DRM_XE_KUNIT_TEST=m
Actual value:
++ nproc
+ make -j48 ARCH=i386 olddefconfig
GEN Makefile
WARNING: unmet direct dependencies detected for FB_IOMEM_HELPERS
Depends on [n]: HAS_IOMEM [=y] && FB_CORE [=n]
Selected by [m]:
- DRM_XE_DISPLAY [=y] && HAS_IOMEM [=y] && DRM [=y] && DRM_XE [=m] && DRM_XE [=m]=m [=m] && HAS_IOPORT [=y]
#
# configuration written to .config
#
++ nproc
+ make -j48 ARCH=i386
SYNC include/config/auto.conf.cmd
GEN Makefile
WARNING: unmet direct dependencies detected for FB_IOMEM_HELPERS
Depends on [n]: HAS_IOMEM [=y] && FB_CORE [=n]
Selected by [m]:
- DRM_XE_DISPLAY [=y] && HAS_IOMEM [=y] && DRM [=y] && DRM_XE [=m] && DRM_XE [=m]=m [=m] && HAS_IOPORT [=y]
WARNING: unmet direct dependencies detected for FB_IOMEM_HELPERS
Depends on [n]: HAS_IOMEM [=y] && FB_CORE [=n]
Selected by [m]:
- DRM_XE_DISPLAY [=y] && HAS_IOMEM [=y] && DRM [=y] && DRM_XE [=m] && DRM_XE [=m]=m [=m] && HAS_IOPORT [=y]
WARNING: unmet direct dependencies detected for FB_IOMEM_HELPERS
Depends on [n]: HAS_IOMEM [=y] && FB_CORE [=n]
Selected by [m]:
- DRM_XE_DISPLAY [=y] && HAS_IOMEM [=y] && DRM [=y] && DRM_XE [=m] && DRM_XE [=m]=m [=m] && HAS_IOPORT [=y]
GEN Makefile
WRAP arch/x86/include/generated/uapi/asm/bpf_perf_event.h
SYSHDR arch/x86/include/generated/uapi/asm/unistd_32.h
WRAP arch/x86/include/generated/uapi/asm/errno.h
WRAP arch/x86/include/generated/uapi/asm/fcntl.h
UPD include/generated/uapi/linux/version.h
SYSHDR arch/x86/include/generated/uapi/asm/unistd_64.h
WRAP arch/x86/include/generated/uapi/asm/ioctl.h
SYSHDR arch/x86/include/generated/uapi/asm/unistd_x32.h
WRAP arch/x86/include/generated/uapi/asm/ioctls.h
SYSTBL arch/x86/include/generated/asm/syscalls_32.h
WRAP arch/x86/include/generated/uapi/asm/ipcbuf.h
WRAP arch/x86/include/generated/uapi/asm/param.h
WRAP arch/x86/include/generated/uapi/asm/poll.h
WRAP arch/x86/include/generated/uapi/asm/resource.h
WRAP arch/x86/include/generated/uapi/asm/socket.h
WRAP arch/x86/include/generated/uapi/asm/sockios.h
WRAP arch/x86/include/generated/uapi/asm/termbits.h
WRAP arch/x86/include/generated/uapi/asm/termios.h
WRAP arch/x86/include/generated/uapi/asm/types.h
UPD include/generated/compile.h
HOSTCC arch/x86/tools/relocs_32.o
HOSTCC arch/x86/tools/relocs_64.o
HOSTCC arch/x86/tools/relocs_common.o
WRAP arch/x86/include/generated/asm/early_ioremap.h
WRAP arch/x86/include/generated/asm/mcs_spinlock.h
WRAP arch/x86/include/generated/asm/mmzone.h
WRAP arch/x86/include/generated/asm/irq_regs.h
WRAP arch/x86/include/generated/asm/kmap_size.h
HOSTCC scripts/kallsyms
WRAP arch/x86/include/generated/asm/local64.h
HOSTCC scripts/sorttable
WRAP arch/x86/include/generated/asm/mmiowb.h
WRAP arch/x86/include/generated/asm/module.lds.h
HOSTCC scripts/asn1_compiler
WRAP arch/x86/include/generated/asm/rwonce.h
HOSTCC scripts/selinux/mdp/mdp
HOSTLD arch/x86/tools/relocs
UPD include/config/kernel.release
UPD include/generated/utsrelease.h
CC scripts/mod/empty.o
HOSTCC scripts/mod/mk_elfconfig
CC scripts/mod/devicetable-offsets.s
UPD scripts/mod/devicetable-offsets.h
MKELF scripts/mod/elfconfig.h
HOSTCC scripts/mod/modpost.o
HOSTCC scripts/mod/file2alias.o
HOSTCC scripts/mod/sumversion.o
HOSTCC scripts/mod/symsearch.o
HOSTLD scripts/mod/modpost
CC kernel/bounds.s
CHKSHA1 /workspace/kernel/include/linux/atomic/atomic-arch-fallback.h
CHKSHA1 /workspace/kernel/include/linux/atomic/atomic-instrumented.h
UPD include/generated/timeconst.h
CHKSHA1 /workspace/kernel/include/linux/atomic/atomic-long.h
UPD include/generated/bounds.h
CC arch/x86/kernel/asm-offsets.s
UPD include/generated/asm-offsets.h
CALL /workspace/kernel/scripts/checksyscalls.sh
LDS scripts/module.lds
HOSTCC usr/gen_init_cpio
CC init/main.o
CC init/do_mounts.o
CC certs/system_keyring.o
CC ipc/util.o
UPD init/utsversion-tmp.h
CC init/do_mounts_initrd.o
CC ipc/msgutil.o
CC security/commoncap.o
CC io_uring/io_uring.o
AR arch/x86/crypto/built-in.a
CC init/initramfs.o
CC arch/x86/realmode/init.o
CC ipc/msg.o
CC mm/filemap.o
CC security/lsm_syscalls.o
CC io_uring/opdef.o
AS arch/x86/entry/entry.o
CC init/calibrate.o
CC ipc/sem.o
CC arch/x86/pci/i386.o
AS arch/x86/entry/entry_32.o
AR arch/x86/net/built-in.a
CC arch/x86/power/cpu.o
AS arch/x86/lib/atomic64_cx8_32.o
CC security/integrity/iint.o
CC ipc/shm.o
CC arch/x86/video/video-common.o
AR arch/x86/entry/vsyscall/built-in.a
CC security/keys/gc.o
HOSTCC security/selinux/genheaders
CC arch/x86/events/amd/core.o
CC arch/x86/events/zhaoxin/core.o
CC block/partitions/core.o
AR arch/x86/platform/atom/built-in.a
AR drivers/cache/built-in.a
AS arch/x86/realmode/rm/header.o
CC arch/x86/mm/pat/set_memory.o
CC fs/nfs_common/nfsacl.o
CC arch/x86/virt/svm/cmdline.o
CC security/keys/key.o
CC arch/x86/events/intel/core.o
AR virt/lib/built-in.a
CC arch/x86/kernel/fpu/init.o
CC security/min_addr.o
CC lib/math/div64.o
CC fs/notify/dnotify/dnotify.o
CC net/core/sock.o
AR virt/built-in.a
CC sound/core/seq/seq.o
AR drivers/irqchip/built-in.a
AR arch/x86/platform/ce4100/built-in.a
CC arch/x86/entry/vdso/vma.o
AS arch/x86/lib/checksum_32.o
CC arch/x86/lib/cmdline.o
AS arch/x86/realmode/rm/trampoline_32.o
CC arch/x86/kernel/fpu/bugs.o
AR drivers/bus/mhi/built-in.a
CC arch/x86/platform/efi/memmap.o
AS arch/x86/realmode/rm/stack.o
CC kernel/sched/core.o
AR drivers/bus/built-in.a
CC init/init_task.o
CC fs/nfs_common/grace.o
AS arch/x86/realmode/rm/reboot.o
AR drivers/pwm/built-in.a
CC crypto/asymmetric_keys/asymmetric_type.o
AR drivers/leds/trigger/built-in.a
AS arch/x86/realmode/rm/wakeup_asm.o
AR arch/x86/virt/svm/built-in.a
AR drivers/leds/blink/built-in.a
CC arch/x86/realmode/rm/wakemain.o
AR drivers/leds/simple/built-in.a
AR arch/x86/virt/vmx/built-in.a
CC drivers/leds/led-core.o
AR arch/x86/virt/built-in.a
CC drivers/leds/led-class.o
AS arch/x86/lib/cmpxchg8b_emu.o
CC drivers/leds/led-triggers.o
CC arch/x86/lib/cpu.o
CC lib/math/gcd.o
GEN security/selinux/flask.h security/selinux/av_permissions.h
CC security/selinux/avc.o
CC arch/x86/realmode/rm/video-mode.o
CC lib/math/lcm.o
CC lib/math/int_log.o
CC arch/x86/entry/syscall_32.o
AS arch/x86/realmode/rm/copy.o
GEN usr/initramfs_data.cpio
AS arch/x86/realmode/rm/bioscall.o
COPY usr/initramfs_inc_data
AS usr/initramfs_data.o
CC arch/x86/realmode/rm/regs.o
CC arch/x86/kernel/fpu/core.o
CC lib/math/int_pow.o
AR usr/built-in.a
CC lib/math/int_sqrt.o
HOSTCC certs/extract-cert
CC arch/x86/realmode/rm/video-vga.o
CC fs/nfs_common/common.o
CC lib/math/reciprocal_div.o
CC arch/x86/realmode/rm/video-vesa.o
CC arch/x86/lib/delay.o
CC lib/math/rational.o
CC sound/core/seq/seq_lock.o
CC crypto/api.o
CC arch/x86/realmode/rm/video-bios.o
AR arch/x86/video/built-in.a
CC security/selinux/hooks.o
PASYMS arch/x86/realmode/rm/pasyms.h
CC sound/core/sound.o
CC arch/x86/events/core.o
CERT certs/x509_certificate_list
CERT certs/signing_key.x509
CC security/integrity/integrity_audit.o
AS certs/system_certificates.o
CC crypto/asymmetric_keys/restrict.o
LDS arch/x86/realmode/rm/realmode.lds
CC block/partitions/msdos.o
CC kernel/sched/fair.o
AR certs/built-in.a
LD arch/x86/realmode/rm/realmode.elf
CC net/ethernet/eth.o
CC crypto/cipher.o
RELOCS arch/x86/realmode/rm/realmode.relocs
CC kernel/sched/build_policy.o
OBJCOPY arch/x86/realmode/rm/realmode.bin
AS arch/x86/realmode/rmpiggy.o
CC arch/x86/pci/init.o
CC fs/iomap/trace.o
CC arch/x86/entry/vdso/extable.o
AR sound/i2c/other/built-in.a
AR arch/x86/realmode/built-in.a
AR sound/i2c/built-in.a
CC kernel/sched/build_utility.o
CC ipc/syscall.o
AR fs/notify/dnotify/built-in.a
CC arch/x86/events/intel/bts.o
CC arch/x86/mm/init.o
CC crypto/compress.o
CC fs/notify/inotify/inotify_fsnotify.o
CC arch/x86/platform/efi/quirks.o
AS arch/x86/lib/getuser.o
CC arch/x86/power/hibernate_32.o
GEN arch/x86/lib/inat-tables.c
CC arch/x86/events/amd/lbr.o
CC arch/x86/lib/insn-eval.o
AR arch/x86/events/zhaoxin/built-in.a
AR drivers/leds/built-in.a
AR fs/notify/fanotify/built-in.a
CC security/keys/keyring.o
CC drivers/pci/msi/pcidev_msi.o
AR lib/math/built-in.a
CC sound/core/seq/seq_clientmgr.o
CC lib/crypto/mpi/generic_mpih-lshift.o
CC lib/crypto/memneq.o
CC drivers/pci/pcie/portdrv.o
AR drivers/pci/pwrctrl/built-in.a
CC arch/x86/pci/pcbios.o
CC fs/iomap/iter.o
AR fs/nfs_common/built-in.a
CC arch/x86/lib/insn.o
CC block/bdev.o
CC crypto/asymmetric_keys/signature.o
CC init/version.o
CC block/partitions/efi.o
CC kernel/locking/mutex.o
CC drivers/pci/msi/api.o
AR net/802/built-in.a
CC mm/mempool.o
CC fs/notify/inotify/inotify_user.o
AR arch/x86/platform/geode/built-in.a
CC ipc/ipc_sysctl.o
CC security/selinux/selinuxfs.o
CC arch/x86/kernel/fpu/regset.o
CC arch/x86/pci/mmconfig_32.o
CC drivers/video/console/dummycon.o
CC drivers/video/console/vgacon.o
AR security/integrity/built-in.a
CC arch/x86/events/intel/ds.o
CC arch/x86/mm/pat/memtype.o
CC crypto/asymmetric_keys/public_key.o
AR init/built-in.a
CC net/core/request_sock.o
CC net/core/skbuff.o
LDS arch/x86/entry/vdso/vdso32/vdso32.lds
AS arch/x86/power/hibernate_asm_32.o
AS arch/x86/entry/vdso/vdso32/note.o
CC lib/crypto/mpi/generic_mpih-mul1.o
CC fs/notify/fsnotify.o
AS arch/x86/entry/vdso/vdso32/system_call.o
CC arch/x86/power/hibernate.o
AS arch/x86/entry/vdso/vdso32/sigreturn.o
CC arch/x86/entry/vdso/vdso32/vclock_gettime.o
CC arch/x86/mm/pat/memtype_interval.o
CC drivers/pci/msi/msi.o
CC sound/core/seq/seq_memory.o
CC arch/x86/platform/efi/efi.o
CC ipc/mqueue.o
CC net/sched/sch_generic.o
CC arch/x86/events/amd/ibs.o
CC arch/x86/events/amd/uncore.o
CC arch/x86/lib/kaslr.o
CC net/sched/sch_mq.o
CC drivers/pci/pcie/rcec.o
CC arch/x86/kernel/fpu/signal.o
CC arch/x86/events/intel/knc.o
CC lib/zlib_inflate/inffast.o
CC fs/iomap/buffered-io.o
CC arch/x86/lib/memcpy_32.o
CC lib/zlib_deflate/deflate.o
CC lib/lzo/lzo1x_compress.o
AS arch/x86/lib/memmove_32.o
CC arch/x86/lib/misc.o
CC arch/x86/pci/direct.o
CC lib/zlib_inflate/inflate.o
CC arch/x86/lib/pc-conf-reg.o
AR net/ethernet/built-in.a
CC lib/lz4/lz4_decompress.o
AR block/partitions/built-in.a
CC arch/x86/entry/vdso/vdso32/vgetcpu.o
CC security/keys/keyctl.o
CC lib/zstd/zstd_decompress_module.o
ASN.1 crypto/asymmetric_keys/x509.asn1.[ch]
ASN.1 crypto/asymmetric_keys/x509_akid.asn1.[ch]
CC lib/crypto/mpi/generic_mpih-mul2.o
CC crypto/asymmetric_keys/x509_loader.o
CC drivers/pci/msi/irqdomain.o
CC arch/x86/mm/init_32.o
AR arch/x86/power/built-in.a
AS arch/x86/lib/putuser.o
AR fs/notify/inotify/built-in.a
CC fs/notify/notification.o
CC kernel/locking/semaphore.o
CC arch/x86/events/probe.o
HOSTCC arch/x86/entry/vdso/vdso2c
AS arch/x86/lib/retpoline.o
CC security/selinux/netlink.o
CC arch/x86/lib/string_32.o
CC block/fops.o
CC crypto/asymmetric_keys/x509_public_key.o
CC arch/x86/lib/strstr_32.o
AR arch/x86/mm/pat/built-in.a
CC sound/core/init.o
CC arch/x86/lib/usercopy.o
CC lib/lzo/lzo1x_decompress_safe.o
AR drivers/video/console/built-in.a
CC sound/core/seq/seq_queue.o
CC drivers/video/backlight/backlight.o
AR drivers/idle/built-in.a
CC drivers/pci/pcie/bwctrl.o
AR sound/drivers/opl3/built-in.a
AR sound/drivers/opl4/built-in.a
AR sound/drivers/mpu401/built-in.a
CC lib/zstd/decompress/huf_decompress.o
AR sound/drivers/vx/built-in.a
CC crypto/algapi.o
AR sound/drivers/pcsp/built-in.a
AR sound/drivers/built-in.a
AR sound/isa/ad1816a/built-in.a
AR drivers/char/ipmi/built-in.a
AR sound/isa/ad1848/built-in.a
AR sound/isa/cs423x/built-in.a
CC drivers/pci/hotplug/pci_hotplug_core.o
AR sound/isa/es1688/built-in.a
AR sound/isa/galaxy/built-in.a
CC fs/notify/group.o
AR sound/isa/gus/built-in.a
AR sound/isa/msnd/built-in.a
CC sound/core/seq/seq_fifo.o
AR sound/isa/opti9xx/built-in.a
AR sound/isa/sb/built-in.a
CC arch/x86/mm/fault.o
CC arch/x86/platform/efi/efi_32.o
AR sound/isa/wavefront/built-in.a
CC block/bio.o
CC arch/x86/kernel/fpu/xstate.o
CC arch/x86/entry/vdso/vdso32-setup.o
AR sound/isa/wss/built-in.a
CC arch/x86/lib/usercopy_32.o
AR sound/isa/built-in.a
CC lib/crypto/mpi/generic_mpih-mul3.o
CC io_uring/kbuf.o
CC arch/x86/pci/mmconfig-shared.o
CC lib/zlib_inflate/infutil.o
CC crypto/scatterwalk.o
CC lib/zlib_deflate/deftree.o
CC ipc/namespace.o
CC fs/quota/dquot.o
CC mm/oom_kill.o
AR arch/x86/events/amd/built-in.a
CC arch/x86/lib/msr-smp.o
AR lib/lzo/built-in.a
ASN.1 crypto/asymmetric_keys/pkcs7.asn1.[ch]
CC crypto/asymmetric_keys/pkcs7_trust.o
CC lib/xz/xz_dec_syms.o
CC kernel/locking/rwsem.o
AR drivers/pci/msi/built-in.a
CC sound/core/seq/seq_prioq.o
VDSO arch/x86/entry/vdso/vdso32.so.dbg
CC drivers/pci/pcie/aspm.o
OBJCOPY arch/x86/entry/vdso/vdso32.so
VDSO2C arch/x86/entry/vdso/vdso-image-32.c
CC arch/x86/entry/vdso/vdso-image-32.o
CC arch/x86/events/utils.o
CC lib/zlib_inflate/inftrees.o
AS arch/x86/platform/efi/efi_stub_32.o
CC fs/quota/quota_v2.o
CC fs/quota/quota_tree.o
CC fs/quota/quota.o
CC arch/x86/kernel/cpu/mce/core.o
CC arch/x86/kernel/acpi/boot.o
CC arch/x86/lib/cache-smp.o
CC lib/zlib_inflate/inflate_syms.o
CC drivers/pci/hotplug/acpi_pcihp.o
CC security/security.o
CC security/keys/permission.o
CC net/netlink/af_netlink.o
CC lib/crypto/mpi/generic_mpih-rshift.o
CC arch/x86/events/intel/lbr.o
CC fs/notify/mark.o
AR arch/x86/entry/vdso/built-in.a
AR drivers/video/backlight/built-in.a
CC arch/x86/entry/common.o
CC lib/xz/xz_dec_stream.o
CC crypto/asymmetric_keys/pkcs7_verify.o
CC net/netlink/genetlink.o
AR drivers/video/fbdev/core/built-in.a
AR drivers/video/fbdev/omap/built-in.a
AR drivers/video/fbdev/omap2/omapfb/dss/built-in.a
AR net/bpf/built-in.a
CC arch/x86/lib/msr.o
AR lib/lz4/built-in.a
AR drivers/video/fbdev/omap2/omapfb/displays/built-in.a
CC arch/x86/platform/efi/runtime-map.o
CC security/lsm_audit.o
CC arch/x86/kernel/apic/apic.o
AR drivers/video/fbdev/omap2/omapfb/built-in.a
AR drivers/pci/controller/dwc/built-in.a
CC lib/zlib_deflate/deflate_syms.o
AR drivers/video/fbdev/omap2/built-in.a
AR drivers/pci/controller/mobiveil/built-in.a
AR drivers/video/fbdev/built-in.a
AR drivers/pci/controller/plda/built-in.a
CC drivers/video/aperture.o
CC ipc/mq_sysctl.o
CC arch/x86/kernel/cpu/mce/severity.o
AR drivers/pci/controller/built-in.a
CC security/selinux/nlmsgtab.o
AR lib/zlib_inflate/built-in.a
CC arch/x86/kernel/kprobes/core.o
CC sound/core/seq/seq_timer.o
CC net/sched/sch_frag.o
CC net/sched/sch_api.o
CC arch/x86/pci/fixup.o
AR lib/zlib_deflate/built-in.a
CC crypto/asymmetric_keys/x509.asn1.o
CC arch/x86/pci/acpi.o
CC crypto/asymmetric_keys/x509_akid.asn1.o
CC fs/notify/fdinfo.o
CC kernel/locking/percpu-rwsem.o
CC crypto/asymmetric_keys/x509_cert_parser.o
CC lib/zstd/decompress/zstd_ddict.o
AR ipc/built-in.a
CC crypto/proc.o
CC net/netlink/policy.o
CC lib/xz/xz_dec_lzma2.o
CC lib/crypto/mpi/generic_mpih-sub1.o
CC lib/crypto/mpi/generic_mpih-add1.o
AR arch/x86/kernel/fpu/built-in.a
CC io_uring/rsrc.o
CC block/elevator.o
CC fs/iomap/direct-io.o
CC lib/zstd/decompress/zstd_decompress.o
AR drivers/pci/hotplug/built-in.a
CC arch/x86/mm/ioremap.o
CC arch/x86/kernel/apic/apic_common.o
CC security/keys/process_keys.o
CC security/selinux/netif.o
AS arch/x86/entry/thunk.o
AR arch/x86/platform/efi/built-in.a
AR arch/x86/platform/iris/built-in.a
AR arch/x86/entry/built-in.a
CC arch/x86/platform/intel/iosf_mbi.o
AR arch/x86/platform/intel-mid/built-in.a
CC security/selinux/netnode.o
CC arch/x86/mm/extable.o
AS arch/x86/lib/msr-reg.o
CC drivers/video/cmdline.o
CC arch/x86/lib/msr-reg-export.o
CC lib/zstd/decompress/zstd_decompress_block.o
CC lib/xz/xz_dec_bcj.o
CC drivers/pci/pcie/pme.o
CC arch/x86/events/intel/p4.o
CC arch/x86/kernel/acpi/sleep.o
CC crypto/asymmetric_keys/pkcs7.asn1.o
CC sound/core/seq/seq_system.o
CC crypto/asymmetric_keys/pkcs7_parser.o
CC arch/x86/kernel/kprobes/opt.o
CC kernel/power/qos.o
CC kernel/locking/spinlock.o
AR fs/notify/built-in.a
CC lib/crypto/mpi/mpicoder.o
CC kernel/locking/osq_lock.o
CC lib/crypto/mpi/mpi-add.o
CC lib/dim/dim.o
CC arch/x86/events/rapl.o
LDS arch/x86/kernel/vmlinux.lds
AS arch/x86/lib/hweight.o
CC block/blk-core.o
CC arch/x86/lib/iomem.o
CC mm/fadvise.o
CC lib/crypto/utils.o
CC arch/x86/events/intel/p6.o
CC kernel/power/main.o
CC net/core/datagram.o
AR sound/pci/ac97/built-in.a
AR sound/pci/ali5451/built-in.a
AR sound/pci/asihpi/built-in.a
AR sound/ppc/built-in.a
AR sound/pci/au88x0/built-in.a
AR sound/pci/aw2/built-in.a
CC arch/x86/pci/legacy.o
CC arch/x86/mm/mmap.o
AR sound/pci/ctxfi/built-in.a
AR sound/pci/ca0106/built-in.a
AR sound/pci/cs46xx/built-in.a
AR sound/pci/cs5535audio/built-in.a
CC arch/x86/pci/irq.o
AR sound/pci/lola/built-in.a
AR sound/pci/lx6464es/built-in.a
AR sound/pci/echoaudio/built-in.a
CC kernel/locking/qspinlock.o
AR sound/pci/emu10k1/built-in.a
CC arch/x86/events/msr.o
CC lib/dim/net_dim.o
CC sound/pci/hda/hda_bind.o
CC io_uring/notif.o
AR lib/xz/built-in.a
CC arch/x86/kernel/cpu/mce/genpool.o
AR arch/x86/platform/intel-quark/built-in.a
CC mm/maccess.o
CC arch/x86/lib/atomic64_32.o
CC crypto/aead.o
AR arch/x86/platform/intel/built-in.a
CC sound/core/seq/seq_ports.o
CC fs/quota/kqid.o
AR crypto/asymmetric_keys/built-in.a
CC arch/x86/lib/inat.o
AR arch/x86/platform/olpc/built-in.a
AR arch/x86/platform/scx200/built-in.a
AS arch/x86/kernel/head_32.o
AR arch/x86/platform/ts5500/built-in.a
CC lib/crypto/mpi/mpi-bit.o
AR arch/x86/platform/uv/built-in.a
CC drivers/video/nomodeset.o
CC security/keys/request_key.o
AR arch/x86/platform/built-in.a
CC sound/core/memory.o
CC net/sched/sch_blackhole.o
CC lib/fonts/fonts.o
CC fs/iomap/fiemap.o
CC drivers/acpi/acpica/dsargs.o
AS arch/x86/kernel/acpi/wakeup_32.o
CC drivers/acpi/acpica/dscontrol.o
AR arch/x86/lib/built-in.a
AR drivers/pci/pcie/built-in.a
CC arch/x86/mm/pgtable.o
CC arch/x86/kernel/acpi/cstate.o
AR arch/x86/lib/lib.a
AR drivers/pci/switch/built-in.a
CC drivers/pci/access.o
CC fs/quota/netlink.o
CC lib/zstd/zstd_common_module.o
CC arch/x86/kernel/apic/apic_noop.o
CC lib/crypto/mpi/mpi-cmp.o
CC kernel/printk/printk.o
CC security/device_cgroup.o
CC drivers/pnp/pnpacpi/core.o
AR arch/x86/kernel/kprobes/built-in.a
CC kernel/locking/rtmutex_api.o
AR drivers/amba/built-in.a
CC drivers/pnp/pnpacpi/rsparser.o
CC sound/core/control.o
CC mm/page-writeback.o
CC io_uring/tctx.o
AR kernel/sched/built-in.a
CC security/selinux/netport.o
CC drivers/video/hdmi.o
CC arch/x86/kernel/cpu/mtrr/mtrr.o
CC net/ethtool/ioctl.o
CC arch/x86/events/intel/pt.o
CC kernel/printk/printk_safe.o
CC lib/fonts/font_8x16.o
CC arch/x86/kernel/head32.o
CC lib/argv_split.o
CC drivers/acpi/acpica/dsdebug.o
CC arch/x86/kernel/cpu/mce/intel.o
CC drivers/pnp/core.o
CC net/sched/cls_api.o
CC sound/pci/hda/hda_codec.o
CC arch/x86/kernel/apic/ipi.o
AR drivers/acpi/pmic/built-in.a
CC drivers/pci/bus.o
CC net/ethtool/common.o
CC fs/iomap/seek.o
AR arch/x86/kernel/acpi/built-in.a
CC block/blk-sysfs.o
CC block/blk-flush.o
AR net/netlink/built-in.a
CC kernel/power/console.o
CC kernel/power/process.o
CC lib/crypto/mpi/mpi-sub-ui.o
CC sound/core/seq/seq_info.o
CC arch/x86/mm/physaddr.o
AR lib/fonts/built-in.a
CC lib/dim/rdma_dim.o
CC sound/pci/hda/hda_jack.o
CC crypto/geniv.o
CC block/blk-settings.o
CC drivers/acpi/acpica/dsfield.o
CC io_uring/filetable.o
CC sound/core/misc.o
CC security/keys/request_key_auth.o
CC block/blk-ioc.o
CC arch/x86/pci/common.o
CC fs/proc/task_mmu.o
CC net/ethtool/netlink.o
AR fs/quota/built-in.a
CC arch/x86/kernel/cpu/microcode/core.o
CC arch/x86/kernel/cpu/microcode/intel.o
CC security/selinux/status.o
CC arch/x86/mm/tlb.o
CC arch/x86/kernel/cpu/mce/amd.o
AR sound/pci/ice1712/built-in.a
CC fs/proc/inode.o
CC arch/x86/kernel/apic/vector.o
CC arch/x86/kernel/cpu/mtrr/if.o
AR lib/dim/built-in.a
AR drivers/video/built-in.a
CC crypto/lskcipher.o
CC fs/proc/root.o
AR drivers/pnp/pnpacpi/built-in.a
CC sound/pci/hda/hda_auto_parser.o
CC drivers/pnp/card.o
CC kernel/locking/qrwlock.o
CC fs/iomap/swapfile.o
CC drivers/acpi/acpica/dsinit.o
CC sound/core/seq/seq_dummy.o
CC arch/x86/kernel/cpu/mtrr/generic.o
CC arch/x86/kernel/apic/init.o
AR sound/pci/korg1212/built-in.a
CC lib/crypto/mpi/mpi-div.o
CC net/netfilter/core.o
CC drivers/pci/probe.o
CC net/core/stream.o
AR sound/pci/mixart/built-in.a
CC net/core/scm.o
CC net/ipv4/netfilter/nf_defrag_ipv4.o
CC drivers/pci/host-bridge.o
CC net/xfrm/xfrm_policy.o
CC mm/folio-compat.o
CC security/keys/user_defined.o
AR drivers/clk/actions/built-in.a
AR drivers/clk/analogbits/built-in.a
AR drivers/clk/bcm/built-in.a
AR drivers/clk/imgtec/built-in.a
AR drivers/clk/imx/built-in.a
AR drivers/clk/ingenic/built-in.a
AR drivers/clk/mediatek/built-in.a
AR drivers/clk/microchip/built-in.a
AR drivers/clk/mstar/built-in.a
CC drivers/acpi/acpica/dsmethod.o
AR drivers/clk/mvebu/built-in.a
CC drivers/dma/dw/core.o
CC lib/zstd/common/debug.o
AR drivers/clk/ralink/built-in.a
AR drivers/soc/apple/built-in.a
AR drivers/clk/renesas/built-in.a
AR drivers/clk/socfpga/built-in.a
CC lib/zstd/common/entropy_common.o
AR kernel/locking/built-in.a
CC io_uring/rw.o
AR drivers/soc/aspeed/built-in.a
AR drivers/soc/bcm/built-in.a
CC arch/x86/events/intel/uncore.o
CC net/ethtool/bitset.o
AR drivers/clk/sophgo/built-in.a
CC block/blk-map.o
CC net/ethtool/strset.o
CC drivers/acpi/acpica/dsmthdat.o
AR drivers/soc/fsl/built-in.a
AR drivers/clk/sprd/built-in.a
AR drivers/soc/fujitsu/built-in.a
CC drivers/virtio/virtio.o
AR drivers/clk/starfive/built-in.a
AR drivers/soc/hisilicon/built-in.a
AR drivers/clk/sunxi-ng/built-in.a
CC lib/crypto/chacha.o
CC kernel/power/suspend.o
AR drivers/soc/imx/built-in.a
AR sound/pci/nm256/built-in.a
CC drivers/virtio/virtio_ring.o
AR drivers/clk/ti/built-in.a
CC lib/zstd/common/error_private.o
CC arch/x86/pci/early.o
AR drivers/soc/ixp4xx/built-in.a
AR drivers/clk/versatile/built-in.a
AR drivers/soc/loongson/built-in.a
AR drivers/clk/xilinx/built-in.a
AR drivers/clk/built-in.a
CC mm/readahead.o
AR drivers/soc/mediatek/built-in.a
CC mm/swap.o
CC arch/x86/kernel/cpu/microcode/amd.o
AR drivers/soc/microchip/built-in.a
CC net/ipv4/netfilter/nf_reject_ipv4.o
AR drivers/soc/nuvoton/built-in.a
AR drivers/soc/pxa/built-in.a
AR sound/core/seq/built-in.a
AR drivers/soc/amlogic/built-in.a
CC sound/core/device.o
AR drivers/soc/qcom/built-in.a
CC lib/zstd/common/fse_decompress.o
CC net/ipv4/netfilter/ip_tables.o
AR drivers/soc/renesas/built-in.a
AR drivers/soc/rockchip/built-in.a
AR drivers/soc/sunxi/built-in.a
CC drivers/pnp/driver.o
CC net/ipv4/netfilter/iptable_filter.o
AR drivers/soc/ti/built-in.a
AR drivers/soc/versatile/built-in.a
AR drivers/soc/xilinx/built-in.a
CC net/ipv4/netfilter/iptable_mangle.o
AR drivers/soc/built-in.a
CC lib/crypto/mpi/mpi-mod.o
AR fs/iomap/built-in.a
CC security/selinux/ss/ebitmap.o
CC net/ipv4/netfilter/ipt_REJECT.o
CC arch/x86/pci/bus_numa.o
CC crypto/skcipher.o
CC arch/x86/mm/cpu_entry_area.o
CC security/keys/proc.o
CC drivers/acpi/acpica/dsobject.o
CC lib/crypto/mpi/mpi-mul.o
CC lib/crypto/mpi/mpih-cmp.o
CC kernel/printk/nbcon.o
CC sound/pci/hda/hda_sysfs.o
CC arch/x86/kernel/cpu/cacheinfo.o
CC net/ipv4/route.o
CC arch/x86/kernel/cpu/mtrr/cleanup.o
CC sound/core/info.o
CC lib/crypto/aes.o
CC fs/kernfs/mount.o
CC lib/zstd/common/zstd_common.o
CC drivers/pnp/resource.o
CC drivers/pci/remove.o
CC net/netfilter/nf_log.o
CC drivers/dma/dw/dw.o
CC drivers/acpi/acpica/dsopcode.o
AR lib/zstd/built-in.a
CC lib/bug.o
CC security/keys/sysctl.o
CC net/core/gen_stats.o
CC arch/x86/kernel/cpu/mce/threshold.o
CC arch/x86/kernel/apic/hw_nmi.o
CC block/blk-merge.o
AR sound/pci/oxygen/built-in.a
CC arch/x86/kernel/ebda.o
CC fs/proc/base.o
AR arch/x86/kernel/cpu/microcode/built-in.a
CC arch/x86/mm/maccess.o
CC net/unix/af_unix.o
CC net/sched/act_api.o
CC lib/crypto/mpi/mpih-div.o
CC arch/x86/mm/pgprot.o
AR sound/arm/built-in.a
CC arch/x86/pci/amd_bus.o
CC security/selinux/ss/hashtab.o
CC fs/proc/generic.o
CC net/ipv4/inetpeer.o
CC arch/x86/kernel/cpu/mtrr/amd.o
CC sound/pci/hda/hda_controller.o
CC kernel/power/hibernate.o
CC kernel/power/snapshot.o
CC kernel/power/swap.o
CC mm/truncate.o
CC drivers/acpi/acpica/dspkginit.o
CC net/sched/sch_fifo.o
CC kernel/printk/printk_ringbuffer.o
CC sound/core/isadma.o
CC net/ethtool/linkinfo.o
CC security/selinux/ss/symtab.o
CC arch/x86/kernel/cpu/scattered.o
CC kernel/power/user.o
CC io_uring/net.o
CC security/keys/keyctl_pkey.o
CC drivers/dma/dw/idma32.o
CC crypto/seqiv.o
CC net/xfrm/xfrm_state.o
CC crypto/echainiv.o
CC drivers/pci/pci.o
CC net/xfrm/xfrm_hash.o
CC fs/kernfs/inode.o
CC fs/kernfs/dir.o
CC arch/x86/events/intel/uncore_nhmex.o
CC security/selinux/ss/sidtab.o
CC sound/core/vmaster.o
CC arch/x86/events/intel/uncore_snb.o
CC [M] net/ipv4/netfilter/iptable_nat.o
CC arch/x86/kernel/apic/io_apic.o
CC net/netfilter/nf_queue.o
CC io_uring/poll.o
CC arch/x86/mm/pgtable_32.o
CC arch/x86/kernel/cpu/mtrr/cyrix.o
CC drivers/acpi/acpica/dsutils.o
CC security/selinux/ss/avtab.o
CC fs/sysfs/file.o
AR sound/sh/built-in.a
CC fs/sysfs/dir.o
CC drivers/virtio/virtio_anchor.o
CC drivers/pnp/manager.o
AR arch/x86/pci/built-in.a
CC lib/crypto/arc4.o
CC lib/crypto/mpi/mpih-mul.o
CC net/core/gen_estimator.o
CC arch/x86/kernel/cpu/topology_common.o
CC net/sched/cls_cgroup.o
AR arch/x86/kernel/cpu/mce/built-in.a
CC arch/x86/kernel/cpu/mtrr/centaur.o
CC kernel/printk/sysctl.o
CC crypto/ahash.o
CC fs/kernfs/file.o
CC drivers/pci/pci-driver.o
AR security/keys/built-in.a
CC drivers/dma/dw/acpi.o
CC sound/core/ctljack.o
CC drivers/tty/vt/vt_ioctl.o
CC lib/buildid.o
CC drivers/acpi/acpica/dswexec.o
CC drivers/dma/hsu/hsu.o
CC lib/crypto/mpi/mpi-pow.o
CC net/ethtool/linkmodes.o
CC arch/x86/mm/iomap_32.o
CC sound/pci/hda/hda_proc.o
CC drivers/tty/vt/vc_screen.o
CC mm/vmscan.o
AR drivers/dma/idxd/built-in.a
CC kernel/irq/irqdesc.o
CC fs/devpts/inode.o
CC drivers/virtio/virtio_pci_modern_dev.o
AR kernel/printk/built-in.a
CC drivers/acpi/dptf/int340x_thermal.o
CC drivers/pnp/support.o
CC kernel/irq/handle.o
CC block/blk-timeout.o
CC fs/sysfs/symlink.o
CC sound/core/jack.o
CC drivers/virtio/virtio_pci_legacy_dev.o
CC drivers/acpi/x86/apple.o
CC io_uring/eventfd.o
CC arch/x86/kernel/cpu/mtrr/legacy.o
CC kernel/rcu/update.o
CC drivers/acpi/acpica/dswload.o
CC arch/x86/events/intel/uncore_snbep.o
AR net/ipv4/netfilter/built-in.a
CC fs/proc/array.o
AR kernel/livepatch/built-in.a
CC mm/shrinker.o
CC drivers/pci/search.o
CC kernel/irq/manage.o
AR drivers/dma/dw/built-in.a
CC kernel/irq/spurious.o
CC arch/x86/mm/hugetlbpage.o
CC sound/pci/hda/hda_hwdep.o
CC security/selinux/ss/policydb.o
AR drivers/acpi/dptf/built-in.a
CC net/netfilter/nf_sockopt.o
CC fs/kernfs/symlink.o
CC kernel/rcu/sync.o
CC net/core/net_namespace.o
CC net/netfilter/utils.o
AR arch/x86/kernel/cpu/mtrr/built-in.a
CC arch/x86/kernel/cpu/topology_ext.o
CC lib/crypto/mpi/mpiutil.o
CC kernel/power/poweroff.o
CC drivers/pnp/interface.o
CC sound/core/hwdep.o
CC drivers/acpi/acpica/dswload2.o
AR drivers/dma/hsu/built-in.a
AR drivers/dma/amd/built-in.a
AR drivers/dma/mediatek/built-in.a
AR drivers/dma/qcom/built-in.a
CC kernel/rcu/srcutree.o
AR drivers/dma/stm32/built-in.a
CC net/sched/ematch.o
AR drivers/dma/ti/built-in.a
CC fs/sysfs/mount.o
CC drivers/acpi/x86/cmos_rtc.o
AR drivers/dma/xilinx/built-in.a
CC drivers/dma/dmaengine.o
AR fs/devpts/built-in.a
CC drivers/dma/virt-dma.o
CC crypto/shash.o
CC block/blk-lib.o
CC drivers/dma/acpi-dma.o
CC drivers/tty/vt/selection.o
CC net/ipv6/af_inet6.o
CC net/ipv6/netfilter/ip6_tables.o
CC drivers/virtio/virtio_pci_modern.o
AR kernel/power/built-in.a
CC drivers/tty/hvc/hvc_console.o
CC arch/x86/events/intel/uncore_discovery.o
CC net/ipv6/anycast.o
AR sound/synth/emux/built-in.a
AR sound/synth/built-in.a
CC net/ethtool/rss.o
AR sound/usb/misc/built-in.a
CC sound/core/timer.o
CC arch/x86/kernel/apic/msi.o
CC io_uring/uring_cmd.o
AR sound/usb/usx2y/built-in.a
AR sound/usb/caiaq/built-in.a
AR sound/usb/6fire/built-in.a
CC net/ipv4/protocol.o
AR sound/usb/hiface/built-in.a
AR sound/usb/bcd2000/built-in.a
AR sound/usb/built-in.a
CC arch/x86/events/intel/cstate.o
CC net/unix/garbage.o
CC arch/x86/kernel/cpu/topology_amd.o
CC net/xfrm/xfrm_input.o
CC net/xfrm/xfrm_output.o
CC drivers/tty/vt/keyboard.o
CC lib/crypto/gf128mul.o
CC drivers/acpi/acpica/dswscope.o
CC block/blk-mq.o
CC sound/pci/hda/hda_intel.o
CC arch/x86/mm/dump_pagetables.o
AR lib/crypto/mpi/built-in.a
CC drivers/tty/serial/8250/8250_core.o
CC lib/clz_tab.o
CC drivers/pnp/quirks.o
AR fs/kernfs/built-in.a
CC arch/x86/kernel/cpu/common.o
CC drivers/acpi/x86/lpss.o
CC drivers/acpi/x86/s2idle.o
CC kernel/dma/mapping.o
CC fs/proc/fd.o
CC net/ipv6/ip6_output.o
CC drivers/acpi/acpica/dswstate.o
CC drivers/acpi/acpica/evevent.o
CC kernel/entry/common.o
CC fs/sysfs/group.o
CC drivers/acpi/acpica/evgpe.o
CC kernel/module/main.o
CC kernel/module/strict_rwx.o
CC arch/x86/kernel/apic/probe_32.o
AR drivers/tty/hvc/built-in.a
CC kernel/module/kmod.o
CC crypto/akcipher.o
CC lib/crypto/blake2s.o
CC drivers/virtio/virtio_pci_common.o
AR net/sched/built-in.a
CC mm/shmem.o
CC net/netfilter/nfnetlink.o
CC io_uring/openclose.o
CC kernel/irq/resend.o
CC drivers/tty/serial/serial_core.o
CC security/selinux/ss/services.o
CC drivers/acpi/tables.o
AR sound/firewire/built-in.a
CC net/ipv4/ip_input.o
CC drivers/acpi/acpica/evgpeblk.o
CC net/ethtool/linkstate.o
CC drivers/pci/rom.o
AR drivers/dma/built-in.a
CC drivers/virtio/virtio_pci_legacy.o
CC drivers/virtio/virtio_pci_admin_legacy_io.o
CC net/core/secure_seq.o
CC arch/x86/mm/highmem_32.o
CC net/packet/af_packet.o
CC drivers/pnp/system.o
CC net/ipv6/netfilter/ip6table_filter.o
CC kernel/rcu/tree.o
CC crypto/sig.o
CC lib/crypto/blake2s-generic.o
AR arch/x86/kernel/apic/built-in.a
CC mm/util.o
CC net/unix/sysctl_net_unix.o
CC kernel/entry/syscall_user_dispatch.o
AR fs/sysfs/built-in.a
CC sound/core/hrtimer.o
CC drivers/tty/serial/8250/8250_platform.o
CC fs/proc/proc_tty.o
CC kernel/irq/chip.o
CC drivers/acpi/x86/utils.o
CC drivers/acpi/acpica/evgpeinit.o
CC drivers/tty/vt/vt.o
CC security/selinux/ss/conditional.o
CC kernel/rcu/rcu_segcblist.o
CC net/netfilter/nfnetlink_log.o
AR arch/x86/events/intel/built-in.a
AR arch/x86/events/built-in.a
CC crypto/kpp.o
CC drivers/tty/serial/serial_base_bus.o
CC net/ipv4/ip_fragment.o
CC net/ethtool/debug.o
CC net/core/flow_dissector.o
AR drivers/pnp/built-in.a
CC lib/crypto/sha1.o
CC net/xfrm/xfrm_sysctl.o
CC security/selinux/ss/mls.o
CC drivers/pci/setup-res.o
CC drivers/acpi/osi.o
AR arch/x86/mm/built-in.a
CC fs/netfs/buffered_read.o
CC net/netfilter/nf_conntrack_core.o
CC sound/core/pcm.o
AR sound/pci/hda/built-in.a
AR sound/pci/pcxhr/built-in.a
CC drivers/virtio/virtio_input.o
CC io_uring/sqpoll.o
AR sound/pci/riptide/built-in.a
CC drivers/acpi/acpica/evgpeutil.o
AR sound/pci/rme9652/built-in.a
AR sound/pci/trident/built-in.a
CC arch/x86/kernel/cpu/rdrand.o
AR kernel/entry/built-in.a
AR sound/pci/ymfpci/built-in.a
CC drivers/acpi/osl.o
AR sound/pci/vx222/built-in.a
AR sound/pci/built-in.a
CC net/ipv6/ip6_input.o
CC io_uring/xattr.o
CC net/ipv6/addrconf.o
CC net/ipv6/netfilter/ip6table_mangle.o
CC arch/x86/kernel/cpu/match.o
CC fs/proc/cmdline.o
CC kernel/irq/dummychip.o
CC fs/netfs/buffered_write.o
CC net/core/sysctl_net_core.o
CC lib/crypto/sha256.o
CC kernel/module/tree_lookup.o
CC drivers/tty/serial/8250/8250_pnp.o
CC drivers/acpi/x86/blacklist.o
AR net/dsa/built-in.a
CC arch/x86/kernel/platform-quirks.o
AR net/unix/built-in.a
CC fs/proc/consoles.o
CC net/xfrm/xfrm_replay.o
CC drivers/acpi/acpica/evglock.o
CC mm/mmzone.o
COPY drivers/tty/vt/defkeymap.c
CC drivers/pci/irq.o
CC block/blk-mq-tag.o
AR drivers/tty/ipwireless/built-in.a
CC fs/ext4/balloc.o
CC drivers/virtio/virtio_dma_buf.o
CC arch/x86/kernel/cpu/bugs.o
ASN.1 crypto/rsapubkey.asn1.[ch]
ASN.1 crypto/rsaprivkey.asn1.[ch]
CC crypto/rsa.o
CC drivers/acpi/acpica/evhandler.o
CC kernel/irq/devres.o
CC drivers/tty/vt/consolemap.o
CC net/ipv6/addrlabel.o
AR drivers/acpi/x86/built-in.a
CC net/ethtool/wol.o
CC kernel/time/time.o
CC lib/cmdline.o
CC kernel/futex/core.o
CC kernel/cgroup/cgroup.o
CC arch/x86/kernel/cpu/aperfmperf.o
AR lib/crypto/built-in.a
CC kernel/dma/direct.o
CC arch/x86/kernel/cpu/cpuid-deps.o
CC kernel/module/kallsyms.o
CC mm/vmstat.o
CC lib/cpumask.o
CC sound/core/pcm_native.o
CC net/ipv6/route.o
CC fs/proc/cpuinfo.o
CC drivers/tty/serial/serial_ctrl.o
CC drivers/tty/serial/8250/8250_rsa.o
CC drivers/tty/serial/8250/8250_port.o
CC drivers/acpi/acpica/evmisc.o
CC fs/jbd2/transaction.o
CC net/ipv4/ip_forward.o
CC kernel/irq/autoprobe.o
AR drivers/virtio/built-in.a
CC fs/netfs/direct_read.o
CC kernel/cgroup/rstat.o
CC drivers/pci/vpd.o
CC kernel/dma/ops_helpers.o
CC fs/proc/devices.o
CC crypto/rsa_helper.o
CC kernel/futex/syscalls.o
CC net/ipv6/netfilter/nf_defrag_ipv6_hooks.o
CC kernel/trace/trace_clock.o
AR sound/sparc/built-in.a
CC drivers/tty/serial/8250/8250_dma.o
CC drivers/char/hw_random/core.o
CC drivers/acpi/acpica/evregion.o
CC net/netfilter/nf_conntrack_standalone.o
CC drivers/char/hw_random/intel-rng.o
CC lib/ctype.o
CC kernel/irq/irqdomain.o
CC drivers/tty/serial/8250/8250_dwlib.o
CC net/xfrm/xfrm_device.o
CC kernel/module/procfs.o
CC lib/dec_and_lock.o
CC lib/decompress.o
CC lib/decompress_bunzip2.o
CC security/selinux/ss/context.o
CC arch/x86/kernel/cpu/umwait.o
CC crypto/rsa-pkcs1pad.o
CC net/ethtool/features.o
CC io_uring/nop.o
CC net/ipv6/netfilter/nf_conntrack_reasm.o
CC drivers/char/hw_random/amd-rng.o
CC sound/core/pcm_lib.o
CC fs/ramfs/inode.o
CC kernel/trace/ring_buffer.o
CC sound/core/pcm_misc.o
CC kernel/time/timer.o
CC sound/core/pcm_memory.o
CC fs/proc/interrupts.o
CC kernel/dma/remap.o
CC drivers/acpi/acpica/evrgnini.o
MKCAP arch/x86/kernel/cpu/capflags.c
CC net/core/dev.o
CC drivers/char/hw_random/geode-rng.o
CC block/blk-stat.o
HOSTCC drivers/tty/vt/conmakehash
CC fs/netfs/direct_write.o
CC drivers/pci/setup-bus.o
CC arch/x86/kernel/process_32.o
CC kernel/module/sysfs.o
CC block/blk-mq-sysfs.o
CC kernel/irq/proc.o
CC kernel/time/hrtimer.o
CC kernel/time/sleep_timeout.o
CC kernel/futex/pi.o
CC fs/proc/loadavg.o
CC fs/jbd2/commit.o
CC drivers/tty/vt/defkeymap.o
CONMK drivers/tty/vt/consolemap_deftbl.c
CC fs/ext4/bitmap.o
CC drivers/tty/tty_io.o
CC mm/backing-dev.o
CC drivers/acpi/acpica/evsci.o
CC drivers/char/agp/backend.o
CC crypto/rsassa-pkcs1.o
CC lib/decompress_inflate.o
CC net/ipv4/ip_options.o
CC fs/ext4/block_validity.o
AR kernel/dma/built-in.a
CC drivers/tty/serial/8250/8250_pcilib.o
CC io_uring/fs.o
CC block/blk-mq-cpumap.o
CC drivers/tty/vt/consolemap_deftbl.o
CC fs/ramfs/file-mmu.o
AR net/packet/built-in.a
AR drivers/tty/vt/built-in.a
CC fs/hugetlbfs/inode.o
CC drivers/tty/serial/serial_port.o
CC net/netfilter/nf_conntrack_expect.o
CC kernel/trace/trace.o
CC drivers/char/hw_random/via-rng.o
CC net/xfrm/xfrm_nat_keepalive.o
CC drivers/char/mem.o
CC security/selinux/netlabel.o
CC drivers/tty/serial/earlycon.o
CC net/ethtool/privflags.o
CC net/ipv6/ip6_fib.o
CC drivers/pci/vc.o
CC drivers/acpi/acpica/evxface.o
CC drivers/acpi/acpica/evxfevnt.o
CC fs/proc/meminfo.o
AR kernel/module/built-in.a
CC drivers/char/agp/generic.o
CC drivers/char/agp/isoch.o
CC lib/decompress_unlz4.o
CC kernel/irq/migration.o
CC sound/core/memalloc.o
AR drivers/char/hw_random/built-in.a
AR sound/spi/built-in.a
CC kernel/futex/requeue.o
CC fs/jbd2/recovery.o
CC fs/netfs/iterator.o
CC net/ipv6/netfilter/nf_reject_ipv6.o
CC arch/x86/kernel/cpu/powerflags.o
CC net/xfrm/xfrm_algo.o
CC crypto/acompress.o
CC drivers/char/agp/amd64-agp.o
CC net/sunrpc/auth_gss/auth_gss.o
CC block/blk-mq-sched.o
AR fs/ramfs/built-in.a
CC drivers/tty/serial/8250/8250_early.o
AR net/wireless/tests/built-in.a
CC net/wireless/core.o
AR net/mac80211/tests/built-in.a
CC net/mac80211/main.o
CC net/sunrpc/auth_gss/gss_generic_token.o
CC drivers/acpi/acpica/evxfgpe.o
AR drivers/iommu/amd/built-in.a
AR drivers/iommu/intel/built-in.a
AR drivers/iommu/arm/arm-smmu/built-in.a
AR drivers/iommu/arm/arm-smmu-v3/built-in.a
CC fs/ext4/dir.o
AR drivers/iommu/arm/built-in.a
CC net/ipv6/netfilter/ip6t_ipv6header.o
AR drivers/iommu/iommufd/built-in.a
CC net/wireless/sysfs.o
AR drivers/iommu/riscv/built-in.a
CC drivers/iommu/iommu.o
CC kernel/irq/cpuhotplug.o
CC io_uring/splice.o
CC lib/decompress_unlzma.o
AR kernel/rcu/built-in.a
CC net/sunrpc/clnt.o
CC net/mac80211/status.o
CC mm/mm_init.o
CC net/sunrpc/xprt.o
CC net/ipv6/ipv6_sockglue.o
CC kernel/futex/waitwake.o
CC fs/proc/stat.o
CC kernel/time/timekeeping.o
CC kernel/time/ntp.o
CC net/ethtool/rings.o
CC sound/core/pcm_timer.o
CC drivers/acpi/acpica/evxfregn.o
CC drivers/pci/mmap.o
CC net/ipv4/ip_output.o
CC drivers/tty/serial/8250/8250_exar.o
CC kernel/bpf/core.o
CC drivers/acpi/acpica/exconcat.o
CC net/netfilter/nf_conntrack_helper.o
CC kernel/time/clocksource.o
CC crypto/scompress.o
AR security/selinux/built-in.a
AR security/built-in.a
CC drivers/char/random.o
CC net/ipv6/ndisc.o
CC drivers/char/agp/intel-agp.o
CC fs/netfs/locking.o
CC fs/fat/cache.o
CC fs/jbd2/checkpoint.o
CC fs/fat/dir.o
AR fs/hugetlbfs/built-in.a
CC fs/proc/uptime.o
CC kernel/irq/pm.o
CC drivers/char/misc.o
CC block/ioctl.o
CC net/xfrm/xfrm_user.o
CC io_uring/sync.o
CC io_uring/msg_ring.o
CC lib/decompress_unlzo.o
CC drivers/acpi/acpica/exconfig.o
CC fs/ext4/ext4_jbd2.o
CC sound/core/seq_device.o
CC drivers/pci/devres.o
CC drivers/acpi/utils.o
AR kernel/futex/built-in.a
CC fs/fat/fatent.o
CC net/mac80211/driver-ops.o
CC net/ipv6/netfilter/ip6t_REJECT.o
CC drivers/char/virtio_console.o
CC drivers/char/hpet.o
CC net/ethtool/channels.o
CC fs/proc/util.o
CC fs/jbd2/revoke.o
CC drivers/acpi/acpica/exconvrt.o
CC drivers/tty/serial/8250/8250_lpss.o
CC mm/percpu.o
CC drivers/char/agp/intel-gtt.o
CC crypto/algboss.o
CC net/netlabel/netlabel_user.o
CC kernel/irq/msi.o
CC net/rfkill/core.o
CC lib/decompress_unxz.o
CC fs/netfs/main.o
AR sound/core/built-in.a
AR sound/parisc/built-in.a
AR sound/pcmcia/vx/built-in.a
AR sound/pcmcia/pdaudiocf/built-in.a
AR sound/pcmcia/built-in.a
AR sound/mips/built-in.a
CC net/rfkill/input.o
CC drivers/acpi/acpica/excreate.o
AR sound/soc/built-in.a
AR sound/atmel/built-in.a
CC sound/hda/hda_bus_type.o
CC kernel/cgroup/namespace.o
AR sound/x86/built-in.a
CC net/netlabel/netlabel_kapi.o
CC block/genhd.o
CC mm/slab_common.o
CC drivers/pci/proc.o
CC io_uring/advise.o
CC net/netfilter/nf_conntrack_proto.o
CC kernel/time/jiffies.o
CC arch/x86/kernel/signal.o
CC drivers/iommu/iommu-traces.o
CC fs/proc/version.o
CC net/sunrpc/auth_gss/gss_mech_switch.o
CC kernel/cgroup/cgroup-v1.o
CC lib/decompress_unzstd.o
CC drivers/acpi/acpica/exdebug.o
CC fs/jbd2/journal.o
CC drivers/tty/serial/8250/8250_mid.o
CC kernel/cgroup/freezer.o
CC arch/x86/kernel/signal_32.o
CC kernel/time/timer_list.o
CC fs/fat/file.o
CC kernel/time/timeconv.o
CC drivers/pci/pci-sysfs.o
CC sound/hda/hdac_bus.o
AR net/ipv6/netfilter/built-in.a
CC net/ethtool/coalesce.o
CC net/ethtool/pause.o
AR net/rfkill/built-in.a
AR drivers/char/agp/built-in.a
CC fs/proc/softirqs.o
CC crypto/testmgr.o
CC crypto/cmac.o
CC crypto/hmac.o
CC drivers/acpi/acpica/exdump.o
CC drivers/pci/slot.o
CC kernel/trace/trace_output.o
CC drivers/tty/serial/8250/8250_pci.o
CC lib/dump_stack.o
CC net/ipv4/ip_sockglue.o
CC fs/ext4/extents.o
CC kernel/irq/affinity.o
CC drivers/char/nvram.o
CC io_uring/epoll.o
CC drivers/tty/serial/8250/8250_pericom.o
CC lib/earlycpio.o
CC net/core/dev_addr_lists.o
CC net/ipv4/inet_hashtables.o
CC net/ipv6/udp.o
CC fs/ext4/extents_status.o
CC net/sunrpc/auth_gss/svcauth_gss.o
CC drivers/acpi/acpica/exfield.o
CC net/wireless/radiotap.o
CC sound/hda/hdac_device.o
CC drivers/iommu/iommu-sysfs.o
CC net/wireless/util.o
CC fs/ext4/file.o
CC kernel/time/timecounter.o
CC block/ioprio.o
CC fs/proc/namespaces.o
CC kernel/time/alarmtimer.o
CC fs/isofs/namei.o
CC net/sunrpc/socklib.o
CC kernel/events/core.o
CC kernel/irq/matrix.o
CC net/netlabel/netlabel_domainhash.o
CC block/badblocks.o
CC fs/netfs/misc.o
AR kernel/bpf/built-in.a
CC fs/isofs/inode.o
CC fs/isofs/dir.o
CC crypto/crypto_null.o
CC drivers/acpi/acpica/exfldio.o
CC lib/extable.o
CC net/ethtool/eee.o
CC net/ipv4/inet_timewait_sock.o
CC net/netfilter/nf_conntrack_proto_generic.o
CC fs/fat/inode.o
CC arch/x86/kernel/cpu/topology.o
AR net/xfrm/built-in.a
CC drivers/acpi/reboot.o
CC net/ipv4/inet_connection_sock.o
CC kernel/cgroup/legacy_freezer.o
CC net/ethtool/tsinfo.o
AR drivers/char/built-in.a
CC net/netfilter/nf_conntrack_proto_tcp.o
CC net/netfilter/nf_conntrack_proto_udp.o
CC kernel/time/posix-timers.o
CC io_uring/statx.o
CC drivers/pci/pci-acpi.o
CC drivers/iommu/dma-iommu.o
CC io_uring/timeout.o
CC mm/compaction.o
CC lib/flex_proportions.o
CC drivers/pci/iomap.o
CC drivers/acpi/acpica/exmisc.o
CC net/mac80211/sta_info.o
CC fs/proc/self.o
CC drivers/pci/quirks.o
CC crypto/md5.o
CC drivers/acpi/acpica/exmutex.o
CC lib/idr.o
AR drivers/tty/serial/8250/built-in.a
AR drivers/tty/serial/built-in.a
CC sound/hda/hdac_sysfs.o
CC kernel/trace/trace_seq.o
CC arch/x86/kernel/cpu/proc.o
CC net/mac80211/wep.o
CC drivers/tty/n_tty.o
CC arch/x86/kernel/traps.o
CC fs/netfs/objects.o
CC block/blk-rq-qos.o
CC block/disk-events.o
CC kernel/cgroup/pids.o
CC drivers/pci/pci-label.o
CC net/ipv4/tcp.o
CC kernel/fork.o
CC net/netlabel/netlabel_addrlist.o
CC fs/proc/thread_self.o
CC drivers/acpi/acpica/exnames.o
AR kernel/irq/built-in.a
CC drivers/tty/tty_ioctl.o
CC kernel/trace/trace_stat.o
CC crypto/sha256_generic.o
CC drivers/iommu/iova.o
CC net/core/dst.o
CC fs/nfs/client.o
CC net/wireless/reg.o
CC net/ethtool/cabletest.o
CC lib/iomem_copy.o
CC fs/isofs/util.o
CC fs/isofs/rock.o
CC net/ethtool/tunnels.o
CC net/ipv6/udplite.o
CC arch/x86/kernel/cpu/feat_ctl.o
CC lib/irq_regs.o
AR fs/jbd2/built-in.a
CC net/sunrpc/auth_gss/gss_rpc_upcall.o
CC crypto/sha512_generic.o
CC fs/exportfs/expfs.o
CC drivers/acpi/nvs.o
CC kernel/cgroup/rdma.o
CC io_uring/fdinfo.o
CC fs/fat/misc.o
CC drivers/acpi/acpica/exoparg1.o
CC kernel/time/posix-cpu-timers.o
CC sound/hda/hdac_regmap.o
CC lib/is_single_threaded.o
CC sound/hda/hdac_controller.o
CC mm/show_mem.o
CC block/blk-ia-ranges.o
CC fs/proc/proc_sysctl.o
CC fs/fat/nfs.o
CC kernel/cgroup/cpuset.o
CC kernel/exec_domain.o
CC arch/x86/kernel/cpu/intel.o
CC fs/netfs/read_collect.o
CC net/netfilter/nf_conntrack_proto_icmp.o
CC arch/x86/kernel/idt.o
CC fs/nfs/dir.o
CC fs/netfs/read_pgpriv2.o
CC block/early-lookup.o
CC fs/lockd/clntlock.o
CC kernel/trace/trace_printk.o
CC fs/nls/nls_base.o
CC lib/klist.o
CC drivers/acpi/acpica/exoparg2.o
AR fs/exportfs/built-in.a
AR drivers/iommu/built-in.a
CC arch/x86/kernel/irq.o
CC net/core/netevent.o
CC net/netlabel/netlabel_mgmt.o
CC fs/isofs/export.o
CC net/sunrpc/xprtsock.o
CC drivers/tty/tty_ldisc.o
CC fs/fat/namei_vfat.o
CC fs/nfs/file.o
CC crypto/sha3_generic.o
CC lib/kobject.o
CC kernel/panic.o
CC net/ipv6/raw.o
CC arch/x86/kernel/cpu/tsx.o
AR fs/unicode/built-in.a
CC net/mac80211/aead_api.o
CC drivers/pci/vgaarb.o
CC lib/kobject_uevent.o
CC io_uring/cancel.o
CC fs/nls/nls_cp437.o
AR sound/xen/built-in.a
CC kernel/events/ring_buffer.o
CC drivers/acpi/acpica/exoparg3.o
CC net/ethtool/fec.o
CC block/bounce.o
CC sound/hda/hdac_stream.o
CC net/sunrpc/sched.o
CC net/sunrpc/auth_gss/gss_rpc_xdr.o
CC net/netlabel/netlabel_unlabeled.o
CC drivers/acpi/wakeup.o
CC fs/fat/namei_msdos.o
CC kernel/time/posix-clock.o
CC drivers/tty/tty_buffer.o
CC crypto/ecb.o
CC fs/nfs/getroot.o
CC kernel/trace/pid_list.o
CC arch/x86/kernel/cpu/intel_epb.o
CC kernel/events/callchain.o
CC fs/nls/nls_ascii.o
CC fs/isofs/joliet.o
CC fs/ext4/fsmap.o
CC drivers/acpi/acpica/exoparg6.o
CC net/core/neighbour.o
CC net/wireless/scan.o
CC arch/x86/kernel/irq_32.o
CC fs/netfs/read_retry.o
CC kernel/cpu.o
CC mm/interval_tree.o
CC net/netfilter/nf_conntrack_extend.o
CC fs/lockd/clntproc.o
CC fs/lockd/clntxdr.o
CC fs/nls/nls_iso8859-1.o
CC fs/proc/proc_net.o
CC crypto/cbc.o
CC arch/x86/kernel/cpu/amd.o
CC kernel/trace/trace_sched_switch.o
CC drivers/acpi/acpica/exprep.o
CC fs/netfs/write_collect.o
CC io_uring/waitid.o
CC kernel/trace/trace_nop.o
CC lib/logic_pio.o
CC net/core/rtnetlink.o
CC drivers/tty/tty_port.o
CC fs/isofs/compress.o
AR drivers/pci/built-in.a
CC arch/x86/kernel/dumpstack_32.o
CC kernel/time/itimer.o
CC net/ethtool/eeprom.o
CC net/ipv6/icmp.o
CC fs/nls/nls_utf8.o
CC block/bsg.o
CC net/ipv4/tcp_input.o
CC sound/hda/array.o
CC block/blk-cgroup.o
CC kernel/trace/blktrace.o
CC drivers/acpi/acpica/exregion.o
CC crypto/ctr.o
CC fs/autofs/init.o
AR fs/fat/built-in.a
CC net/sunrpc/auth_gss/trace.o
CC net/ethtool/stats.o
CC fs/autofs/inode.o
CC kernel/cgroup/misc.o
CC fs/netfs/write_issue.o
CC net/netlabel/netlabel_cipso_v4.o
CC mm/list_lru.o
AR fs/nls/built-in.a
CC net/ipv4/tcp_output.o
CC lib/maple_tree.o
CC fs/proc/kcore.o
CC io_uring/register.o
AR drivers/gpu/host1x/built-in.a
CC drivers/acpi/acpica/exresnte.o
CC crypto/gcm.o
CC net/netfilter/nf_conntrack_acct.o
CC kernel/cgroup/debug.o
CC net/sunrpc/auth_gss/gss_krb5_mech.o
AR drivers/gpu/drm/tests/built-in.a
CC arch/x86/kernel/cpu/hygon.o
CC drivers/tty/tty_mutex.o
AR drivers/gpu/drm/arm/built-in.a
CC sound/hda/hdmi_chmap.o
AR drivers/gpu/drm/clients/built-in.a
CC drivers/gpu/drm/display/drm_display_helper_mod.o
CC net/sunrpc/auth_gss/gss_krb5_seal.o
CC kernel/exit.o
CC net/sunrpc/auth.o
CC net/wireless/nl80211.o
AR fs/isofs/built-in.a
CC net/ethtool/phc_vclocks.o
CC net/core/utils.o
CC drivers/acpi/sleep.o
CC net/mac80211/wpa.o
CC kernel/trace/trace_events.o
CC drivers/acpi/acpica/exresolv.o
CC kernel/time/clockevents.o
CC net/ipv4/tcp_timer.o
CC fs/lockd/host.o
CC drivers/gpu/drm/display/drm_dp_dual_mode_helper.o
CC net/netfilter/nf_conntrack_seqadj.o
CC arch/x86/kernel/cpu/centaur.o
CC fs/9p/vfs_super.o
CC fs/autofs/root.o
CC mm/workingset.o
CC fs/ext4/fsync.o
CC kernel/time/tick-common.o
CC drivers/acpi/acpica/exresop.o
AR sound/virtio/built-in.a
CC kernel/softirq.o
CC drivers/tty/tty_ldsem.o
CC fs/proc/vmcore.o
AR kernel/cgroup/built-in.a
CC fs/9p/vfs_inode.o
CC drivers/connector/cn_queue.o
CC fs/nfs/inode.o
AR fs/netfs/built-in.a
CC net/ipv4/tcp_ipv4.o
CC drivers/base/power/sysfs.o
CC net/netlabel/netlabel_calipso.o
CC arch/x86/kernel/cpu/transmeta.o
CC net/ipv4/tcp_minisocks.o
CC crypto/ccm.o
CC block/blk-ioprio.o
CC net/ipv6/mcast.o
CC sound/hda/trace.o
CC fs/nfs/super.o
CC net/mac80211/scan.o
CC drivers/acpi/acpica/exserial.o
CC drivers/connector/connector.o
CC net/ethtool/mm.o
CC drivers/gpu/drm/ttm/ttm_tt.o
AR drivers/gpu/vga/built-in.a
CC kernel/events/hw_breakpoint.o
CC fs/lockd/svc.o
CC drivers/gpu/drm/display/drm_dp_helper.o
CC drivers/tty/tty_baudrate.o
CC net/ipv6/reassembly.o
CC mm/debug.o
AR fs/hostfs/built-in.a
CC drivers/block/loop.o
CC fs/autofs/symlink.o
CC drivers/base/power/generic_ops.o
CC drivers/acpi/acpica/exstore.o
CC io_uring/truncate.o
CC arch/x86/kernel/cpu/zhaoxin.o
CC io_uring/memmap.o
CC block/blk-iolatency.o
CC block/blk-iocost.o
CC kernel/time/tick-broadcast.o
CC net/netfilter/nf_conntrack_proto_icmpv6.o
CC fs/lockd/svclock.o
CC net/sunrpc/auth_gss/gss_krb5_unseal.o
CC fs/proc/kmsg.o
CC drivers/base/firmware_loader/builtin/main.o
CC drivers/acpi/acpica/exstoren.o
CC drivers/base/firmware_loader/main.o
CC drivers/tty/tty_jobctrl.o
CC crypto/aes_generic.o
CC drivers/base/power/common.o
CC net/ethtool/module.o
CC fs/9p/vfs_inode_dotl.o
CC arch/x86/kernel/cpu/vortex.o
CC net/core/link_watch.o
AR net/netlabel/built-in.a
CC sound/hda/hdac_component.o
CC sound/hda/hdac_i915.o
CC drivers/gpu/drm/ttm/ttm_bo.o
CC drivers/connector/cn_proc.o
CC fs/ext4/hash.o
CC fs/autofs/waitq.o
CC lib/memcat_p.o
AR drivers/base/firmware_loader/builtin/built-in.a
CC arch/x86/kernel/time.o
CC mm/gup.o
CC drivers/acpi/acpica/exstorob.o
CC io_uring/io-wq.o
CC arch/x86/kernel/cpu/perfctr-watchdog.o
CC net/ipv6/tcp_ipv6.o
CC fs/proc/page.o
CC fs/nfs/io.o
CC kernel/events/uprobes.o
CC kernel/time/tick-broadcast-hrtimer.o
CC drivers/gpu/drm/i915/i915_config.o
CC drivers/acpi/device_sysfs.o
CC arch/x86/kernel/ioport.o
CC drivers/base/power/qos.o
CC fs/debugfs/inode.o
CC drivers/base/power/runtime.o
CC drivers/tty/n_null.o
CC kernel/trace/trace_export.o
CC drivers/acpi/acpica/exsystem.o
CC drivers/tty/pty.o
CC sound/sound_core.o
CC lib/nmi_backtrace.o
CC crypto/crc32c_generic.o
CC drivers/gpu/drm/i915/i915_driver.o
CC sound/hda/intel-dsp-config.o
CC fs/9p/vfs_addr.o
CC kernel/time/tick-oneshot.o
AR drivers/base/firmware_loader/built-in.a
CC drivers/gpu/drm/display/drm_dp_mst_topology.o
CC net/sunrpc/auth_gss/gss_krb5_wrap.o
CC fs/ext4/ialloc.o
CC drivers/block/virtio_blk.o
CC fs/autofs/expire.o
CC net/netfilter/nf_conntrack_netlink.o
CC crypto/authenc.o
CC drivers/acpi/acpica/extrace.o
CC drivers/acpi/acpica/exutils.o
CC arch/x86/kernel/cpu/vmware.o
CC arch/x86/kernel/cpu/hypervisor.o
CC net/ethtool/cmis_fw_update.o
CC drivers/gpu/drm/ttm/ttm_bo_util.o
CC net/ethtool/cmis_cdb.o
CC net/ipv6/ping.o
CC fs/lockd/svcshare.o
AR fs/proc/built-in.a
CC net/core/filter.o
CC net/ipv4/tcp_cong.o
CC io_uring/futex.o
CC drivers/gpu/drm/i915/i915_drm_client.o
CC drivers/gpu/drm/i915/i915_getparam.o
AR drivers/connector/built-in.a
CC fs/9p/vfs_file.o
CC drivers/base/power/wakeirq.o
CC drivers/base/power/main.o
CC kernel/time/tick-sched.o
CC net/sunrpc/auth_gss/gss_krb5_crypto.o
CC drivers/tty/tty_audit.o
CC kernel/trace/trace_event_perf.o
CC net/sunrpc/auth_gss/gss_krb5_keys.o
CC drivers/acpi/acpica/hwacpi.o
CC arch/x86/kernel/dumpstack.o
CC sound/hda/intel-nhlt.o
CC net/ipv6/exthdrs.o
CC fs/debugfs/file.o
CC drivers/gpu/drm/i915/i915_ioctl.o
CC fs/nfs/direct.o
CC arch/x86/kernel/cpu/mshyperv.o
CC drivers/base/regmap/regmap.o
CC fs/ext4/indirect.o
CC net/netfilter/nf_conntrack_ftp.o
CC drivers/acpi/device_pm.o
CC kernel/trace/trace_events_filter.o
CC drivers/misc/eeprom/eeprom_93cx6.o
CC drivers/acpi/acpica/hwesleep.o
CC fs/autofs/dev-ioctl.o
CC net/mac80211/offchannel.o
AR drivers/mfd/built-in.a
AR drivers/misc/cb710/built-in.a
CC arch/x86/kernel/nmi.o
CC crypto/authencesn.o
CC drivers/tty/sysrq.o
CC fs/9p/vfs_dir.o
CC sound/hda/intel-sdw-acpi.o
AR drivers/nfc/built-in.a
CC fs/ext4/inline.o
CC drivers/gpu/drm/ttm/ttm_bo_vm.o
CC io_uring/napi.o
CC arch/x86/kernel/ldt.o
CC drivers/base/regmap/regcache.o
CC drivers/acpi/acpica/hwgpe.o
AR kernel/events/built-in.a
AR drivers/misc/eeprom/built-in.a
AR drivers/block/built-in.a
CC sound/last.o
CC net/ethtool/pse-pd.o
AR drivers/misc/lis3lv02d/built-in.a
AR drivers/misc/cardreader/built-in.a
CC net/sunrpc/auth_null.o
CC fs/lockd/svcproc.o
AR drivers/misc/keba/built-in.a
AR drivers/misc/built-in.a
CC mm/mmap_lock.o
CC net/wireless/mlme.o
CC net/wireless/ibss.o
CC kernel/resource.o
CC block/mq-deadline.o
CC fs/ext4/inode.o
CC fs/lockd/svcsubs.o
CC drivers/base/regmap/regcache-rbtree.o
CC kernel/time/timer_migration.o
CC drivers/gpu/drm/i915/i915_irq.o
CC drivers/acpi/acpica/hwregs.o
AR sound/hda/built-in.a
AR sound/built-in.a
AR drivers/gpu/drm/renesas/rcar-du/built-in.a
AR drivers/gpu/drm/renesas/rz-du/built-in.a
CC drivers/gpu/drm/display/drm_dsc_helper.o
CC arch/x86/kernel/cpu/debugfs.o
AR drivers/gpu/drm/renesas/built-in.a
CC net/core/sock_diag.o
AR drivers/base/test/built-in.a
CC net/core/dev_ioctl.o
AR fs/autofs/built-in.a
CC fs/lockd/mon.o
AR fs/debugfs/built-in.a
CC drivers/acpi/proc.o
AR net/sunrpc/auth_gss/built-in.a
CC net/ipv4/tcp_metrics.o
CC fs/9p/vfs_dentry.o
CC drivers/acpi/acpica/hwsleep.o
CC net/mac80211/ht.o
CC drivers/gpu/drm/ttm/ttm_module.o
CC drivers/base/power/wakeup.o
AR drivers/dax/hmem/built-in.a
AR drivers/dax/built-in.a
CC net/netfilter/nf_conntrack_irc.o
CC drivers/base/regmap/regcache-flat.o
CC drivers/base/component.o
CC kernel/trace/trace_events_trigger.o
AR drivers/tty/built-in.a
CC crypto/lzo.o
CC drivers/gpu/drm/display/drm_hdcp_helper.o
CC net/core/tso.o
CC net/9p/mod.o
CC net/core/sock_reuseport.o
CC net/ipv4/tcp_fastopen.o
CC mm/highmem.o
CC drivers/acpi/acpica/hwvalid.o
CC net/9p/client.o
CC net/ipv6/datagram.o
CC drivers/acpi/bus.o
CC arch/x86/kernel/cpu/bus_lock.o
CC net/sunrpc/auth_tls.o
CC net/ethtool/plca.o
CC lib/objpool.o
CC drivers/acpi/acpica/hwxface.o
CC drivers/gpu/drm/ttm/ttm_execbuf_util.o
CC fs/9p/v9fs.o
CC fs/nfs/pagelist.o
CC kernel/sysctl.o
CC net/netfilter/nf_conntrack_sip.o
CC drivers/gpu/drm/ttm/ttm_range_manager.o
AR io_uring/built-in.a
CC drivers/gpu/drm/ttm/ttm_resource.o
CC drivers/acpi/acpica/hwxfsleep.o
CC block/kyber-iosched.o
CC net/ethtool/phy.o
CC net/mac80211/agg-tx.o
CC kernel/capability.o
CC kernel/time/vsyscall.o
CC crypto/lzo-rle.o
CC net/ipv6/ip6_flowlabel.o
CC fs/tracefs/inode.o
CC net/wireless/sme.o
CC lib/plist.o
CC lib/radix-tree.o
CC net/wireless/chan.o
CC drivers/gpu/drm/i915/i915_mitigations.o
CC fs/lockd/trace.o
CC fs/tracefs/event_inode.o
CC net/ipv6/inet6_connection_sock.o
CC drivers/acpi/acpica/hwpci.o
CC drivers/base/regmap/regcache-maple.o
CC drivers/gpu/drm/display/drm_hdmi_helper.o
CC drivers/acpi/glue.o
CC mm/memory.o
CC kernel/time/timekeeping_debug.o
CC net/sunrpc/auth_unix.o
CC kernel/trace/trace_eprobe.o
CC arch/x86/kernel/cpu/capflags.o
CC net/ipv4/tcp_rate.o
AR arch/x86/kernel/cpu/built-in.a
CC drivers/base/power/wakeup_stats.o
AR drivers/gpu/drm/omapdrm/built-in.a
CC arch/x86/kernel/setup.o
CC net/sunrpc/svc.o
CC fs/9p/fid.o
CC lib/ratelimit.o
CC kernel/ptrace.o
CC fs/nfs/read.o
CC fs/9p/xattr.o
CC [M] fs/efivarfs/inode.o
CC drivers/acpi/acpica/nsaccess.o
CC fs/open.o
CC crypto/rng.o
AR drivers/gpu/drm/tilcdc/built-in.a
CC drivers/base/core.o
CC net/netfilter/nf_nat_core.o
CC drivers/gpu/drm/ttm/ttm_pool.o
CC drivers/dma-buf/dma-buf.o
CC kernel/time/namespace.o
CC fs/nfs/symlink.o
AR net/ethtool/built-in.a
CC mm/mincore.o
CC drivers/base/regmap/regmap-debugfs.o
CC drivers/gpu/drm/display/drm_scdc_helper.o
CC arch/x86/kernel/x86_init.o
CC drivers/base/power/trace.o
CC net/9p/error.o
CC lib/rbtree.o
CC fs/nfs/unlink.o
CC drivers/gpu/drm/i915/i915_module.o
CC net/netfilter/nf_nat_proto.o
AR fs/tracefs/built-in.a
AR drivers/gpu/drm/imx/built-in.a
CC drivers/gpu/drm/virtio/virtgpu_drv.o
AR drivers/cxl/core/built-in.a
AR drivers/cxl/built-in.a
CC net/ipv4/tcp_recovery.o
CC [M] fs/efivarfs/file.o
CC drivers/acpi/acpica/nsalloc.o
CC net/mac80211/agg-rx.o
CC fs/nfs/write.o
AR fs/9p/built-in.a
CC net/sunrpc/svcsock.o
CC fs/lockd/xdr.o
CC fs/nfs/namespace.o
CC block/blk-mq-pci.o
CC net/9p/protocol.o
CC kernel/user.o
CC lib/seq_buf.o
CC net/ipv6/udp_offload.o
CC crypto/drbg.o
CC crypto/jitterentropy.o
AR drivers/gpu/drm/i2c/built-in.a
AR kernel/time/built-in.a
CC crypto/jitterentropy-kcapi.o
CC drivers/gpu/drm/virtio/virtgpu_kms.o
CC crypto/ghash-generic.o
CC fs/ext4/ioctl.o
CC fs/ext4/mballoc.o
CC drivers/acpi/acpica/nsarguments.o
CC net/netfilter/nf_nat_helper.o
AR drivers/base/power/built-in.a
CC block/blk-mq-virtio.o
CC arch/x86/kernel/i8259.o
CC lib/siphash.o
CC kernel/trace/trace_kprobe.o
CC crypto/hash_info.o
AR drivers/gpu/drm/display/built-in.a
CC [M] fs/efivarfs/super.o
CC fs/read_write.o
CC mm/mlock.o
AR drivers/base/regmap/built-in.a
CC net/mac80211/vht.o
CC drivers/dma-buf/dma-fence.o
CC net/ipv4/tcp_ulp.o
CC net/sunrpc/svcauth.o
CC drivers/acpi/acpica/nsconvert.o
CC drivers/gpu/drm/i915/i915_params.o
CC net/wireless/ethtool.o
CC drivers/gpu/drm/ttm/ttm_device.o
CC drivers/gpu/drm/i915/i915_pci.o
CC net/wireless/mesh.o
CC net/mac80211/he.o
CC net/ipv4/tcp_offload.o
CC fs/nfs/mount_clnt.o
CC net/sunrpc/svcauth_unix.o
CC net/dns_resolver/dns_key.o
CC drivers/gpu/drm/virtio/virtgpu_gem.o
CC lib/string.o
CC net/core/fib_notifier.o
CC net/9p/trans_common.o
CC drivers/acpi/acpica/nsdump.o
CC net/sunrpc/addr.o
CC crypto/rsapubkey.asn1.o
CC arch/x86/kernel/irqinit.o
CC crypto/rsaprivkey.asn1.o
CC drivers/gpu/drm/i915/i915_scatterlist.o
CC block/blk-mq-debugfs.o
AR crypto/built-in.a
CC [M] fs/efivarfs/vars.o
CC lib/timerqueue.o
CC net/mac80211/s1g.o
CC fs/lockd/clnt4xdr.o
CC drivers/acpi/scan.o
CC net/ipv6/seg6.o
CC net/dns_resolver/dns_query.o
CC mm/mmap.o
CC drivers/gpu/drm/ttm/ttm_sys_manager.o
CC lib/union_find.o
CC drivers/acpi/acpica/nseval.o
CC lib/vsprintf.o
CC drivers/base/bus.o
CC drivers/macintosh/mac_hid.o
CC net/9p/trans_fd.o
CC fs/lockd/xdr4.o
CC drivers/gpu/drm/virtio/virtgpu_vram.o
CC fs/lockd/svc4proc.o
CC net/netfilter/nf_nat_masquerade.o
CC arch/x86/kernel/jump_label.o
CC fs/file_table.o
CC mm/mmu_gather.o
CC drivers/dma-buf/dma-fence-array.o
CC kernel/trace/error_report-traces.o
CC drivers/acpi/mipi-disco-img.o
CC drivers/acpi/acpica/nsinit.o
CC drivers/acpi/acpica/nsload.o
CC drivers/gpu/drm/ttm/ttm_backup.o
CC kernel/signal.o
CC drivers/gpu/drm/i915/i915_switcheroo.o
CC drivers/gpu/drm/virtio/virtgpu_display.o
CC drivers/acpi/resource.o
CC net/mac80211/ibss.o
LD [M] fs/efivarfs/efivarfs.o
CC net/netfilter/nf_nat_ftp.o
AR net/dns_resolver/built-in.a
CC net/sunrpc/rpcb_clnt.o
CC fs/lockd/procfs.o
CC block/blk-pm.o
AR drivers/macintosh/built-in.a
CC net/ipv6/fib6_notifier.o
CC net/9p/trans_virtio.o
CC drivers/gpu/drm/ttm/ttm_agp_backend.o
CC fs/nfs/nfstrace.o
CC net/core/xdp.o
CC drivers/dma-buf/dma-fence-chain.o
CC arch/x86/kernel/irq_work.o
CC drivers/acpi/acpica/nsnames.o
CC net/ipv4/tcp_plb.o
CC drivers/base/dd.o
CC drivers/base/syscore.o
CC drivers/acpi/acpi_processor.o
AR drivers/scsi/pcmcia/built-in.a
CC lib/win_minmax.o
CC drivers/scsi/scsi.o
AR drivers/nvme/common/built-in.a
AR drivers/nvme/host/built-in.a
AR drivers/nvme/target/built-in.a
AR drivers/nvme/built-in.a
CC block/holder.o
CC kernel/trace/power-traces.o
CC net/ipv4/datagram.o
CC drivers/acpi/acpica/nsobject.o
CC drivers/base/driver.o
CC drivers/dma-buf/dma-fence-unwrap.o
CC drivers/scsi/hosts.o
CC drivers/scsi/scsi_ioctl.o
CC net/ipv6/rpl.o
CC net/wireless/ap.o
CC drivers/gpu/drm/virtio/virtgpu_vq.o
AR drivers/gpu/drm/panel/built-in.a
CC net/mac80211/iface.o
CC net/wireless/trace.o
AR drivers/gpu/drm/bridge/analogix/built-in.a
AR drivers/gpu/drm/bridge/cadence/built-in.a
AR drivers/gpu/drm/bridge/imx/built-in.a
CC drivers/dma-buf/dma-resv.o
AR drivers/gpu/drm/bridge/synopsys/built-in.a
AR drivers/gpu/drm/bridge/built-in.a
CC kernel/sys.o
CC fs/super.o
CC drivers/acpi/processor_core.o
CC mm/mprotect.o
AR fs/lockd/built-in.a
AR drivers/gpu/drm/hisilicon/built-in.a
CC fs/ext4/migrate.o
CC drivers/gpu/drm/virtio/virtgpu_fence.o
CC net/ipv6/ioam6.o
AR drivers/gpu/drm/ttm/built-in.a
CC drivers/gpu/drm/virtio/virtgpu_object.o
CC drivers/acpi/acpica/nsparse.o
CC drivers/gpu/drm/i915/i915_sysfs.o
CC net/handshake/alert.o
CC net/netfilter/nf_nat_irc.o
CC fs/ext4/mmp.o
CC drivers/dma-buf/sync_file.o
AR block/built-in.a
CC net/wireless/ocb.o
CC net/sunrpc/timer.o
CC net/ipv4/raw.o
CC drivers/scsi/scsicam.o
CC fs/char_dev.o
CC fs/stat.o
CC fs/nfs/export.o
CC arch/x86/kernel/probe_roms.o
CC drivers/acpi/acpica/nspredef.o
CC drivers/base/class.o
CC kernel/trace/rpm-traces.o
CC drivers/gpu/drm/virtio/virtgpu_debugfs.o
CC net/ipv6/sysctl_net_ipv6.o
CC net/netfilter/nf_nat_sip.o
CC fs/exec.o
CC net/handshake/genl.o
CC lib/xarray.o
AR net/9p/built-in.a
CC fs/nfs/sysfs.o
CC net/sunrpc/xdr.o
CC drivers/ata/libata-core.o
CC drivers/acpi/acpica/nsprepkg.o
CC drivers/base/platform.o
CC net/wireless/pmsr.o
AR drivers/dma-buf/built-in.a
CC kernel/umh.o
CC kernel/trace/trace_dynevent.o
CC drivers/acpi/processor_pdc.o
CC net/core/flow_offload.o
CC kernel/workqueue.o
CC net/core/gro.o
CC drivers/scsi/scsi_error.o
CC drivers/gpu/drm/i915/i915_utils.o
CC net/handshake/netlink.o
CC mm/mremap.o
AR drivers/net/phy/mediatek/built-in.a
AR drivers/net/phy/qcom/built-in.a
CC drivers/net/phy/mdio-boardinfo.o
CC drivers/gpu/drm/i915/intel_clock_gating.o
CC arch/x86/kernel/sys_ia32.o
CC kernel/trace/trace_probe.o
CC drivers/acpi/acpica/nsrepair.o
CC drivers/scsi/scsi_lib.o
CC drivers/gpu/drm/virtio/virtgpu_plane.o
CC drivers/firewire/init_ohci1394_dma.o
CC drivers/ata/libata-scsi.o
CC net/core/netdev-genl.o
CC fs/nfs/fs_context.o
CC drivers/acpi/ec.o
CC kernel/pid.o
GEN net/wireless/shipped-certs.c
CC mm/msync.o
CC net/mac80211/link.o
CC drivers/acpi/dock.o
CC drivers/gpu/drm/i915/intel_cpu_info.o
CC net/ipv6/xfrm6_policy.o
CC drivers/cdrom/cdrom.o
CC net/sunrpc/sunrpc_syms.o
CC drivers/acpi/acpica/nsrepair2.o
AR drivers/auxdisplay/built-in.a
CC drivers/base/cpu.o
CC drivers/acpi/pci_root.o
CC net/devres.o
CC drivers/ata/libata-eh.o
CC net/handshake/request.o
CC fs/ext4/move_extent.o
CC net/ipv4/udp.o
CC drivers/net/phy/stubs.o
CC net/netfilter/x_tables.o
CC lib/lockref.o
CC arch/x86/kernel/ksysfs.o
CC drivers/base/firmware.o
CC mm/page_vma_mapped.o
AR drivers/gpu/drm/mxsfb/built-in.a
AR drivers/firewire/built-in.a
CC fs/pipe.o
CC net/sunrpc/cache.o
CC net/socket.o
CC net/sunrpc/rpc_pipe.o
CC net/ipv4/udplite.o
CC arch/x86/kernel/bootflag.o
CC drivers/acpi/acpica/nssearch.o
CC net/ipv6/xfrm6_state.o
CC drivers/gpu/drm/virtio/virtgpu_ioctl.o
CC drivers/base/init.o
CC drivers/net/phy/mdio_devres.o
CC lib/bcd.o
CC lib/sort.o
CC fs/namei.o
CC lib/parser.o
CC drivers/gpu/drm/i915/intel_device_info.o
AR drivers/gpu/drm/tiny/built-in.a
CC drivers/gpu/drm/i915/intel_memory_region.o
CC net/core/netdev-genl-gen.o
CC drivers/acpi/acpica/nsutils.o
CC drivers/acpi/acpica/nswalk.o
CC kernel/trace/trace_uprobe.o
CC drivers/acpi/pci_link.o
CC net/sysctl_net.o
AR drivers/gpu/drm/xlnx/built-in.a
CC net/sunrpc/sysfs.o
CC net/mac80211/rate.o
CC drivers/pcmcia/cs.o
AR drivers/net/pse-pd/built-in.a
CC drivers/net/phy/phy.o
AR drivers/gpu/drm/gud/built-in.a
CC lib/debug_locks.o
CC fs/fcntl.o
CC mm/pagewalk.o
CC fs/nfs/nfsroot.o
CC lib/random32.o
CC arch/x86/kernel/e820.o
CC drivers/base/map.o
CC drivers/net/mdio/acpi_mdio.o
CC fs/ext4/namei.o
CC fs/ioctl.o
CC kernel/task_work.o
CC net/core/gso.o
CC drivers/net/mdio/fwnode_mdio.o
CC drivers/acpi/acpica/nsxfeval.o
CC drivers/scsi/constants.o
CC drivers/acpi/pci_irq.o
CC drivers/gpu/drm/virtio/virtgpu_prime.o
CC net/handshake/tlshd.o
CC lib/bust_spinlocks.o
CC net/mac80211/michael.o
CC net/ipv6/xfrm6_input.o
CC drivers/base/devres.o
CC drivers/input/serio/serio.o
CC drivers/usb/common/common.o
AR drivers/cdrom/built-in.a
CC drivers/input/serio/i8042.o
CC arch/x86/kernel/pci-dma.o
CC fs/nfs/sysctl.o
CC net/ipv6/xfrm6_output.o
CC drivers/acpi/acpica/nsxfname.o
CC drivers/gpu/drm/i915/intel_pcode.o
CC fs/readdir.o
CC drivers/usb/core/usb.o
CC drivers/pcmcia/socket_sysfs.o
CC drivers/net/phy/phy-c45.o
AR drivers/usb/phy/built-in.a
CC mm/pgtable-generic.o
CC drivers/usb/common/debug.o
CC drivers/gpu/drm/i915/intel_region_ttm.o
CC fs/ext4/page-io.o
CC drivers/usb/core/hub.o
CC lib/kasprintf.o
CC fs/select.o
CC drivers/net/phy/phy-core.o
CC drivers/usb/mon/mon_main.o
CC drivers/input/keyboard/atkbd.o
CC net/netfilter/xt_tcpudp.o
CC drivers/scsi/scsi_lib_dma.o
CC drivers/acpi/acpi_apd.o
CC drivers/gpu/drm/virtio/virtgpu_trace_points.o
AR drivers/net/mdio/built-in.a
CC net/ipv6/xfrm6_protocol.o
CC drivers/acpi/acpica/nsxfobj.o
CC drivers/gpu/drm/virtio/virtgpu_submit.o
CC net/mac80211/tkip.o
CC drivers/input/serio/serport.o
AR drivers/usb/common/built-in.a
CC fs/dcache.o
CC net/ipv6/netfilter.o
CC net/mac80211/aes_cmac.o
CC kernel/extable.o
CC drivers/base/attribute_container.o
CC net/core/net-sysfs.o
CC lib/bitmap.o
CC mm/rmap.o
CC arch/x86/kernel/quirks.o
CC drivers/usb/core/hcd.o
CC net/handshake/trace.o
CC drivers/acpi/acpica/psargs.o
CC drivers/pcmcia/cardbus.o
CC fs/ext4/readpage.o
CC net/sunrpc/svc_xprt.o
CC kernel/trace/rethook.o
CC net/ipv4/udp_offload.o
CC drivers/input/serio/libps2.o
CC drivers/ata/libata-transport.o
CC fs/nfs/nfs3super.o
CC drivers/scsi/scsi_scan.o
CC drivers/usb/mon/mon_stat.o
CC drivers/rtc/lib.o
CC net/core/hotdata.o
CC drivers/rtc/class.o
CC drivers/base/transport_class.o
CC drivers/gpu/drm/i915/intel_runtime_pm.o
CC drivers/base/topology.o
GEN drivers/scsi/scsi_devinfo_tbl.c
CC lib/scatterlist.o
CC fs/inode.o
CC net/sunrpc/xprtmultipath.o
CC net/mac80211/aes_gmac.o
CC drivers/usb/core/urb.o
CC drivers/gpu/drm/i915/intel_sbi.o
CC drivers/acpi/acpica/psloop.o
CC drivers/acpi/acpi_platform.o
AR drivers/gpu/drm/virtio/built-in.a
CC arch/x86/kernel/kdebugfs.o
AR drivers/input/keyboard/built-in.a
CC drivers/scsi/scsi_devinfo.o
CC drivers/input/mouse/psmouse-base.o
CC drivers/input/mouse/synaptics.o
CC drivers/input/mouse/focaltech.o
CC drivers/pcmcia/ds.o
CC drivers/net/phy/phy_device.o
CC drivers/usb/core/message.o
CC drivers/base/container.o
CC drivers/usb/core/driver.o
CC drivers/usb/mon/mon_text.o
CC net/ipv4/arp.o
AR drivers/net/pcs/built-in.a
CC drivers/gpu/drm/i915/intel_step.o
AR kernel/trace/built-in.a
CC kernel/params.o
CC net/netfilter/xt_CONNSECMARK.o
CC drivers/input/mouse/alps.o
CC drivers/rtc/interface.o
AR drivers/input/serio/built-in.a
CC net/core/netdev_rx_queue.o
CC fs/attr.o
CC drivers/acpi/acpica/psobject.o
CC drivers/acpi/acpi_pnp.o
CC arch/x86/kernel/alternative.o
AR drivers/gpu/drm/solomon/built-in.a
CC lib/list_sort.o
CC drivers/ata/libata-trace.o
CC drivers/base/property.o
CC net/ipv6/proc.o
CC drivers/pcmcia/pcmcia_resource.o
AR drivers/input/joystick/built-in.a
CC fs/nfs/nfs3client.o
CC [M] drivers/gpu/drm/scheduler/sched_main.o
CC drivers/scsi/scsi_sysctl.o
CC [M] drivers/gpu/drm/scheduler/sched_fence.o
CC arch/x86/kernel/i8253.o
CC fs/bad_inode.o
CC drivers/rtc/nvmem.o
CC drivers/acpi/acpica/psopcode.o
CC mm/vmalloc.o
CC drivers/ata/libata-sata.o
CC net/core/net-procfs.o
AR net/handshake/built-in.a
CC drivers/base/cacheinfo.o
CC drivers/i2c/algos/i2c-algo-bit.o
CC drivers/i2c/busses/i2c-i801.o
CC drivers/pcmcia/cistpl.o
CC drivers/usb/mon/mon_bin.o
CC drivers/ata/libata-sff.o
CC drivers/input/mouse/byd.o
CC net/sunrpc/stats.o
CC net/ipv6/syncookies.o
CC lib/uuid.o
CC drivers/usb/core/config.o
CC fs/ext4/resize.o
CC fs/ext4/super.o
CC drivers/base/swnode.o
CC drivers/acpi/acpica/psopinfo.o
CC lib/iov_iter.o
CC drivers/gpu/drm/i915/intel_uncore.o
AR drivers/i2c/muxes/built-in.a
CC drivers/gpu/drm/i915/intel_uncore_trace.o
CC fs/file.o
HOSTCC drivers/gpu/drm/xe/xe_gen_wa_oob
AR drivers/net/ethernet/3com/built-in.a
CC drivers/net/ethernet/8390/ne2k-pci.o
CC drivers/scsi/scsi_proc.o
AR drivers/net/ethernet/adaptec/built-in.a
CC kernel/kthread.o
CC drivers/usb/host/pci-quirks.o
CC drivers/ata/libata-pmp.o
CC drivers/scsi/scsi_debugfs.o
CC net/netfilter/xt_NFLOG.o
GEN xe_wa_oob.c xe_wa_oob.h
CC drivers/usb/host/ehci-hcd.o
CC drivers/gpu/drm/drm_atomic.o
CC [M] drivers/gpu/drm/xe/xe_bb.o
CC net/mac80211/fils_aead.o
CC drivers/acpi/acpica/psparse.o
CC fs/nfs/nfs3proc.o
CC net/sunrpc/sysctl.o
CC drivers/usb/host/ehci-pci.o
CC arch/x86/kernel/hw_breakpoint.o
CC fs/ext4/symlink.o
CC drivers/pcmcia/pcmcia_cis.o
CC [M] drivers/gpu/drm/xe/xe_bo.o
CC net/mac80211/cfg.o
AR drivers/i2c/algos/built-in.a
CC drivers/rtc/dev.o
AR drivers/input/tablet/built-in.a
CC net/core/netpoll.o
AR drivers/net/ethernet/agere/built-in.a
CC net/ipv6/calipso.o
CC drivers/gpu/drm/i915/intel_wakeref.o
CC drivers/input/mouse/logips2pp.o
CC net/ipv4/icmp.o
CC arch/x86/kernel/tsc.o
CC drivers/acpi/acpica/psscope.o
AR drivers/usb/mon/built-in.a
CC drivers/usb/core/file.o
CC [M] drivers/gpu/drm/scheduler/sched_entity.o
CC [M] drivers/gpu/drm/xe/xe_bo_evict.o
CC drivers/net/phy/linkmode.o
CC drivers/pcmcia/rsrc_mgr.o
AR drivers/net/wireless/admtek/built-in.a
AR drivers/net/wireless/ath/built-in.a
CC drivers/base/auxiliary.o
AR drivers/net/wireless/atmel/built-in.a
CC drivers/scsi/scsi_trace.o
AR drivers/net/wireless/broadcom/built-in.a
CC drivers/acpi/acpica/pstree.o
AR drivers/net/wireless/intel/built-in.a
AR drivers/net/wireless/intersil/built-in.a
AR drivers/net/wireless/marvell/built-in.a
AR drivers/net/wireless/mediatek/built-in.a
AR drivers/i2c/busses/built-in.a
CC drivers/i2c/i2c-boardinfo.o
AR drivers/net/wireless/microchip/built-in.a
AR drivers/net/wireless/purelifi/built-in.a
AR drivers/net/wireless/quantenna/built-in.a
CC drivers/usb/core/buffer.o
AR drivers/net/ethernet/alacritech/built-in.a
AR drivers/net/wireless/ralink/built-in.a
CC net/mac80211/ethtool.o
AR drivers/net/wireless/realtek/built-in.a
CC net/netfilter/xt_SECMARK.o
AR drivers/net/wireless/rsi/built-in.a
AR drivers/net/wireless/silabs/built-in.a
AR drivers/net/usb/built-in.a
AR drivers/net/wireless/st/built-in.a
CC mm/vma.o
AR drivers/input/touchscreen/built-in.a
AR drivers/net/wireless/ti/built-in.a
AR drivers/net/wireless/zydas/built-in.a
AR drivers/i3c/built-in.a
CC drivers/base/devtmpfs.o
CC drivers/net/ethernet/8390/8390.o
CC drivers/base/module.o
AR drivers/net/wireless/virtual/built-in.a
AR drivers/net/wireless/built-in.a
CC drivers/acpi/power.o
CC net/wireless/shipped-certs.o
CC fs/filesystems.o
CC drivers/acpi/event.o
CC drivers/gpu/drm/i915/vlv_sideband.o
CC drivers/pcmcia/rsrc_nonstatic.o
CC drivers/acpi/acpica/psutils.o
CC drivers/rtc/proc.o
CC [M] drivers/gpu/drm/xe/xe_devcoredump.o
CC [M] drivers/gpu/drm/xe/xe_device.o
CC drivers/input/mouse/lifebook.o
AR drivers/input/misc/built-in.a
CC drivers/gpu/drm/i915/vlv_suspend.o
CC drivers/pcmcia/yenta_socket.o
CC fs/namespace.o
CC fs/nfs/nfs3xdr.o
CC [M] drivers/gpu/drm/xe/xe_device_sysfs.o
CC drivers/usb/host/ohci-hcd.o
CC kernel/sys_ni.o
CC lib/clz_ctz.o
LD [M] drivers/gpu/drm/scheduler/gpu-sched.o
CC drivers/ata/libata-acpi.o
CC mm/process_vm_access.o
CC drivers/net/phy/phy_link_topology.o
CC drivers/acpi/acpica/pswalk.o
CC drivers/acpi/acpica/psxface.o
CC drivers/i2c/i2c-core-base.o
CC drivers/acpi/evged.o
CC drivers/usb/core/sysfs.o
CC drivers/scsi/scsi_logging.o
CC drivers/base/auxiliary_sysfs.o
CC mm/page_alloc.o
CC drivers/input/input.o
CC drivers/input/input-compat.o
CC kernel/nsproxy.o
CC drivers/rtc/sysfs.o
CC arch/x86/kernel/tsc_msr.o
CC lib/bsearch.o
AR net/sunrpc/built-in.a
CC fs/ext4/sysfs.o
CC net/netfilter/xt_TCPMSS.o
CC drivers/acpi/acpica/rsaddr.o
CC drivers/input/mouse/trackpoint.o
CC drivers/ata/libata-pata-timings.o
CC drivers/gpu/drm/i915/soc/intel_dram.o
CC drivers/net/mii.o
CC drivers/gpu/drm/drm_atomic_uapi.o
CC arch/x86/kernel/io_delay.o
CC drivers/base/devcoredump.o
CC drivers/base/platform-msi.o
CC net/core/fib_rules.o
CC drivers/ata/ahci.o
CC net/ipv4/devinet.o
AR drivers/net/ethernet/8390/built-in.a
AR drivers/net/ethernet/alteon/built-in.a
AR drivers/net/ethernet/amazon/built-in.a
AR drivers/net/ethernet/amd/built-in.a
AR drivers/net/ethernet/aquantia/built-in.a
CC drivers/usb/core/endpoint.o
CC mm/page_frag_cache.o
CC drivers/ata/libahci.o
AR drivers/net/ethernet/arc/built-in.a
CC drivers/acpi/acpica/rscalc.o
CC drivers/net/phy/mdio_bus.o
AR drivers/net/ethernet/asix/built-in.a
CC net/ipv6/ah6.o
AR drivers/net/ethernet/atheros/built-in.a
CC drivers/usb/class/usblp.o
AR drivers/net/ethernet/cadence/built-in.a
CC drivers/scsi/scsi_pm.o
CC drivers/net/ethernet/broadcom/bnx2.o
AR drivers/net/ethernet/brocade/built-in.a
CC arch/x86/kernel/rtc.o
CC drivers/base/physical_location.o
CC lib/find_bit.o
CC drivers/rtc/rtc-mc146818-lib.o
CC [M] drivers/gpu/drm/xe/xe_dma_buf.o
CC net/mac80211/rx.o
CC fs/seq_file.o
CC drivers/net/loopback.o
AR drivers/net/ethernet/cavium/common/built-in.a
AR drivers/net/ethernet/cavium/thunder/built-in.a
AR drivers/net/ethernet/cavium/liquidio/built-in.a
CC drivers/input/mouse/cypress_ps2.o
AR drivers/net/ethernet/cavium/octeon/built-in.a
CC drivers/i2c/i2c-core-smbus.o
AR drivers/net/ethernet/cavium/built-in.a
CC drivers/rtc/rtc-cmos.o
CC net/netfilter/xt_conntrack.o
CC drivers/net/netconsole.o
CC lib/llist.o
CC drivers/input/input-mt.o
AR drivers/pcmcia/built-in.a
CC fs/nfs/nfs3acl.o
CC fs/ext4/xattr.o
AR drivers/net/ethernet/chelsio/built-in.a
CC drivers/ata/ata_piix.o
AR drivers/media/i2c/built-in.a
AR drivers/media/tuners/built-in.a
CC drivers/usb/host/ohci-pci.o
CC drivers/acpi/acpica/rscreate.o
AR drivers/media/rc/keymaps/built-in.a
AR drivers/media/rc/built-in.a
AR drivers/media/common/b2c2/built-in.a
AR drivers/media/platform/allegro-dvt/built-in.a
AR drivers/media/common/saa7146/built-in.a
CC lib/lwq.o
AR drivers/media/common/siano/built-in.a
CC kernel/notifier.o
AR drivers/media/platform/amlogic/meson-ge2d/built-in.a
AR drivers/media/common/v4l2-tpg/built-in.a
AR drivers/media/platform/amlogic/built-in.a
AR drivers/media/common/videobuf2/built-in.a
AR drivers/media/platform/amphion/built-in.a
AR drivers/media/common/built-in.a
AR drivers/media/platform/aspeed/built-in.a
CC kernel/ksysfs.o
AR drivers/media/platform/atmel/built-in.a
AR drivers/media/platform/broadcom/built-in.a
CC drivers/base/trace.o
AR drivers/media/platform/cadence/built-in.a
CC drivers/usb/core/devio.o
AR drivers/media/platform/chips-media/coda/built-in.a
AR drivers/media/platform/chips-media/wave5/built-in.a
AR drivers/media/platform/chips-media/built-in.a
AR drivers/media/platform/imagination/built-in.a
AR drivers/media/platform/intel/built-in.a
AR drivers/media/platform/marvell/built-in.a
CC drivers/usb/storage/scsiglue.o
CC lib/memweight.o
AR drivers/media/platform/mediatek/jpeg/built-in.a
AR drivers/media/platform/mediatek/mdp/built-in.a
CC arch/x86/kernel/resource.o
AR drivers/media/platform/mediatek/vcodec/common/built-in.a
AR drivers/media/platform/mediatek/vcodec/encoder/built-in.a
AR drivers/media/platform/mediatek/vcodec/decoder/built-in.a
AR drivers/media/platform/mediatek/vcodec/built-in.a
AR drivers/media/platform/mediatek/vpu/built-in.a
AR drivers/media/platform/mediatek/mdp3/built-in.a
AS arch/x86/kernel/irqflags.o
AR drivers/media/platform/mediatek/built-in.a
CC lib/kfifo.o
CC lib/percpu-refcount.o
AR drivers/media/platform/microchip/built-in.a
CC drivers/scsi/scsi_bsg.o
AR drivers/media/platform/nuvoton/built-in.a
AR drivers/usb/misc/built-in.a
CC fs/nfs/nfs4proc.o
CC drivers/gpu/drm/i915/soc/intel_gmch.o
AR drivers/media/platform/nvidia/tegra-vde/built-in.a
AR drivers/media/pci/ttpci/built-in.a
CC drivers/acpi/acpica/rsdumpinfo.o
AR drivers/media/platform/nvidia/built-in.a
AR drivers/media/pci/b2c2/built-in.a
AR drivers/media/pci/pluto2/built-in.a
AR drivers/media/platform/nxp/dw100/built-in.a
AR drivers/media/pci/dm1105/built-in.a
AR drivers/media/platform/nxp/imx-jpeg/built-in.a
AR drivers/media/pci/pt1/built-in.a
CC fs/nfs/nfs4xdr.o
AR drivers/media/platform/nxp/imx8-isi/built-in.a
AR drivers/media/platform/nxp/built-in.a
AR drivers/media/pci/pt3/built-in.a
CC fs/xattr.o
AR drivers/media/pci/mantis/built-in.a
AR drivers/usb/class/built-in.a
CC drivers/i2c/i2c-core-acpi.o
CC arch/x86/kernel/static_call.o
AR drivers/media/platform/qcom/camss/built-in.a
AR drivers/media/pci/ngene/built-in.a
AR drivers/media/platform/qcom/venus/built-in.a
AR drivers/media/pci/ddbridge/built-in.a
AR drivers/media/platform/qcom/built-in.a
CC drivers/net/phy/mdio_device.o
AR drivers/net/ethernet/cisco/built-in.a
AR drivers/media/pci/saa7146/built-in.a
CC drivers/net/virtio_net.o
AR drivers/media/pci/smipcie/built-in.a
AR drivers/media/platform/raspberrypi/pisp_be/built-in.a
AR drivers/media/pci/netup_unidvb/built-in.a
AR drivers/media/platform/raspberrypi/rp1-cfe/built-in.a
AR drivers/media/platform/raspberrypi/built-in.a
AR drivers/media/pci/intel/ipu3/built-in.a
CC net/ipv4/af_inet.o
AR drivers/media/pci/intel/ivsc/built-in.a
AR drivers/media/platform/renesas/rcar-vin/built-in.a
AR drivers/media/pci/intel/built-in.a
AR drivers/media/platform/renesas/rzg2l-cru/built-in.a
AR drivers/media/pci/built-in.a
CC drivers/input/mouse/psmouse-smbus.o
AR drivers/media/platform/renesas/vsp1/built-in.a
AR drivers/media/platform/renesas/built-in.a
CC net/core/net-traces.o
CC kernel/cred.o
AR drivers/media/platform/rockchip/rga/built-in.a
CC drivers/usb/host/uhci-hcd.o
AR drivers/media/platform/rockchip/rkisp1/built-in.a
CC [M] drivers/gpu/drm/xe/xe_drm_client.o
AR drivers/media/platform/rockchip/built-in.a
AR drivers/media/platform/samsung/exynos-gsc/built-in.a
AR drivers/media/platform/samsung/exynos4-is/built-in.a
CC kernel/reboot.o
AR drivers/media/platform/samsung/s3c-camif/built-in.a
CC lib/rhashtable.o
AR drivers/media/platform/samsung/s5p-g2d/built-in.a
CC drivers/acpi/acpica/rsinfo.o
AR drivers/media/platform/samsung/s5p-jpeg/built-in.a
AR drivers/media/platform/samsung/s5p-mfc/built-in.a
AR drivers/media/platform/samsung/built-in.a
AR drivers/media/usb/b2c2/built-in.a
CC mm/init-mm.o
AR drivers/media/platform/st/sti/bdisp/built-in.a
AR drivers/media/usb/dvb-usb/built-in.a
AR drivers/media/platform/st/sti/c8sectpfe/built-in.a
AR drivers/media/platform/st/sti/delta/built-in.a
AR drivers/media/usb/dvb-usb-v2/built-in.a
AR drivers/media/usb/s2255/built-in.a
AR drivers/pps/clients/built-in.a
AR drivers/media/platform/st/sti/hva/built-in.a
AR drivers/media/usb/siano/built-in.a
AR drivers/pps/generators/built-in.a
AR drivers/media/platform/st/stm32/built-in.a
AR drivers/media/platform/st/built-in.a
CC drivers/pps/pps.o
AR drivers/media/usb/ttusb-budget/built-in.a
CC drivers/net/ethernet/broadcom/tg3.o
AR drivers/media/usb/ttusb-dec/built-in.a
AR drivers/rtc/built-in.a
CC net/ipv6/esp6.o
AR drivers/media/usb/built-in.a
AR drivers/media/platform/sunxi/sun4i-csi/built-in.a
CC net/ipv6/sit.o
CC arch/x86/kernel/process.o
AR drivers/media/platform/sunxi/sun6i-csi/built-in.a
CC kernel/async.o
AR drivers/media/platform/sunxi/sun6i-mipi-csi2/built-in.a
CC drivers/usb/host/xhci.o
AR drivers/media/platform/sunxi/sun8i-a83t-mipi-csi2/built-in.a
CC drivers/gpu/drm/i915/soc/intel_pch.o
AR drivers/base/built-in.a
AR drivers/media/platform/sunxi/sun8i-di/built-in.a
AR drivers/media/platform/sunxi/sun8i-rotate/built-in.a
AR drivers/media/platform/sunxi/built-in.a
CC drivers/usb/host/xhci-mem.o
CC drivers/usb/early/ehci-dbgp.o
CC drivers/net/phy/swphy.o
AR drivers/media/platform/ti/am437x/built-in.a
AR drivers/media/platform/ti/cal/built-in.a
AR drivers/media/platform/ti/vpe/built-in.a
CC drivers/usb/core/notify.o
AR drivers/media/platform/ti/davinci/built-in.a
CC drivers/scsi/scsi_common.o
AR drivers/media/platform/ti/j721e-csi2rx/built-in.a
CC net/netfilter/xt_policy.o
AR drivers/media/platform/ti/omap/built-in.a
AR drivers/media/platform/ti/omap3isp/built-in.a
AR drivers/media/platform/ti/built-in.a
CC drivers/usb/storage/protocol.o
AR drivers/media/platform/verisilicon/built-in.a
CC drivers/acpi/acpica/rsio.o
AR drivers/media/platform/via/built-in.a
AR drivers/media/platform/xilinx/built-in.a
CC net/mac80211/spectmgmt.o
AR drivers/media/platform/built-in.a
CC net/mac80211/tx.o
CC drivers/usb/core/generic.o
CC drivers/ata/pata_amd.o
AR drivers/media/mmc/siano/built-in.a
AR drivers/media/mmc/built-in.a
AR drivers/media/firewire/built-in.a
AR drivers/media/spi/built-in.a
AR drivers/media/test-drivers/built-in.a
AR drivers/media/built-in.a
CC drivers/usb/core/quirks.o
CC fs/libfs.o
CC drivers/pps/kapi.o
CC drivers/acpi/acpica/rsirq.o
AR drivers/input/mouse/built-in.a
CC drivers/acpi/acpica/rslist.o
CC drivers/input/input-poller.o
CC drivers/gpu/drm/drm_auth.o
CC drivers/i2c/i2c-smbus.o
AR net/wireless/built-in.a
CC net/core/selftests.o
CC drivers/usb/host/xhci-ext-caps.o
CC drivers/scsi/scsi_transport_spi.o
CC net/mac80211/key.o
CC net/ipv4/igmp.o
CC drivers/net/phy/fixed_phy.o
CC drivers/acpi/sysfs.o
CC drivers/scsi/virtio_scsi.o
CC kernel/range.o
CC drivers/usb/host/xhci-ring.o
CC drivers/acpi/acpica/rsmemory.o
AR drivers/net/ethernet/cortina/built-in.a
CC mm/memblock.o
CC drivers/usb/storage/transport.o
CC drivers/pps/sysfs.o
CC lib/base64.o
CC drivers/acpi/property.o
CC kernel/smpboot.o
CC lib/once.o
CC net/netfilter/xt_state.o
AR drivers/usb/early/built-in.a
CC drivers/net/phy/realtek.o
CC net/ipv4/fib_frontend.o
CC [M] drivers/gpu/drm/xe/xe_exec.o
CC drivers/input/ff-core.o
CC drivers/usb/storage/usb.o
CC drivers/gpu/drm/i915/soc/intel_rom.o
CC drivers/usb/core/devices.o
CC drivers/ata/pata_oldpiix.o
CC drivers/acpi/acpica/rsmisc.o
CC drivers/usb/core/phy.o
CC [M] drivers/gpu/drm/xe/xe_execlist.o
CC drivers/input/touchscreen.o
CC net/mac80211/util.o
AR drivers/pps/built-in.a
CC drivers/usb/storage/initializers.o
AR drivers/i2c/built-in.a
AR drivers/net/ethernet/dec/tulip/built-in.a
AR drivers/net/ethernet/dec/built-in.a
CC drivers/usb/host/xhci-hub.o
CC net/ipv6/addrconf_core.o
CC lib/refcount.o
CC drivers/gpu/drm/drm_blend.o
CC drivers/gpu/drm/i915/i915_memcpy.o
CC arch/x86/kernel/ptrace.o
CC drivers/usb/host/xhci-dbg.o
CC kernel/ucount.o
CC drivers/usb/core/port.o
CC drivers/acpi/acpica/rsserial.o
CC lib/rcuref.o
CC net/ipv6/exthdrs_core.o
CC drivers/acpi/acpica/rsutils.o
CC lib/usercopy.o
CC drivers/acpi/acpica/rsxface.o
CC fs/ext4/xattr_hurd.o
CC fs/fs-writeback.o
CC mm/slub.o
CC fs/nfs/nfs4state.o
CC kernel/regset.o
AR drivers/net/ethernet/dlink/built-in.a
CC fs/nfs/nfs4renewd.o
CC drivers/gpu/drm/drm_bridge.o
CC drivers/input/ff-memless.o
CC fs/nfs/nfs4super.o
CC lib/errseq.o
CC drivers/scsi/sd.o
CC net/ipv6/ip6_checksum.o
CC drivers/usb/host/xhci-trace.o
CC drivers/ata/pata_sch.o
CC drivers/ptp/ptp_clock.o
CC drivers/ata/pata_mpiix.o
CC lib/bucket_locks.o
CC drivers/gpu/drm/drm_cache.o
CC drivers/usb/storage/sierra_ms.o
CC drivers/acpi/debugfs.o
CC fs/ext4/xattr_trusted.o
CC [M] net/netfilter/nf_log_syslog.o
CC drivers/gpu/drm/i915/i915_mm.o
CC [M] drivers/gpu/drm/xe/xe_exec_queue.o
CC net/ipv6/ip6_icmp.o
CC drivers/acpi/acpica/tbdata.o
CC lib/generic-radix-tree.o
AR drivers/net/phy/built-in.a
CC net/ipv4/fib_semantics.o
CC fs/pnode.o
CC kernel/ksyms_common.o
CC arch/x86/kernel/tls.o
CC drivers/scsi/sr.o
CC drivers/usb/core/hcd-pci.o
CC fs/ext4/xattr_user.o
CC net/core/ptp_classifier.o
AR drivers/net/ethernet/emulex/built-in.a
CC drivers/ptp/ptp_chardev.o
CC drivers/input/sparse-keymap.o
CC lib/bitmap-str.o
CC drivers/usb/host/xhci-debugfs.o
CC drivers/acpi/acpica/tbfadt.o
CC drivers/gpu/drm/i915/i915_sw_fence.o
CC drivers/usb/storage/option_ms.o
CC net/ipv6/output_core.o
CC net/ipv4/fib_trie.o
CC [M] drivers/gpu/drm/xe/xe_force_wake.o
CC drivers/ata/ata_generic.o
CC drivers/scsi/sr_ioctl.o
CC drivers/usb/host/xhci-pci.o
CC mm/madvise.o
CC drivers/acpi/acpi_lpat.o
CC [M] drivers/gpu/drm/xe/xe_ggtt.o
CC net/ipv6/protocol.o
CC kernel/groups.o
CC drivers/usb/core/usb-acpi.o
CC [M] drivers/gpu/drm/xe/xe_gpu_scheduler.o
AR drivers/net/ethernet/engleder/built-in.a
CC drivers/power/supply/power_supply_core.o
CC drivers/power/supply/power_supply_sysfs.o
CC drivers/acpi/acpi_pcc.o
CC [M] drivers/gpu/drm/xe/xe_gsc.o
CC drivers/acpi/acpica/tbfind.o
CC drivers/scsi/sr_vendor.o
CC lib/string_helpers.o
CC arch/x86/kernel/step.o
CC drivers/usb/storage/usual-tables.o
CC drivers/input/vivaldi-fmap.o
CC drivers/power/supply/power_supply_leds.o
CC net/ipv4/fib_notifier.o
CC drivers/gpu/drm/i915/i915_sw_fence_work.o
CC drivers/net/net_failover.o
CC fs/splice.o
CC net/mac80211/parse.o
CC drivers/ptp/ptp_sysfs.o
CC kernel/kcmp.o
CC fs/nfs/nfs4file.o
CC drivers/acpi/acpica/tbinstal.o
CC fs/nfs/delegation.o
CC fs/nfs/nfs4idmap.o
AR drivers/ata/built-in.a
CC arch/x86/kernel/i8237.o
CC drivers/acpi/acpica/tbprint.o
CC drivers/input/input-leds.o
CC drivers/gpu/drm/i915/i915_syncmap.o
CC [M] net/netfilter/xt_mark.o
CC [M] drivers/gpu/drm/xe/xe_gsc_debugfs.o
CC lib/hexdump.o
CC mm/page_io.o
CC drivers/gpu/drm/drm_color_mgmt.o
CC drivers/gpu/drm/drm_connector.o
CC fs/nfs/callback.o
CC net/ipv6/ip6_offload.o
CC arch/x86/kernel/stacktrace.o
CC fs/ext4/fast_commit.o
AR drivers/usb/core/built-in.a
CC net/core/netprio_cgroup.o
AR drivers/usb/storage/built-in.a
CC drivers/power/supply/power_supply_hwmon.o
CC [M] drivers/gpu/drm/xe/xe_gsc_proxy.o
CC fs/ext4/orphan.o
CC drivers/gpu/drm/i915/i915_user_extensions.o
CC drivers/acpi/ac.o
CC drivers/ptp/ptp_vclock.o
CC [M] net/netfilter/xt_nat.o
CC drivers/scsi/sg.o
CC [M] net/netfilter/xt_LOG.o
CC net/core/netclassid_cgroup.o
CC drivers/acpi/acpica/tbutils.o
CC fs/nfs/callback_xdr.o
CC lib/kstrtox.o
CC lib/iomap.o
CC fs/nfs/callback_proc.o
CC drivers/ptp/ptp_kvm_x86.o
CC fs/nfs/nfs4namespace.o
CC drivers/input/evdev.o
CC kernel/freezer.o
CC drivers/acpi/button.o
CC drivers/gpu/drm/i915/i915_debugfs.o
AR drivers/power/supply/built-in.a
AR drivers/usb/host/built-in.a
CC lib/iomap_copy.o
AR drivers/power/built-in.a
AR drivers/usb/built-in.a
CC [M] drivers/gpu/drm/xe/xe_gsc_submit.o
AR drivers/net/ethernet/ezchip/built-in.a
CC [M] drivers/gpu/drm/xe/xe_gt.o
CC arch/x86/kernel/reboot.o
CC kernel/profile.o
CC [M] net/netfilter/xt_MASQUERADE.o
CC drivers/acpi/acpica/tbxface.o
CC [M] net/netfilter/xt_addrtype.o
CC lib/devres.o
CC net/mac80211/wme.o
CC net/ipv6/tcpv6_offload.o
CC drivers/scsi/scsi_sysfs.o
CC net/ipv6/exthdrs_offload.o
CC net/ipv4/inet_fragment.o
CC drivers/acpi/fan_core.o
CC kernel/stacktrace.o
CC fs/nfs/nfs4getroot.o
CC arch/x86/kernel/msr.o
CC drivers/gpu/drm/i915/i915_debugfs_params.o
CC lib/check_signature.o
CC drivers/acpi/acpica/tbxfload.o
CC drivers/acpi/acpica/tbxfroot.o
CC drivers/hwmon/hwmon.o
CC net/mac80211/chan.o
CC drivers/ptp/ptp_kvm_common.o
AR drivers/net/ethernet/fujitsu/built-in.a
CC mm/swap_state.o
AR drivers/net/ethernet/fungible/built-in.a
CC kernel/dma.o
CC net/core/dst_cache.o
CC fs/sync.o
CC lib/interval_tree.o
CC arch/x86/kernel/cpuid.o
CC kernel/smp.o
CC [M] drivers/gpu/drm/xe/xe_gt_ccs_mode.o
AR drivers/thermal/broadcom/built-in.a
AR drivers/thermal/renesas/built-in.a
CC drivers/acpi/acpica/utaddress.o
AR drivers/thermal/samsung/built-in.a
CC drivers/thermal/intel/intel_tcc.o
CC drivers/gpu/drm/i915/i915_pmu.o
AR drivers/thermal/st/built-in.a
CC drivers/acpi/fan_attr.o
CC fs/nfs/nfs4client.o
CC net/ipv6/inet6_hashtables.o
CC net/ipv6/mcast_snoop.o
CC fs/utimes.o
CC fs/ext4/acl.o
AR drivers/thermal/qcom/built-in.a
CC arch/x86/kernel/early-quirks.o
CC net/mac80211/trace.o
CC drivers/thermal/intel/therm_throt.o
AR drivers/input/built-in.a
CC drivers/gpu/drm/i915/gt/gen2_engine_cs.o
AR drivers/watchdog/built-in.a
CC [M] drivers/gpu/drm/xe/xe_gt_clock.o
CC [M] drivers/gpu/drm/xe/xe_gt_freq.o
CC lib/assoc_array.o
AR drivers/thermal/tegra/built-in.a
CC fs/ext4/xattr_security.o
CC [M] drivers/gpu/drm/xe/xe_gt_idle.o
CC kernel/uid16.o
CC drivers/gpu/drm/drm_crtc.o
CC net/core/gro_cells.o
CC drivers/md/md.o
CC drivers/gpu/drm/i915/gt/gen6_engine_cs.o
CC lib/bitrev.o
CC drivers/md/md-bitmap.o
CC drivers/acpi/acpica/utalloc.o
CC kernel/kallsyms.o
CC fs/d_path.o
CC drivers/cpufreq/cpufreq.o
AR drivers/ptp/built-in.a
CC drivers/acpi/fan_hwmon.o
AR drivers/net/ethernet/google/built-in.a
CC drivers/acpi/acpica/utascii.o
CC drivers/md/md-autodetect.o
CC drivers/cpufreq/freq_table.o
AR net/netfilter/built-in.a
CC fs/nfs/nfs4session.o
CC fs/stack.o
AR drivers/thermal/mediatek/built-in.a
CC net/ipv4/ping.o
AR drivers/scsi/built-in.a
CC mm/swapfile.o
CC net/mac80211/mlme.o
CC lib/crc-ccitt.o
CC lib/crc16.o
CC drivers/gpu/drm/drm_displayid.o
CC drivers/cpufreq/cpufreq_performance.o
CC kernel/acct.o
CC drivers/cpufreq/cpufreq_userspace.o
CC fs/nfs/dns_resolve.o
CC drivers/md/dm.o
CC drivers/acpi/acpica/utbuffer.o
CC fs/fs_struct.o
CC drivers/thermal/thermal_core.o
CC drivers/gpu/drm/drm_drv.o
CC drivers/acpi/acpi_video.o
CC net/core/failover.o
CC drivers/md/dm-table.o
CC net/mac80211/tdls.o
HOSTCC lib/gen_crc32table
CC drivers/md/dm-target.o
CC drivers/cpuidle/governors/menu.o
CC arch/x86/kernel/smp.o
AR drivers/mmc/built-in.a
CC [M] drivers/gpu/drm/xe/xe_gt_mcr.o
AR drivers/hwmon/built-in.a
CC [M] drivers/gpu/drm/xe/xe_gt_pagefault.o
CC [M] drivers/thermal/intel/x86_pkg_temp_thermal.o
AR fs/ext4/built-in.a
CC fs/statfs.o
CC drivers/cpuidle/governors/haltpoll.o
CC net/mac80211/ocb.o
CC drivers/acpi/acpica/utcksum.o
CC drivers/gpu/drm/drm_dumb_buffers.o
CC lib/xxhash.o
CC fs/nfs/nfs4trace.o
AR drivers/net/ethernet/hisilicon/built-in.a
CC drivers/thermal/thermal_sysfs.o
CC [M] drivers/gpu/drm/xe/xe_gt_sysfs.o
AR drivers/ufs/built-in.a
CC kernel/vmcore_info.o
CC mm/swap_slots.o
CC net/ipv4/ip_tunnel_core.o
CC drivers/acpi/video_detect.o
CC drivers/cpufreq/cpufreq_ondemand.o
CC drivers/thermal/thermal_trip.o
CC fs/nfs/nfs4sysctl.o
CC [M] drivers/gpu/drm/xe/xe_gt_throttle.o
AR drivers/firmware/arm_ffa/built-in.a
CC drivers/gpu/drm/i915/gt/gen6_ppgtt.o
AR drivers/firmware/arm_scmi/built-in.a
AR drivers/firmware/broadcom/built-in.a
CC drivers/acpi/processor_driver.o
AR drivers/firmware/cirrus/built-in.a
AR drivers/firmware/meson/built-in.a
CC arch/x86/kernel/smpboot.o
CC drivers/acpi/acpica/utcopy.o
AR drivers/firmware/microchip/built-in.a
AR net/ipv6/built-in.a
AR drivers/firmware/imx/built-in.a
CC [M] drivers/gpu/drm/xe/xe_gt_tlb_invalidation.o
AR drivers/crypto/stm32/built-in.a
AR drivers/crypto/xilinx/built-in.a
AR drivers/crypto/hisilicon/built-in.a
AR drivers/crypto/intel/keembay/built-in.a
CC drivers/firmware/efi/libstub/efi-stub-helper.o
AR drivers/crypto/intel/ixp4xx/built-in.a
AR drivers/crypto/intel/built-in.a
AR drivers/crypto/starfive/built-in.a
AR drivers/crypto/built-in.a
AR drivers/net/ethernet/huawei/built-in.a
CC drivers/cpuidle/cpuidle.o
CC lib/genalloc.o
CC net/mac80211/airtime.o
CC net/ipv4/gre_offload.o
CC drivers/thermal/thermal_helpers.o
CC drivers/gpu/drm/i915/gt/gen7_renderclear.o
CC kernel/elfcorehdr.o
CC mm/dmapool.o
AR drivers/thermal/intel/built-in.a
CC drivers/thermal/thermal_thresholds.o
CC net/mac80211/eht.o
CC drivers/net/ethernet/intel/e1000/e1000_main.o
CC arch/x86/kernel/tsc_sync.o
CC net/mac80211/led.o
CC drivers/cpufreq/cpufreq_governor.o
CC drivers/cpuidle/driver.o
AR net/core/built-in.a
CC drivers/net/ethernet/intel/e1000/e1000_hw.o
CC drivers/clocksource/acpi_pm.o
CC drivers/acpi/acpica/utexcep.o
CC kernel/crash_reserve.o
CC arch/x86/kernel/setup_percpu.o
CC drivers/acpi/acpica/utdebug.o
CC fs/fs_pin.o
AR drivers/cpuidle/governors/built-in.a
CC drivers/gpu/drm/drm_edid.o
CC drivers/gpu/drm/i915/gt/gen8_engine_cs.o
CC drivers/net/ethernet/intel/e1000e/82571.o
AR drivers/net/ethernet/i825xx/built-in.a
CC net/mac80211/pm.o
CC drivers/net/ethernet/intel/e100.o
CC mm/hugetlb.o
AR drivers/firmware/psci/built-in.a
CC drivers/md/dm-linear.o
CC lib/percpu_counter.o
CC drivers/firmware/efi/efi-bgrt.o
CC drivers/firmware/efi/libstub/gop.o
CC drivers/net/ethernet/intel/e1000/e1000_ethtool.o
CC drivers/acpi/acpica/utdecode.o
CC net/ipv4/metrics.o
CC drivers/cpufreq/cpufreq_governor_attr_set.o
CC drivers/gpu/drm/i915/gt/gen8_ppgtt.o
CC drivers/clocksource/i8253.o
CC drivers/thermal/thermal_hwmon.o
AR drivers/firmware/qcom/built-in.a
AR drivers/firmware/smccc/built-in.a
CC kernel/kexec_core.o
AR drivers/net/ethernet/microsoft/built-in.a
CC fs/nsfs.o
AR drivers/net/ethernet/litex/built-in.a
CC drivers/acpi/acpica/utdelete.o
CC drivers/gpu/drm/i915/gt/intel_breadcrumbs.o
CC drivers/hid/usbhid/hid-core.o
CC drivers/cpuidle/governor.o
CC drivers/cpufreq/acpi-cpufreq.o
CC drivers/gpu/drm/drm_eld.o
CC arch/x86/kernel/mpparse.o
CC drivers/hid/hid-core.o
CC net/mac80211/rc80211_minstrel_ht.o
CC drivers/hid/usbhid/hiddev.o
CC drivers/hid/usbhid/hid-pidff.o
AR drivers/platform/x86/amd/built-in.a
CC fs/fs_types.o
AR drivers/platform/x86/intel/built-in.a
CC drivers/platform/x86/wmi.o
CC fs/fs_context.o
CC drivers/acpi/acpica/uterror.o
AR drivers/clocksource/built-in.a
CC drivers/hid/hid-input.o
CC arch/x86/kernel/trace_clock.o
CC [M] drivers/gpu/drm/xe/xe_gt_topology.o
CC lib/audit.o
CC drivers/cpufreq/amd-pstate.o
CC drivers/gpu/drm/i915/gt/intel_context.o
AR drivers/net/ethernet/marvell/octeon_ep/built-in.a
CC drivers/thermal/gov_step_wise.o
AR drivers/net/ethernet/marvell/octeon_ep_vf/built-in.a
CC mm/mmu_notifier.o
CC drivers/cpufreq/amd-pstate-trace.o
AR drivers/net/ethernet/marvell/octeontx2/built-in.a
AR drivers/net/ethernet/marvell/prestera/built-in.a
CC arch/x86/kernel/trace.o
CC drivers/net/ethernet/marvell/sky2.o
CC fs/fs_parser.o
AR drivers/net/ethernet/mellanox/built-in.a
CC drivers/thermal/gov_user_space.o
CC drivers/cpuidle/sysfs.o
CC drivers/net/ethernet/intel/e1000/e1000_param.o
CC drivers/firmware/efi/libstub/secureboot.o
CC drivers/firmware/efi/libstub/tpm.o
CC drivers/acpi/acpica/uteval.o
CC drivers/hid/hid-quirks.o
AR drivers/platform/surface/built-in.a
CC drivers/net/ethernet/intel/e1000e/ich8lan.o
CC lib/syscall.o
CC kernel/crash_core.o
CC drivers/firmware/efi/efi.o
AR drivers/thermal/built-in.a
CC drivers/cpufreq/intel_pstate.o
AR drivers/net/ethernet/meta/built-in.a
AR drivers/firmware/tegra/built-in.a
CC drivers/md/dm-stripe.o
CC mm/migrate.o
CC drivers/gpu/drm/drm_encoder.o
AR drivers/net/ethernet/broadcom/built-in.a
CC [M] drivers/gpu/drm/xe/xe_guc.o
CC drivers/firmware/efi/libstub/file.o
CC net/ipv4/netlink.o
CC drivers/acpi/acpica/utglobal.o
CC drivers/cpuidle/poll_state.o
CC arch/x86/kernel/rethook.o
CC drivers/platform/x86/wmi-bmof.o
CC net/ipv4/nexthop.o
CC drivers/firmware/efi/vars.o
CC net/mac80211/wbrf.o
CC kernel/kexec.o
CC drivers/acpi/acpica/uthex.o
CC drivers/gpu/drm/drm_file.o
CC drivers/acpi/processor_thermal.o
AR drivers/firmware/xilinx/built-in.a
CC drivers/mailbox/mailbox.o
AR drivers/perf/built-in.a
CC drivers/cpuidle/cpuidle-haltpoll.o
CC drivers/acpi/acpica/utids.o
CC drivers/acpi/processor_idle.o
AR drivers/net/ethernet/micrel/built-in.a
AR drivers/net/ethernet/microchip/built-in.a
CC net/ipv4/udp_tunnel_stub.o
CC drivers/firmware/efi/reboot.o
CC lib/errname.o
CC drivers/firmware/dmi_scan.o
AR drivers/hid/usbhid/built-in.a
CC lib/nlattr.o
CC arch/x86/kernel/vmcore_info_32.o
CC lib/cpu_rmap.o
CC drivers/gpu/drm/i915/gt/intel_context_sseu.o
CC drivers/gpu/drm/i915/gt/intel_engine_cs.o
CC net/ipv4/ip_tunnel.o
CC fs/fsopen.o
CC mm/page_counter.o
AR drivers/net/ethernet/mscc/built-in.a
CC drivers/mailbox/pcc.o
AR drivers/net/ethernet/myricom/built-in.a
CC drivers/md/dm-ioctl.o
CC kernel/utsname.o
CC [M] drivers/gpu/drm/xe/xe_guc_ads.o
CC fs/init.o
CC drivers/acpi/acpica/utinit.o
CC drivers/platform/x86/eeepc-laptop.o
CC drivers/firmware/efi/libstub/mem.o
AR drivers/cpuidle/built-in.a
CC drivers/gpu/drm/drm_fourcc.o
CC drivers/md/dm-io.o
CC drivers/net/ethernet/intel/e1000e/80003es2lan.o
AR fs/nfs/built-in.a
CC drivers/gpu/drm/i915/gt/intel_engine_heartbeat.o
CC fs/kernel_read_file.o
AR drivers/hwtracing/intel_th/built-in.a
CC drivers/md/dm-kcopyd.o
AR drivers/android/built-in.a
CC drivers/firmware/efi/libstub/random.o
CC [M] drivers/gpu/drm/xe/xe_guc_buf.o
CC drivers/net/ethernet/intel/e1000e/mac.o
CC drivers/firmware/efi/memattr.o
CC kernel/pid_namespace.o
CC drivers/gpu/drm/drm_framebuffer.o
CC drivers/gpu/drm/i915/gt/intel_engine_pm.o
CC arch/x86/kernel/machine_kexec_32.o
CC drivers/firmware/dmi-id.o
CC drivers/acpi/acpica/utlock.o
AR drivers/nvmem/layouts/built-in.a
CC drivers/nvmem/core.o
CC drivers/md/dm-sysfs.o
CC drivers/platform/x86/p2sb.o
CC fs/mnt_idmapping.o
AR drivers/net/ethernet/intel/e1000/built-in.a
CC fs/remap_range.o
CC [M] drivers/gpu/drm/xe/xe_guc_capture.o
CC drivers/hid/hid-debug.o
CC net/ipv4/sysctl_net_ipv4.o
AR drivers/mailbox/built-in.a
CC drivers/gpu/drm/i915/gt/intel_engine_user.o
AR drivers/net/ethernet/natsemi/built-in.a
AS arch/x86/kernel/relocate_kernel_32.o
CC mm/hugetlb_cgroup.o
CC drivers/firmware/memmap.o
CC lib/dynamic_queue_limits.o
CC drivers/gpu/drm/i915/gt/intel_execlists_submission.o
CC drivers/acpi/acpica/utmath.o
CC drivers/net/ethernet/intel/e1000e/manage.o
CC drivers/hid/hidraw.o
CC arch/x86/kernel/crash_dump_32.o
CC drivers/firmware/efi/libstub/randomalloc.o
CC drivers/firmware/efi/tpm.o
CC kernel/stop_machine.o
CC drivers/acpi/processor_throttling.o
CC lib/glob.o
CC drivers/gpu/drm/i915/gt/intel_ggtt.o
CC drivers/md/dm-stats.o
CC arch/x86/kernel/crash.o
CC mm/early_ioremap.o
CC drivers/acpi/acpica/utmisc.o
CC kernel/audit.o
CC drivers/net/ethernet/intel/e1000e/nvm.o
CC drivers/firmware/efi/memmap.o
CC [M] drivers/gpu/drm/xe/xe_guc_ct.o
AR drivers/platform/x86/built-in.a
AR drivers/platform/built-in.a
CC net/ipv4/proc.o
CC drivers/gpu/drm/i915/gt/intel_ggtt_fencing.o
CC drivers/md/dm-rq.o
CC drivers/firmware/efi/libstub/pci.o
CC mm/secretmem.o
AR drivers/cpufreq/built-in.a
CC drivers/firmware/efi/capsule.o
CC drivers/gpu/drm/i915/gt/intel_gt.o
CC drivers/firmware/efi/esrt.o
CC drivers/firmware/efi/libstub/skip_spaces.o
CC lib/strncpy_from_user.o
CC fs/pidfs.o
CC drivers/net/ethernet/intel/e1000e/phy.o
CC kernel/auditfilter.o
CC drivers/acpi/acpica/utmutex.o
CC drivers/gpu/drm/i915/gt/intel_gt_buffer_pool.o
AR drivers/net/ethernet/neterion/built-in.a
CC arch/x86/kernel/module.o
CC mm/hmm.o
CC drivers/md/dm-io-rewind.o
CC mm/memfd.o
AR drivers/nvmem/built-in.a
AR drivers/net/ethernet/netronome/built-in.a
CC drivers/firmware/efi/runtime-wrappers.o
CC drivers/acpi/processor_perflib.o
CC drivers/firmware/efi/capsule-loader.o
AR drivers/net/ethernet/marvell/built-in.a
CC arch/x86/kernel/doublefault_32.o
CC [M] drivers/gpu/drm/xe/xe_guc_db_mgr.o
CC kernel/auditsc.o
CC fs/buffer.o
CC kernel/audit_watch.o
CC drivers/hid/hid-generic.o
CC mm/ptdump.o
CC drivers/gpu/drm/i915/gt/intel_gt_ccs_mode.o
CC [M] drivers/gpu/drm/xe/xe_guc_hwconfig.o
CC fs/mpage.o
CC mm/execmem.o
CC drivers/gpu/drm/i915/gt/intel_gt_clock_utils.o
AR drivers/net/ethernet/ni/built-in.a
CC drivers/acpi/acpica/utnonansi.o
CC drivers/net/ethernet/intel/e1000e/param.o
CC drivers/firmware/efi/earlycon.o
CC drivers/md/dm-builtin.o
CC drivers/firmware/efi/libstub/lib-cmdline.o
CC lib/strnlen_user.o
CC drivers/gpu/drm/i915/gt/intel_gt_debugfs.o
CC net/ipv4/fib_rules.o
CC drivers/hid/hid-a4tech.o
CC drivers/acpi/container.o
CC drivers/firmware/efi/libstub/lib-ctype.o
CC drivers/firmware/efi/libstub/alignedmem.o
CC arch/x86/kernel/early_printk.o
CC drivers/md/dm-raid1.o
CC drivers/net/ethernet/nvidia/forcedeth.o
CC drivers/acpi/acpica/utobject.o
CC kernel/audit_fsnotify.o
CC fs/proc_namespace.o
CC fs/direct-io.o
CC lib/net_utils.o
CC fs/eventpoll.o
CC drivers/gpu/drm/i915/gt/intel_gt_engines_debugfs.o
CC net/ipv4/ipmr.o
CC net/ipv4/ipmr_base.o
CC drivers/firmware/efi/libstub/relocate.o
CC drivers/md/dm-log.o
CC drivers/acpi/acpica/utosi.o
CC kernel/audit_tree.o
CC drivers/net/ethernet/intel/e1000e/ethtool.o
AR drivers/net/ethernet/oki-semi/built-in.a
CC net/ipv4/syncookies.o
CC arch/x86/kernel/hpet.o
CC [M] drivers/gpu/drm/xe/xe_guc_id_mgr.o
AR mm/built-in.a
CC lib/sg_pool.o
CC kernel/kprobes.o
CC drivers/firmware/efi/libstub/printk.o
CC drivers/acpi/acpica/utownerid.o
CC arch/x86/kernel/amd_nb.o
AR drivers/net/ethernet/packetengines/built-in.a
CC drivers/md/dm-region-hash.o
CC arch/x86/kernel/kvm.o
CC net/ipv4/tunnel4.o
CC drivers/gpu/drm/drm_gem.o
CC drivers/net/ethernet/intel/e1000e/netdev.o
CC drivers/firmware/efi/libstub/vsprintf.o
CC lib/stackdepot.o
AR drivers/net/ethernet/qlogic/built-in.a
CC lib/asn1_decoder.o
GEN lib/oid_registry_data.c
CC drivers/net/ethernet/intel/e1000e/ptp.o
CC drivers/hid/hid-apple.o
CC [M] drivers/gpu/drm/xe/xe_guc_klv_helpers.o
AR drivers/firmware/efi/built-in.a
CC arch/x86/kernel/kvmclock.o
CC net/ipv4/ipconfig.o
CC drivers/firmware/efi/libstub/x86-stub.o
CC kernel/seccomp.o
AR drivers/net/ethernet/qualcomm/emac/built-in.a
AR drivers/net/ethernet/qualcomm/built-in.a
CC drivers/md/dm-zero.o
CC drivers/firmware/efi/libstub/smbios.o
CC [M] drivers/gpu/drm/xe/xe_guc_log.o
CC arch/x86/kernel/paravirt.o
CC drivers/acpi/acpica/utpredef.o
CC drivers/gpu/drm/i915/gt/intel_gt_irq.o
CC net/ipv4/netfilter.o
CC drivers/hid/hid-belkin.o
CC drivers/gpu/drm/i915/gt/intel_gt_mcr.o
CC kernel/relay.o
CC drivers/net/ethernet/realtek/8139too.o
CC fs/anon_inodes.o
CC net/ipv4/tcp_cubic.o
CC fs/signalfd.o
AR drivers/net/ethernet/renesas/built-in.a
CC drivers/acpi/acpica/utresdecode.o
CC drivers/acpi/thermal_lib.o
CC kernel/utsname_sysctl.o
CC drivers/net/ethernet/realtek/r8169_main.o
CC drivers/gpu/drm/drm_ioctl.o
CC drivers/acpi/acpica/utresrc.o
CC fs/timerfd.o
CC lib/ucs2_string.o
STUBCPY drivers/firmware/efi/libstub/alignedmem.stub.o
CC drivers/acpi/thermal.o
CC kernel/delayacct.o
CC drivers/net/ethernet/realtek/r8169_firmware.o
CC net/ipv4/tcp_sigpool.o
CC drivers/gpu/drm/i915/gt/intel_gt_pm.o
CC [M] drivers/gpu/drm/xe/xe_guc_pc.o
AR drivers/net/ethernet/rdc/built-in.a
AR drivers/md/built-in.a
CC drivers/hid/hid-cherry.o
CC drivers/acpi/acpica/utstate.o
CC net/ipv4/cipso_ipv4.o
CC arch/x86/kernel/pvclock.o
CC drivers/gpu/drm/i915/gt/intel_gt_pm_debugfs.o
CC drivers/gpu/drm/drm_lease.o
CC drivers/acpi/nhlt.o
CC drivers/hid/hid-chicony.o
CC drivers/net/ethernet/realtek/r8169_phy_config.o
STUBCPY drivers/firmware/efi/libstub/efi-stub-helper.stub.o
CC drivers/acpi/acpica/utstring.o
STUBCPY drivers/firmware/efi/libstub/file.stub.o
STUBCPY drivers/firmware/efi/libstub/gop.stub.o
CC drivers/gpu/drm/i915/gt/intel_gt_pm_irq.o
STUBCPY drivers/firmware/efi/libstub/lib-cmdline.stub.o
CC drivers/hid/hid-cypress.o
STUBCPY drivers/firmware/efi/libstub/lib-ctype.stub.o
CC kernel/taskstats.o
CC drivers/gpu/drm/drm_managed.o
STUBCPY drivers/firmware/efi/libstub/mem.stub.o
STUBCPY drivers/firmware/efi/libstub/pci.stub.o
STUBCPY drivers/firmware/efi/libstub/printk.stub.o
CC lib/sbitmap.o
STUBCPY drivers/firmware/efi/libstub/random.stub.o
STUBCPY drivers/firmware/efi/libstub/randomalloc.stub.o
STUBCPY drivers/firmware/efi/libstub/relocate.stub.o
STUBCPY drivers/firmware/efi/libstub/secureboot.stub.o
CC arch/x86/kernel/pcspeaker.o
STUBCPY drivers/firmware/efi/libstub/skip_spaces.stub.o
CC lib/group_cpus.o
CC lib/fw_table.o
STUBCPY drivers/firmware/efi/libstub/smbios.stub.o
STUBCPY drivers/firmware/efi/libstub/tpm.stub.o
CC drivers/gpu/drm/i915/gt/intel_gt_requests.o
STUBCPY drivers/firmware/efi/libstub/vsprintf.stub.o
STUBCPY drivers/firmware/efi/libstub/x86-stub.stub.o
AR lib/lib.a
CC [M] drivers/gpu/drm/xe/xe_guc_submit.o
AR drivers/firmware/efi/libstub/lib.a
AR drivers/net/ethernet/rocker/built-in.a
CC drivers/hid/hid-ezkey.o
CC drivers/gpu/drm/drm_mm.o
AR drivers/firmware/built-in.a
CC net/ipv4/xfrm4_policy.o
CC drivers/acpi/acpi_memhotplug.o
CC fs/eventfd.o
CC drivers/acpi/acpica/utstrsuppt.o
CC drivers/gpu/drm/i915/gt/intel_gt_sysfs.o
AR net/mac80211/built-in.a
CC arch/x86/kernel/check.o
CC drivers/acpi/acpica/utstrtoul64.o
CC arch/x86/kernel/uprobes.o
CC [M] drivers/gpu/drm/xe/xe_heci_gsc.o
CC drivers/hid/hid-gyration.o
CC fs/aio.o
GEN lib/crc32table.h
CC drivers/gpu/drm/drm_mode_config.o
CC lib/oid_registry.o
CC drivers/acpi/acpica/utxface.o
AR drivers/net/ethernet/samsung/built-in.a
CC kernel/tsacct.o
AR drivers/net/ethernet/seeq/built-in.a
CC drivers/acpi/ioapic.o
AR drivers/net/ethernet/silan/built-in.a
CC drivers/gpu/drm/i915/gt/intel_gt_sysfs_pm.o
CC drivers/acpi/acpica/utxfinit.o
CC kernel/tracepoint.o
CC net/ipv4/xfrm4_state.o
CC drivers/acpi/acpica/utxferror.o
CC drivers/hid/hid-ite.o
CC [M] drivers/gpu/drm/xe/xe_hw_engine.o
CC drivers/gpu/drm/drm_mode_object.o
CC fs/locks.o
CC drivers/acpi/acpica/utxfmutex.o
AR drivers/net/ethernet/sis/built-in.a
CC drivers/acpi/battery.o
CC arch/x86/kernel/perf_regs.o
CC kernel/irq_work.o
CC drivers/gpu/drm/drm_modes.o
CC [M] drivers/gpu/drm/xe/xe_hw_engine_class_sysfs.o
CC arch/x86/kernel/tracepoint.o
CC drivers/gpu/drm/i915/gt/intel_gtt.o
CC lib/crc32.o
CC drivers/gpu/drm/i915/gt/intel_llc.o
CC drivers/gpu/drm/i915/gt/intel_lrc.o
CC kernel/static_call.o
CC kernel/padata.o
CC arch/x86/kernel/itmt.o
CC [M] drivers/gpu/drm/xe/xe_hw_engine_group.o
CC drivers/hid/hid-kensington.o
CC kernel/jump_label.o
CC drivers/gpu/drm/drm_modeset_lock.o
CC arch/x86/kernel/umip.o
CC drivers/gpu/drm/i915/gt/intel_migrate.o
CC drivers/hid/hid-lg.o
AR drivers/acpi/acpica/built-in.a
CC kernel/context_tracking.o
CC drivers/acpi/bgrt.o
AR drivers/net/ethernet/sfc/built-in.a
CC net/ipv4/xfrm4_input.o
AR drivers/net/ethernet/smsc/built-in.a
CC arch/x86/kernel/unwind_frame.o
CC [M] drivers/gpu/drm/xe/xe_hw_fence.o
CC drivers/gpu/drm/i915/gt/intel_mocs.o
CC drivers/hid/hid-lgff.o
AR drivers/net/ethernet/socionext/built-in.a
CC drivers/gpu/drm/drm_plane.o
CC drivers/gpu/drm/drm_prime.o
CC kernel/iomem.o
CC fs/binfmt_misc.o
CC fs/binfmt_script.o
CC drivers/hid/hid-lg4ff.o
CC drivers/gpu/drm/drm_print.o
CC drivers/acpi/spcr.o
CC [M] drivers/gpu/drm/xe/xe_huc.o
AR drivers/net/ethernet/stmicro/built-in.a
CC drivers/gpu/drm/i915/gt/intel_ppgtt.o
CC drivers/gpu/drm/drm_property.o
CC kernel/rseq.o
CC fs/binfmt_elf.o
AR lib/built-in.a
CC [M] drivers/gpu/drm/xe/xe_irq.o
CC net/ipv4/xfrm4_output.o
AR drivers/net/ethernet/sun/built-in.a
CC drivers/gpu/drm/i915/gt/intel_rc6.o
CC drivers/hid/hid-lg-g15.o
CC fs/mbcache.o
CC [M] drivers/gpu/drm/xe/xe_lrc.o
AR drivers/net/ethernet/nvidia/built-in.a
AR drivers/net/ethernet/tehuti/built-in.a
CC drivers/gpu/drm/drm_rect.o
AR drivers/net/ethernet/ti/built-in.a
CC drivers/gpu/drm/i915/gt/intel_region_lmem.o
AR drivers/net/ethernet/vertexcom/built-in.a
CC fs/posix_acl.o
AR drivers/net/ethernet/via/built-in.a
CC [M] drivers/gpu/drm/xe/xe_migrate.o
CC net/ipv4/xfrm4_protocol.o
CC drivers/gpu/drm/drm_syncobj.o
CC drivers/hid/hid-microsoft.o
CC drivers/gpu/drm/i915/gt/intel_renderstate.o
CC fs/coredump.o
AR arch/x86/kernel/built-in.a
AR arch/x86/built-in.a
CC drivers/hid/hid-monterey.o
AR drivers/net/ethernet/wangxun/built-in.a
AR drivers/net/ethernet/wiznet/built-in.a
CC [M] drivers/gpu/drm/xe/xe_mmio.o
CC drivers/hid/hid-ntrig.o
CC fs/drop_caches.o
AR drivers/net/ethernet/xilinx/built-in.a
CC drivers/gpu/drm/drm_sysfs.o
AR drivers/net/ethernet/xircom/built-in.a
CC drivers/hid/hid-pl.o
AR drivers/net/ethernet/synopsys/built-in.a
CC drivers/gpu/drm/i915/gt/intel_reset.o
AR drivers/net/ethernet/pensando/built-in.a
CC fs/sysctls.o
CC drivers/hid/hid-petalynx.o
CC drivers/gpu/drm/drm_trace_points.o
AR drivers/acpi/built-in.a
CC fs/fhandle.o
CC drivers/hid/hid-redragon.o
CC [M] drivers/gpu/drm/xe/xe_mocs.o
CC drivers/gpu/drm/i915/gt/intel_ring.o
CC drivers/gpu/drm/drm_vblank.o
CC [M] drivers/gpu/drm/xe/xe_module.o
CC drivers/gpu/drm/i915/gt/intel_ring_submission.o
CC drivers/hid/hid-samsung.o
CC drivers/gpu/drm/drm_vblank_work.o
CC [M] drivers/gpu/drm/xe/xe_oa.o
CC [M] drivers/gpu/drm/xe/xe_observation.o
AR kernel/built-in.a
CC drivers/hid/hid-sony.o
CC drivers/gpu/drm/i915/gt/intel_rps.o
CC drivers/gpu/drm/drm_vma_manager.o
CC [M] drivers/gpu/drm/xe/xe_pat.o
CC drivers/gpu/drm/drm_writeback.o
CC drivers/hid/hid-sunplus.o
CC drivers/gpu/drm/i915/gt/intel_sa_media.o
CC [M] drivers/gpu/drm/xe/xe_pci.o
CC drivers/gpu/drm/i915/gt/intel_sseu.o
CC drivers/gpu/drm/drm_panel.o
CC drivers/hid/hid-topseed.o
CC drivers/gpu/drm/drm_pci.o
CC drivers/gpu/drm/drm_debugfs.o
CC [M] drivers/gpu/drm/xe/xe_pcode.o
CC drivers/gpu/drm/i915/gt/intel_sseu_debugfs.o
CC [M] drivers/gpu/drm/xe/xe_pm.o
CC drivers/gpu/drm/drm_debugfs_crc.o
CC drivers/gpu/drm/i915/gt/intel_timeline.o
CC [M] drivers/gpu/drm/xe/xe_preempt_fence.o
AR drivers/net/ethernet/realtek/built-in.a
CC drivers/gpu/drm/drm_panel_orientation_quirks.o
CC drivers/gpu/drm/i915/gt/intel_tlb.o
CC [M] drivers/gpu/drm/xe/xe_pt.o
CC drivers/gpu/drm/drm_buddy.o
CC drivers/gpu/drm/drm_gem_shmem_helper.o
CC drivers/gpu/drm/i915/gt/intel_wopcm.o
CC [M] drivers/gpu/drm/xe/xe_pt_walk.o
CC drivers/gpu/drm/drm_atomic_helper.o
CC [M] drivers/gpu/drm/xe/xe_query.o
CC drivers/gpu/drm/drm_atomic_state_helper.o
CC drivers/gpu/drm/i915/gt/intel_workarounds.o
AR net/ipv4/built-in.a
AR net/built-in.a
CC [M] drivers/gpu/drm/xe/xe_range_fence.o
CC drivers/gpu/drm/i915/gt/shmem_utils.o
CC drivers/gpu/drm/drm_crtc_helper.o
CC drivers/gpu/drm/drm_damage_helper.o
CC drivers/gpu/drm/i915/gt/sysfs_engines.o
CC drivers/gpu/drm/i915/gt/intel_ggtt_gmch.o
CC [M] drivers/gpu/drm/xe/xe_reg_sr.o
CC drivers/gpu/drm/drm_flip_work.o
CC drivers/gpu/drm/i915/gt/gen6_renderstate.o
CC drivers/gpu/drm/drm_format_helper.o
CC [M] drivers/gpu/drm/xe/xe_reg_whitelist.o
CC drivers/gpu/drm/i915/gt/gen7_renderstate.o
CC drivers/gpu/drm/drm_gem_atomic_helper.o
CC drivers/gpu/drm/i915/gt/gen8_renderstate.o
CC drivers/gpu/drm/drm_gem_framebuffer_helper.o
CC drivers/gpu/drm/i915/gt/gen9_renderstate.o
CC drivers/gpu/drm/i915/gem/i915_gem_busy.o
CC [M] drivers/gpu/drm/xe/xe_rtp.o
CC drivers/gpu/drm/i915/gem/i915_gem_clflush.o
CC drivers/gpu/drm/drm_kms_helper_common.o
CC [M] drivers/gpu/drm/xe/xe_ring_ops.o
AR fs/built-in.a
CC drivers/gpu/drm/i915/gem/i915_gem_context.o
AR drivers/net/ethernet/intel/e1000e/built-in.a
CC drivers/gpu/drm/i915/gem/i915_gem_create.o
AR drivers/net/ethernet/intel/built-in.a
CC drivers/gpu/drm/drm_modeset_helper.o
CC [M] drivers/gpu/drm/xe/xe_sa.o
AR drivers/hid/built-in.a
AR drivers/net/ethernet/built-in.a
CC [M] drivers/gpu/drm/xe/xe_sched_job.o
CC drivers/gpu/drm/drm_plane_helper.o
CC drivers/gpu/drm/i915/gem/i915_gem_dmabuf.o
CC drivers/gpu/drm/i915/gem/i915_gem_domain.o
CC [M] drivers/gpu/drm/xe/xe_shrinker.o
AR drivers/net/built-in.a
CC [M] drivers/gpu/drm/xe/xe_step.o
CC [M] drivers/gpu/drm/xe/xe_survivability_mode.o
CC drivers/gpu/drm/i915/gem/i915_gem_execbuffer.o
CC drivers/gpu/drm/i915/gem/i915_gem_internal.o
CC drivers/gpu/drm/drm_probe_helper.o
CC drivers/gpu/drm/i915/gem/i915_gem_lmem.o
CC drivers/gpu/drm/drm_self_refresh_helper.o
CC drivers/gpu/drm/i915/gem/i915_gem_mman.o
CC drivers/gpu/drm/drm_simple_kms_helper.o
CC [M] drivers/gpu/drm/xe/xe_sync.o
CC [M] drivers/gpu/drm/xe/xe_tile.o
CC drivers/gpu/drm/bridge/panel.o
CC [M] drivers/gpu/drm/xe/xe_tile_sysfs.o
CC [M] drivers/gpu/drm/xe/xe_trace.o
CC drivers/gpu/drm/i915/gem/i915_gem_object.o
CC drivers/gpu/drm/drm_mipi_dsi.o
CC drivers/gpu/drm/i915/gem/i915_gem_pages.o
CC [M] drivers/gpu/drm/xe/xe_trace_bo.o
CC [M] drivers/gpu/drm/drm_exec.o
CC [M] drivers/gpu/drm/xe/xe_trace_guc.o
CC drivers/gpu/drm/i915/gem/i915_gem_phys.o
CC [M] drivers/gpu/drm/drm_gpuvm.o
CC drivers/gpu/drm/i915/gem/i915_gem_pm.o
CC [M] drivers/gpu/drm/xe/xe_trace_lrc.o
CC [M] drivers/gpu/drm/drm_suballoc.o
CC drivers/gpu/drm/i915/gem/i915_gem_region.o
CC drivers/gpu/drm/i915/gem/i915_gem_shmem.o
CC drivers/gpu/drm/i915/gem/i915_gem_shrinker.o
CC [M] drivers/gpu/drm/drm_gem_ttm_helper.o
CC [M] drivers/gpu/drm/xe/xe_ttm_sys_mgr.o
CC drivers/gpu/drm/i915/gem/i915_gem_stolen.o
CC [M] drivers/gpu/drm/xe/xe_ttm_stolen_mgr.o
CC drivers/gpu/drm/i915/gem/i915_gem_throttle.o
CC [M] drivers/gpu/drm/xe/xe_ttm_vram_mgr.o
CC [M] drivers/gpu/drm/xe/xe_tuning.o
CC [M] drivers/gpu/drm/xe/xe_uc.o
CC drivers/gpu/drm/i915/gem/i915_gem_tiling.o
CC [M] drivers/gpu/drm/xe/xe_uc_fw.o
CC drivers/gpu/drm/i915/gem/i915_gem_ttm.o
CC [M] drivers/gpu/drm/xe/xe_vm.o
CC drivers/gpu/drm/i915/gem/i915_gem_ttm_move.o
CC drivers/gpu/drm/i915/gem/i915_gem_ttm_pm.o
CC [M] drivers/gpu/drm/xe/xe_vram.o
CC [M] drivers/gpu/drm/xe/xe_vram_freq.o
CC drivers/gpu/drm/i915/gem/i915_gem_userptr.o
CC [M] drivers/gpu/drm/xe/xe_vsec.o
CC drivers/gpu/drm/i915/gem/i915_gem_wait.o
CC [M] drivers/gpu/drm/xe/xe_wait_user_fence.o
CC drivers/gpu/drm/i915/gem/i915_gemfs.o
CC drivers/gpu/drm/i915/i915_active.o
CC [M] drivers/gpu/drm/xe/xe_wa.o
LD [M] drivers/gpu/drm/drm_suballoc_helper.o
CC drivers/gpu/drm/i915/i915_cmd_parser.o
CC drivers/gpu/drm/i915/i915_deps.o
CC drivers/gpu/drm/i915/i915_gem.o
CC [M] drivers/gpu/drm/xe/xe_wopcm.o
CC [M] drivers/gpu/drm/xe/xe_hmm.o
CC [M] drivers/gpu/drm/xe/xe_hwmon.o
CC [M] drivers/gpu/drm/xe/xe_pmu.o
LD [M] drivers/gpu/drm/drm_ttm_helper.o
CC drivers/gpu/drm/i915/i915_gem_evict.o
CC [M] drivers/gpu/drm/xe/xe_gt_sriov_vf.o
CC [M] drivers/gpu/drm/xe/xe_guc_relay.o
CC [M] drivers/gpu/drm/xe/xe_memirq.o
CC [M] drivers/gpu/drm/xe/xe_sriov.o
CC drivers/gpu/drm/i915/i915_gem_gtt.o
CC [M] drivers/gpu/drm/xe/xe_sriov_vf.o
CC drivers/gpu/drm/i915/i915_gem_ww.o
CC [M] drivers/gpu/drm/xe/display/ext/i915_irq.o
CC drivers/gpu/drm/i915/i915_query.o
CC [M] drivers/gpu/drm/xe/display/ext/i915_utils.o
CC drivers/gpu/drm/i915/i915_request.o
CC [M] drivers/gpu/drm/xe/display/intel_bo.o
CC drivers/gpu/drm/i915/i915_scheduler.o
CC drivers/gpu/drm/i915/i915_trace_points.o
CC [M] drivers/gpu/drm/xe/display/intel_fb_bo.o
CC [M] drivers/gpu/drm/xe/display/intel_fbdev_fb.o
CC drivers/gpu/drm/i915/i915_ttm_buddy_manager.o
CC [M] drivers/gpu/drm/xe/display/xe_display.o
CC drivers/gpu/drm/i915/i915_vma.o
CC drivers/gpu/drm/i915/i915_vma_resource.o
CC [M] drivers/gpu/drm/xe/display/xe_display_misc.o
CC drivers/gpu/drm/i915/gt/uc/intel_gsc_fw.o
CC [M] drivers/gpu/drm/xe/display/xe_display_rps.o
CC drivers/gpu/drm/i915/gt/uc/intel_gsc_proxy.o
CC [M] drivers/gpu/drm/xe/display/xe_display_wa.o
CC drivers/gpu/drm/i915/gt/uc/intel_gsc_uc.o
CC [M] drivers/gpu/drm/xe/display/xe_dsb_buffer.o
CC drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_debugfs.o
CC drivers/gpu/drm/i915/gt/uc/intel_gsc_uc_heci_cmd_submit.o
CC drivers/gpu/drm/i915/gt/uc/intel_guc.o
CC drivers/gpu/drm/i915/gt/uc/intel_guc_ads.o
CC [M] drivers/gpu/drm/xe/display/xe_fb_pin.o
CC drivers/gpu/drm/i915/gt/uc/intel_guc_capture.o
CC [M] drivers/gpu/drm/xe/display/xe_hdcp_gsc.o
CC drivers/gpu/drm/i915/gt/uc/intel_guc_ct.o
CC [M] drivers/gpu/drm/xe/display/xe_plane_initial.o
CC [M] drivers/gpu/drm/xe/display/xe_tdf.o
CC drivers/gpu/drm/i915/gt/uc/intel_guc_debugfs.o
CC [M] drivers/gpu/drm/xe/i915-soc/intel_dram.o
CC drivers/gpu/drm/i915/gt/uc/intel_guc_fw.o
CC drivers/gpu/drm/i915/gt/uc/intel_guc_hwconfig.o
CC drivers/gpu/drm/i915/gt/uc/intel_guc_log.o
CC [M] drivers/gpu/drm/xe/i915-soc/intel_pch.o
CC [M] drivers/gpu/drm/xe/i915-soc/intel_rom.o
CC [M] drivers/gpu/drm/xe/i915-display/icl_dsi.o
CC drivers/gpu/drm/i915/gt/uc/intel_guc_log_debugfs.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_alpm.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_atomic.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_atomic_plane.o
CC drivers/gpu/drm/i915/gt/uc/intel_guc_rc.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_audio.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_backlight.o
CC drivers/gpu/drm/i915/gt/uc/intel_guc_slpc.o
CC drivers/gpu/drm/i915/gt/uc/intel_guc_submission.o
CC drivers/gpu/drm/i915/gt/uc/intel_huc.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_bios.o
CC drivers/gpu/drm/i915/gt/uc/intel_huc_debugfs.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_bw.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_cdclk.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_cmtg.o
CC drivers/gpu/drm/i915/gt/uc/intel_huc_fw.o
CC drivers/gpu/drm/i915/gt/uc/intel_uc.o
CC drivers/gpu/drm/i915/gt/uc/intel_uc_debugfs.o
CC drivers/gpu/drm/i915/gt/uc/intel_uc_fw.o
CC drivers/gpu/drm/i915/gt/intel_gsc.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_color.o
CC drivers/gpu/drm/i915/i915_hwmon.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_combo_phy.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_connector.o
CC drivers/gpu/drm/i915/display/hsw_ips.o
CC drivers/gpu/drm/i915/display/i9xx_plane.o
CC drivers/gpu/drm/i915/display/i9xx_display_sr.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_crtc.o
CC drivers/gpu/drm/i915/display/i9xx_wm.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_crtc_state_dump.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_cursor.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_cx0_phy.o
CC drivers/gpu/drm/i915/display/intel_alpm.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_ddi.o
CC drivers/gpu/drm/i915/display/intel_atomic.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_ddi_buf_trans.o
CC drivers/gpu/drm/i915/display/intel_atomic_plane.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_display.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_display_conversion.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_display_device.o
CC drivers/gpu/drm/i915/display/intel_audio.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_display_driver.o
CC drivers/gpu/drm/i915/display/intel_bios.o
CC drivers/gpu/drm/i915/display/intel_bo.o
CC drivers/gpu/drm/i915/display/intel_bw.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_display_irq.o
CC drivers/gpu/drm/i915/display/intel_cdclk.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_display_params.o
CC drivers/gpu/drm/i915/display/intel_cmtg.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_display_power.o
CC drivers/gpu/drm/i915/display/intel_color.o
CC drivers/gpu/drm/i915/display/intel_combo_phy.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_display_power_map.o
CC drivers/gpu/drm/i915/display/intel_connector.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_display_power_well.o
CC drivers/gpu/drm/i915/display/intel_crtc.o
CC drivers/gpu/drm/i915/display/intel_crtc_state_dump.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_display_trace.o
CC drivers/gpu/drm/i915/display/intel_cursor.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_display_wa.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_dkl_phy.o
CC drivers/gpu/drm/i915/display/intel_display.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_dmc.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_dp.o
CC drivers/gpu/drm/i915/display/intel_display_conversion.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_dp_aux.o
CC drivers/gpu/drm/i915/display/intel_display_driver.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_dp_aux_backlight.o
CC drivers/gpu/drm/i915/display/intel_display_irq.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_dp_hdcp.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_dp_link_training.o
CC drivers/gpu/drm/i915/display/intel_display_params.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_dp_mst.o
CC drivers/gpu/drm/i915/display/intel_display_power.o
CC drivers/gpu/drm/i915/display/intel_display_power_map.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_dp_test.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_dpll.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_dpll_mgr.o
CC drivers/gpu/drm/i915/display/intel_display_power_well.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_dpt_common.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_drrs.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_dsb.o
CC drivers/gpu/drm/i915/display/intel_display_reset.o
CC drivers/gpu/drm/i915/display/intel_display_rps.o
CC drivers/gpu/drm/i915/display/intel_display_snapshot.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_dsi.o
CC drivers/gpu/drm/i915/display/intel_display_wa.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_dsi_dcs_backlight.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_dsi_vbt.o
CC drivers/gpu/drm/i915/display/intel_dmc.o
CC drivers/gpu/drm/i915/display/intel_dmc_wl.o
CC drivers/gpu/drm/i915/display/intel_dpio_phy.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_encoder.o
CC drivers/gpu/drm/i915/display/intel_dpll.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_fb.o
CC drivers/gpu/drm/i915/display/intel_dpll_mgr.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_fbc.o
CC drivers/gpu/drm/i915/display/intel_dpt.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_fdi.o
CC drivers/gpu/drm/i915/display/intel_dpt_common.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_fifo_underrun.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_frontbuffer.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_global_state.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_gmbus.o
CC drivers/gpu/drm/i915/display/intel_drrs.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_hdcp.o
CC drivers/gpu/drm/i915/display/intel_dsb.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_hdcp_gsc_message.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_hdmi.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_hotplug.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_hotplug_irq.o
CC drivers/gpu/drm/i915/display/intel_dsb_buffer.o
CC drivers/gpu/drm/i915/display/intel_fb.o
CC drivers/gpu/drm/i915/display/intel_fb_bo.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_hti.o
CC drivers/gpu/drm/i915/display/intel_fb_pin.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_link_bw.o
CC drivers/gpu/drm/i915/display/intel_fbc.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_lspcon.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_modeset_lock.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_modeset_setup.o
CC drivers/gpu/drm/i915/display/intel_fdi.o
CC drivers/gpu/drm/i915/display/intel_fifo_underrun.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_modeset_verify.o
CC drivers/gpu/drm/i915/display/intel_frontbuffer.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_panel.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_pfit.o
CC drivers/gpu/drm/i915/display/intel_global_state.o
CC drivers/gpu/drm/i915/display/intel_hdcp.o
CC drivers/gpu/drm/i915/display/intel_hdcp_gsc.o
CC drivers/gpu/drm/i915/display/intel_hdcp_gsc_message.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_pmdemand.o
CC drivers/gpu/drm/i915/display/intel_hotplug.o
CC drivers/gpu/drm/i915/display/intel_hotplug_irq.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_pps.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_psr.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_qp_tables.o
CC drivers/gpu/drm/i915/display/intel_hti.o
CC drivers/gpu/drm/i915/display/intel_link_bw.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_quirks.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_snps_hdmi_pll.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_snps_phy.o
CC drivers/gpu/drm/i915/display/intel_load_detect.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_tc.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_vblank.o
CC drivers/gpu/drm/i915/display/intel_lpe_audio.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_vdsc.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_vga.o
CC drivers/gpu/drm/i915/display/intel_modeset_lock.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_vrr.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_dmc_wl.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_wm.o
CC drivers/gpu/drm/i915/display/intel_modeset_setup.o
CC drivers/gpu/drm/i915/display/intel_modeset_verify.o
CC [M] drivers/gpu/drm/xe/i915-display/skl_scaler.o
CC drivers/gpu/drm/i915/display/intel_overlay.o
CC [M] drivers/gpu/drm/xe/i915-display/skl_universal_plane.o
CC drivers/gpu/drm/i915/display/intel_pch_display.o
CC [M] drivers/gpu/drm/xe/i915-display/skl_watermark.o
CC drivers/gpu/drm/i915/display/intel_pch_refclk.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_acpi.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_opregion.o
CC [M] drivers/gpu/drm/xe/xe_debugfs.o
CC [M] drivers/gpu/drm/xe/xe_gt_debugfs.o
CC drivers/gpu/drm/i915/display/intel_plane_initial.o
CC drivers/gpu/drm/i915/display/intel_pmdemand.o
CC drivers/gpu/drm/i915/display/intel_psr.o
CC drivers/gpu/drm/i915/display/intel_quirks.o
CC [M] drivers/gpu/drm/xe/xe_gt_sriov_vf_debugfs.o
CC drivers/gpu/drm/i915/display/intel_sprite.o
CC [M] drivers/gpu/drm/xe/xe_gt_stats.o
CC drivers/gpu/drm/i915/display/intel_sprite_uapi.o
CC drivers/gpu/drm/i915/display/intel_tc.o
CC drivers/gpu/drm/i915/display/intel_vblank.o
CC [M] drivers/gpu/drm/xe/xe_guc_debugfs.o
CC drivers/gpu/drm/i915/display/intel_vga.o
CC drivers/gpu/drm/i915/display/intel_wm.o
CC [M] drivers/gpu/drm/xe/xe_huc_debugfs.o
CC drivers/gpu/drm/i915/display/skl_scaler.o
CC [M] drivers/gpu/drm/xe/xe_uc_debugfs.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_display_debugfs.o
CC drivers/gpu/drm/i915/display/skl_universal_plane.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_display_debugfs_params.o
CC drivers/gpu/drm/i915/display/skl_watermark.o
CC [M] drivers/gpu/drm/xe/i915-display/intel_pipe_crc.o
CC drivers/gpu/drm/i915/display/intel_acpi.o
CC drivers/gpu/drm/i915/display/intel_opregion.o
CC drivers/gpu/drm/i915/display/intel_display_debugfs.o
CC drivers/gpu/drm/i915/display/intel_display_debugfs_params.o
CC drivers/gpu/drm/i915/display/intel_pipe_crc.o
CC drivers/gpu/drm/i915/display/dvo_ch7017.o
CC drivers/gpu/drm/i915/display/dvo_ch7xxx.o
CC drivers/gpu/drm/i915/display/dvo_ivch.o
CC drivers/gpu/drm/i915/display/dvo_ns2501.o
CC drivers/gpu/drm/i915/display/dvo_sil164.o
CC drivers/gpu/drm/i915/display/dvo_tfp410.o
CC drivers/gpu/drm/i915/display/g4x_dp.o
CC drivers/gpu/drm/i915/display/g4x_hdmi.o
CC drivers/gpu/drm/i915/display/icl_dsi.o
CC drivers/gpu/drm/i915/display/intel_backlight.o
CC drivers/gpu/drm/i915/display/intel_crt.o
CC drivers/gpu/drm/i915/display/intel_cx0_phy.o
CC drivers/gpu/drm/i915/display/intel_ddi.o
CC drivers/gpu/drm/i915/display/intel_ddi_buf_trans.o
CC drivers/gpu/drm/i915/display/intel_display_device.o
CC drivers/gpu/drm/i915/display/intel_display_trace.o
CC drivers/gpu/drm/i915/display/intel_dkl_phy.o
CC drivers/gpu/drm/i915/display/intel_dp.o
CC drivers/gpu/drm/i915/display/intel_dp_aux.o
CC drivers/gpu/drm/i915/display/intel_dp_aux_backlight.o
CC drivers/gpu/drm/i915/display/intel_dp_hdcp.o
CC drivers/gpu/drm/i915/display/intel_dp_link_training.o
CC drivers/gpu/drm/i915/display/intel_dp_mst.o
CC drivers/gpu/drm/i915/display/intel_dp_test.o
CC drivers/gpu/drm/i915/display/intel_dsi.o
CC drivers/gpu/drm/i915/display/intel_dsi_dcs_backlight.o
CC drivers/gpu/drm/i915/display/intel_dsi_vbt.o
CC drivers/gpu/drm/i915/display/intel_dvo.o
CC drivers/gpu/drm/i915/display/intel_encoder.o
CC drivers/gpu/drm/i915/display/intel_gmbus.o
CC drivers/gpu/drm/i915/display/intel_hdmi.o
CC drivers/gpu/drm/i915/display/intel_lspcon.o
CC drivers/gpu/drm/i915/display/intel_lvds.o
CC drivers/gpu/drm/i915/display/intel_panel.o
CC drivers/gpu/drm/i915/display/intel_pfit.o
CC drivers/gpu/drm/i915/display/intel_pps.o
CC drivers/gpu/drm/i915/display/intel_qp_tables.o
CC drivers/gpu/drm/i915/display/intel_sdvo.o
CC drivers/gpu/drm/i915/display/intel_snps_hdmi_pll.o
CC drivers/gpu/drm/i915/display/intel_snps_phy.o
CC drivers/gpu/drm/i915/display/intel_tv.o
CC drivers/gpu/drm/i915/display/intel_vdsc.o
CC drivers/gpu/drm/i915/display/intel_vrr.o
CC drivers/gpu/drm/i915/display/vlv_dsi.o
CC drivers/gpu/drm/i915/display/vlv_dsi_pll.o
CC drivers/gpu/drm/i915/i915_perf.o
CC drivers/gpu/drm/i915/pxp/intel_pxp.o
CC drivers/gpu/drm/i915/pxp/intel_pxp_huc.o
CC drivers/gpu/drm/i915/pxp/intel_pxp_tee.o
CC drivers/gpu/drm/i915/i915_gpu_error.o
CC drivers/gpu/drm/i915/i915_vgpu.o
LD [M] drivers/gpu/drm/xe/xe.o
AR drivers/gpu/drm/i915/built-in.a
AR drivers/gpu/drm/built-in.a
AR drivers/gpu/built-in.a
AR drivers/built-in.a
AR built-in.a
AR vmlinux.a
LD vmlinux.o
OBJCOPY modules.builtin.modinfo
GEN modules.builtin
MODPOST Module.symvers
CC .vmlinux.export.o
CC [M] fs/efivarfs/efivarfs.mod.o
CC [M] .module-common.o
CC [M] drivers/gpu/drm/drm_exec.mod.o
CC [M] drivers/gpu/drm/drm_gpuvm.mod.o
CC [M] drivers/gpu/drm/drm_suballoc_helper.mod.o
CC [M] drivers/gpu/drm/drm_ttm_helper.mod.o
CC [M] drivers/gpu/drm/scheduler/gpu-sched.mod.o
CC [M] drivers/gpu/drm/xe/xe.mod.o
CC [M] drivers/thermal/intel/x86_pkg_temp_thermal.mod.o
CC [M] net/netfilter/nf_log_syslog.mod.o
CC [M] net/netfilter/xt_mark.mod.o
CC [M] net/netfilter/xt_nat.mod.o
CC [M] net/netfilter/xt_LOG.mod.o
CC [M] net/netfilter/xt_MASQUERADE.mod.o
CC [M] net/netfilter/xt_addrtype.mod.o
CC [M] net/ipv4/netfilter/iptable_nat.mod.o
LD [M] drivers/gpu/drm/drm_exec.ko
LD [M] drivers/gpu/drm/drm_suballoc_helper.ko
LD [M] net/netfilter/nf_log_syslog.ko
LD [M] drivers/gpu/drm/scheduler/gpu-sched.ko
LD [M] drivers/thermal/intel/x86_pkg_temp_thermal.ko
LD [M] drivers/gpu/drm/xe/xe.ko
LD [M] drivers/gpu/drm/drm_gpuvm.ko
LD [M] drivers/gpu/drm/drm_ttm_helper.ko
LD [M] net/netfilter/xt_nat.ko
LD [M] net/netfilter/xt_LOG.ko
LD [M] fs/efivarfs/efivarfs.ko
LD [M] net/netfilter/xt_MASQUERADE.ko
LD [M] net/netfilter/xt_addrtype.ko
LD [M] net/netfilter/xt_mark.ko
LD [M] net/ipv4/netfilter/iptable_nat.ko
UPD include/generated/utsversion.h
CC init/version-timestamp.o
KSYMS .tmp_vmlinux0.kallsyms.S
AS .tmp_vmlinux0.kallsyms.o
LD .tmp_vmlinux1
NM .tmp_vmlinux1.syms
KSYMS .tmp_vmlinux1.kallsyms.S
AS .tmp_vmlinux1.kallsyms.o
LD .tmp_vmlinux2
NM .tmp_vmlinux2.syms
KSYMS .tmp_vmlinux2.kallsyms.S
AS .tmp_vmlinux2.kallsyms.o
LD vmlinux
NM System.map
SORTTAB vmlinux
RELOCS arch/x86/boot/compressed/vmlinux.relocs
RSTRIP vmlinux
CC arch/x86/boot/a20.o
AS arch/x86/boot/bioscall.o
CC arch/x86/boot/cmdline.o
AS arch/x86/boot/copy.o
HOSTCC arch/x86/boot/mkcpustr
CC arch/x86/boot/cpuflags.o
CC arch/x86/boot/cpucheck.o
CC arch/x86/boot/early_serial_console.o
CC arch/x86/boot/edd.o
CC arch/x86/boot/main.o
CC arch/x86/boot/memory.o
CC arch/x86/boot/pm.o
AS arch/x86/boot/pmjump.o
CC arch/x86/boot/printf.o
CC arch/x86/boot/regs.o
CC arch/x86/boot/string.o
CC arch/x86/boot/tty.o
CC arch/x86/boot/video.o
CC arch/x86/boot/video-mode.o
CC arch/x86/boot/version.o
CC arch/x86/boot/video-vga.o
CC arch/x86/boot/video-vesa.o
CC arch/x86/boot/video-bios.o
HOSTCC arch/x86/boot/tools/build
CPUSTR arch/x86/boot/cpustr.h
CC arch/x86/boot/cpu.o
LDS arch/x86/boot/compressed/vmlinux.lds
AS arch/x86/boot/compressed/kernel_info.o
AS arch/x86/boot/compressed/head_32.o
VOFFSET arch/x86/boot/compressed/../voffset.h
CC arch/x86/boot/compressed/string.o
CC arch/x86/boot/compressed/cmdline.o
CC arch/x86/boot/compressed/error.o
OBJCOPY arch/x86/boot/compressed/vmlinux.bin
HOSTCC arch/x86/boot/compressed/mkpiggy
CC arch/x86/boot/compressed/cpuflags.o
CC arch/x86/boot/compressed/early_serial_console.o
CC arch/x86/boot/compressed/kaslr.o
CC arch/x86/boot/compressed/acpi.o
CC arch/x86/boot/compressed/efi.o
GZIP arch/x86/boot/compressed/vmlinux.bin.gz
CC arch/x86/boot/compressed/misc.o
MKPIGGY arch/x86/boot/compressed/piggy.S
AS arch/x86/boot/compressed/piggy.o
LD arch/x86/boot/compressed/vmlinux
ZOFFSET arch/x86/boot/zoffset.h
OBJCOPY arch/x86/boot/vmlinux.bin
AS arch/x86/boot/header.o
LD arch/x86/boot/setup.elf
OBJCOPY arch/x86/boot/setup.bin
BUILD arch/x86/boot/bzImage
Kernel: arch/x86/boot/bzImage is ready (#1)
run-parts: executing /workspace/ci/hooks/20-kernel-doc
+ SRC_DIR=/workspace/kernel
+ cd /workspace/kernel
+ xargs ./scripts/kernel-doc -Werror -none include/uapi/drm/xe_drm.h
+ find drivers/gpu/drm/xe/ -name '*.[ch]' -not -path 'drivers/gpu/drm/xe/display/*'
All hooks done
^ permalink raw reply [flat|nested] 26+ messages in thread* ✗ CI.checksparse: warning for TTM shrinker helpers and xe buffer object shrinker (rev17)
2025-01-30 10:13 [PATCH v16 0/7] TTM shrinker helpers and xe buffer object shrinker Thomas Hellström
` (11 preceding siblings ...)
2025-01-30 11:16 ` ✓ CI.Hooks: " Patchwork
@ 2025-01-30 11:27 ` Patchwork
2025-01-30 11:40 ` ✓ Xe.CI.BAT: success " Patchwork
2025-01-30 13:47 ` ✗ Xe.CI.Full: failure " Patchwork
14 siblings, 0 replies; 26+ messages in thread
From: Patchwork @ 2025-01-30 11:27 UTC (permalink / raw)
To: Thomas Hellström; +Cc: intel-xe
== Series Details ==
Series: TTM shrinker helpers and xe buffer object shrinker (rev17)
URL : https://patchwork.freedesktop.org/series/131815/
State : warning
== Summary ==
+ trap cleanup EXIT
+ KERNEL=/kernel
+ MT=/root/linux/maintainer-tools
+ git clone https://gitlab.freedesktop.org/drm/maintainer-tools /root/linux/maintainer-tools
Cloning into '/root/linux/maintainer-tools'...
warning: redirecting to https://gitlab.freedesktop.org/drm/maintainer-tools.git/
+ make -C /root/linux/maintainer-tools
make: Entering directory '/root/linux/maintainer-tools'
cc -O2 -g -Wextra -o remap-log remap-log.c
make: Leaving directory '/root/linux/maintainer-tools'
+ cd /kernel
+ git config --global --add safe.directory /kernel
+ /root/linux/maintainer-tools/dim sparse --fast c2a5da40b8b1c5af77dcdabed8516069949fea3b
Sparse version: 0.6.4 (Ubuntu: 0.6.4-4ubuntu3)
Fast mode used, each commit won't be checked separately.
-
+drivers/gpu/drm/i915/display/intel_cdclk.c: note: in included file:
+drivers/gpu/drm/i915/display/intel_ddi.c: note: in included file:
+drivers/gpu/drm/i915/display/intel_display_types.h:1966:24: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/display/intel_display_types.h:1966:24: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/display/intel_display_types.h:1966:24: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/display/intel_display_types.h:1966:24: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/display/intel_display_types.h:1966:24: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/display/intel_display_types.h:1966:24: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/display/intel_display_types.h:1966:24: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/display/intel_display_types.h:1966:24: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/display/intel_display_types.h:1966:24: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/display/intel_display_types.h:1966:24: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/display/intel_display_types.h:1966:24: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/display/intel_display_types.h:1966:24: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/display/intel_display_types.h:1979:24: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/display/intel_display_types.h:1979:24: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/display/intel_hdcp.c: note: in included file:
+drivers/gpu/drm/i915/display/intel_pps.c: note: in included file:
+drivers/gpu/drm/i915/display/intel_psr.c: note: in included file:
+drivers/gpu/drm/i915/display/intel_snps_hdmi_pll.c:106:17: warning: cast truncates bits from constant value (e8d4a51000 becomes d4a51000)
+drivers/gpu/drm/i915/gt/intel_reset.c:1544:12: warning: context imbalance in '_intel_gt_reset_lock' - different lock contexts for basic block
+drivers/gpu/drm/i915/i915_active.c:1063:16: warning: context imbalance in '__i915_active_fence_set' - different lock contexts for basic block
+drivers/gpu/drm/i915/i915_drm_client.c:92:9: error: incompatible types in comparison expression (different address spaces):
+drivers/gpu/drm/i915/i915_drm_client.c:92:9: error: incompatible types in comparison expression (different address spaces):
+drivers/gpu/drm/i915/i915_drm_client.c:92:9: expected struct list_head const *list
+drivers/gpu/drm/i915/i915_drm_client.c:92:9: got struct list_head [noderef] __rcu *pos
+drivers/gpu/drm/i915/i915_drm_client.c:92:9: struct list_head *
+drivers/gpu/drm/i915/i915_drm_client.c:92:9: struct list_head *
+drivers/gpu/drm/i915/i915_drm_client.c:92:9: struct list_head [noderef] __rcu *
+drivers/gpu/drm/i915/i915_drm_client.c:92:9: struct list_head [noderef] __rcu *
+drivers/gpu/drm/i915/i915_drm_client.c:92:9: warning: incorrect type in argument 1 (different address spaces)
+drivers/gpu/drm/i915/i915_irq.c:453:9: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/i915_irq.c:453:9: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/i915_irq.c:461:16: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/i915_irq.c:461:16: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/i915_irq.c:466:9: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/i915_irq.c:466:9: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/i915_irq.c:466:9: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/i915_irq.c:503:9: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/i915_irq.c:503:9: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/i915_irq.c:511:16: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/i915_irq.c:511:16: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/i915_irq.c:516:9: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/i915_irq.c:516:9: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/i915_irq.c:516:9: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/i915_irq.c:559:9: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/i915_irq.c:559:9: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/i915_irq.c:562:15: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/i915_irq.c:562:15: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/i915_irq.c:566:9: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/i915_irq.c:566:9: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/i915_irq.c:573:9: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/i915_irq.c:573:9: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/i915_irq.c:573:9: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/i915_irq.c:573:9: warning: unreplaced symbol '<noident>'
+drivers/gpu/drm/i915/intel_uncore.c:1925:1: warning: context imbalance in 'fwtable_read8' - unexpected unlock
+drivers/gpu/drm/i915/intel_uncore.c:1926:1: warning: context imbalance in 'fwtable_read16' - unexpected unlock
+drivers/gpu/drm/i915/intel_uncore.c:1927:1: warning: context imbalance in 'fwtable_read32' - unexpected unlock
+drivers/gpu/drm/i915/intel_uncore.c:1928:1: warning: context imbalance in 'fwtable_read64' - unexpected unlock
+drivers/gpu/drm/i915/intel_uncore.c:1993:1: warning: context imbalance in 'gen6_write8' - unexpected unlock
+drivers/gpu/drm/i915/intel_uncore.c:1994:1: warning: context imbalance in 'gen6_write16' - unexpected unlock
+drivers/gpu/drm/i915/intel_uncore.c:1995:1: warning: context imbalance in 'gen6_write32' - unexpected unlock
+drivers/gpu/drm/i915/intel_uncore.c:2015:1: warning: context imbalance in 'fwtable_write8' - unexpected unlock
+drivers/gpu/drm/i915/intel_uncore.c:2016:1: warning: context imbalance in 'fwtable_write16' - unexpected unlock
+drivers/gpu/drm/i915/intel_uncore.c:2017:1: warning: context imbalance in 'fwtable_write32' - unexpected unlock
+drivers/gpu/drm/i915/intel_wakeref.c:145:19: warning: context imbalance in 'wakeref_auto_timeout' - unexpected unlock
+drivers/gpu/drm/ttm/ttm_bo.c:1194:31: warning: symbol 'ttm_swap_ops' was not declared. Should it be static?
+drivers/gpu/drm/ttm/ttm_bo_util.c:324:38: expected void *virtual
+drivers/gpu/drm/ttm/ttm_bo_util.c:324:38: got void [noderef] __iomem *
+drivers/gpu/drm/ttm/ttm_bo_util.c:324:38: warning: incorrect type in assignment (different address spaces)
+drivers/gpu/drm/ttm/ttm_bo_util.c:327:38: expected void *virtual
+drivers/gpu/drm/ttm/ttm_bo_util.c:327:38: got void [noderef] __iomem *
+drivers/gpu/drm/ttm/ttm_bo_util.c:327:38: warning: incorrect type in assignment (different address spaces)
+drivers/gpu/drm/ttm/ttm_bo_util.c:330:38: expected void *virtual
+drivers/gpu/drm/ttm/ttm_bo_util.c:330:38: got void [noderef] __iomem *
+drivers/gpu/drm/ttm/ttm_bo_util.c:330:38: warning: incorrect type in assignment (different address spaces)
+drivers/gpu/drm/ttm/ttm_bo_util.c:436:28: expected void volatile [noderef] __iomem *addr
+drivers/gpu/drm/ttm/ttm_bo_util.c:436:28: got void *virtual
+drivers/gpu/drm/ttm/ttm_bo_util.c:436:28: warning: incorrect type in argument 1 (different address spaces)
+ cleanup
++ stat -c %u:%g /kernel
+ chown -R 1003:1003 /kernel
^ permalink raw reply [flat|nested] 26+ messages in thread* ✓ Xe.CI.BAT: success for TTM shrinker helpers and xe buffer object shrinker (rev17)
2025-01-30 10:13 [PATCH v16 0/7] TTM shrinker helpers and xe buffer object shrinker Thomas Hellström
` (12 preceding siblings ...)
2025-01-30 11:27 ` ✗ CI.checksparse: warning " Patchwork
@ 2025-01-30 11:40 ` Patchwork
2025-01-30 13:47 ` ✗ Xe.CI.Full: failure " Patchwork
14 siblings, 0 replies; 26+ messages in thread
From: Patchwork @ 2025-01-30 11:40 UTC (permalink / raw)
To: Thomas Hellström; +Cc: intel-xe
[-- Attachment #1: Type: text/plain, Size: 1108 bytes --]
== Series Details ==
Series: TTM shrinker helpers and xe buffer object shrinker (rev17)
URL : https://patchwork.freedesktop.org/series/131815/
State : success
== Summary ==
CI Bug Log - changes from xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b_BAT -> xe-pw-131815v17_BAT
====================================================
Summary
-------
**SUCCESS**
No regressions found.
Participating hosts (9 -> 8)
------------------------------
Missing (1): bat-adlp-vm
Changes
-------
No changes found
Build changes
-------------
* IGT: IGT_8214 -> IGT_8216
* Linux: xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b -> xe-pw-131815v17
IGT_8214: 7a8a3744466fbb89127201077f030033c72df948 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
IGT_8216: b7ebe99077e2a0ae39fff84cdaefa7851a513cb3 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b: c2a5da40b8b1c5af77dcdabed8516069949fea3b
xe-pw-131815v17: 131815v17
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/index.html
[-- Attachment #2: Type: text/html, Size: 1671 bytes --]
^ permalink raw reply [flat|nested] 26+ messages in thread* ✗ Xe.CI.Full: failure for TTM shrinker helpers and xe buffer object shrinker (rev17)
2025-01-30 10:13 [PATCH v16 0/7] TTM shrinker helpers and xe buffer object shrinker Thomas Hellström
` (13 preceding siblings ...)
2025-01-30 11:40 ` ✓ Xe.CI.BAT: success " Patchwork
@ 2025-01-30 13:47 ` Patchwork
14 siblings, 0 replies; 26+ messages in thread
From: Patchwork @ 2025-01-30 13:47 UTC (permalink / raw)
To: Thomas Hellström; +Cc: intel-xe
[-- Attachment #1: Type: text/plain, Size: 141423 bytes --]
== Series Details ==
Series: TTM shrinker helpers and xe buffer object shrinker (rev17)
URL : https://patchwork.freedesktop.org/series/131815/
State : failure
== Summary ==
CI Bug Log - changes from xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b_full -> xe-pw-131815v17_full
====================================================
Summary
-------
**FAILURE**
Serious unknown changes coming with xe-pw-131815v17_full absolutely need to be
verified manually.
If you think the reported changes have nothing to do with the changes
introduced in xe-pw-131815v17_full, please notify your bug team (I915-ci-infra@lists.freedesktop.org) to allow them
to document this new failure mode, which will reduce false positives in CI.
Participating hosts (4 -> 4)
------------------------------
No changes in participating hosts
Possible new issues
-------------------
Here are the unknown changes that may have been introduced in xe-pw-131815v17_full:
### IGT changes ###
#### Possible regressions ####
* igt@kms_frontbuffer_tracking@fbc-1p-primscrn-indfb-pgflip-blt:
- shard-adlp: [PASS][1] -> [DMESG-WARN][2]
[1]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-adlp-6/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-indfb-pgflip-blt.html
[2]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-adlp-2/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-indfb-pgflip-blt.html
* igt@kms_pm_rpm@system-suspend-modeset:
- shard-adlp: NOTRUN -> [DMESG-WARN][3]
[3]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-adlp-4/igt@kms_pm_rpm@system-suspend-modeset.html
#### Warnings ####
* igt@kms_joiner@switch-modeset-ultra-joiner-big-joiner:
- shard-adlp: [SKIP][4] ([Intel XE#2925]) -> [SKIP][5]
[4]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-adlp-8/igt@kms_joiner@switch-modeset-ultra-joiner-big-joiner.html
[5]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-adlp-6/igt@kms_joiner@switch-modeset-ultra-joiner-big-joiner.html
Known issues
------------
Here are the changes found in xe-pw-131815v17_full that come from known issues:
### IGT changes ###
#### Issues hit ####
* igt@kms_async_flips@alternate-sync-async-flip-atomic:
- shard-bmg: [PASS][6] -> [DMESG-FAIL][7] ([Intel XE#4172]) +1 other test dmesg-fail
[6]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-6/igt@kms_async_flips@alternate-sync-async-flip-atomic.html
[7]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-2/igt@kms_async_flips@alternate-sync-async-flip-atomic.html
* igt@kms_async_flips@alternate-sync-async-flip-atomic@pipe-a-dp-2:
- shard-bmg: NOTRUN -> [FAIL][8] ([Intel XE#3718] / [Intel XE#827])
[8]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-2/igt@kms_async_flips@alternate-sync-async-flip-atomic@pipe-a-dp-2.html
* igt@kms_async_flips@async-flip-with-page-flip-events:
- shard-adlp: [PASS][9] -> [DMESG-WARN][10] ([Intel XE#1033]) +3 other tests dmesg-warn
[9]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-adlp-4/igt@kms_async_flips@async-flip-with-page-flip-events.html
[10]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-adlp-8/igt@kms_async_flips@async-flip-with-page-flip-events.html
* igt@kms_async_flips@async-flip-with-page-flip-events@pipe-b-hdmi-a-6-4-mc-ccs:
- shard-dg2-set2: NOTRUN -> [SKIP][11] ([Intel XE#2550] / [Intel XE#3767]) +15 other tests skip
[11]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-463/igt@kms_async_flips@async-flip-with-page-flip-events@pipe-b-hdmi-a-6-4-mc-ccs.html
* igt@kms_async_flips@crc-atomic@pipe-d-hdmi-a-1:
- shard-adlp: [PASS][12] -> [FAIL][13] ([Intel XE#3884]) +1 other test fail
[12]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-adlp-2/igt@kms_async_flips@crc-atomic@pipe-d-hdmi-a-1.html
[13]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-adlp-2/igt@kms_async_flips@crc-atomic@pipe-d-hdmi-a-1.html
* igt@kms_big_fb@4-tiled-16bpp-rotate-0:
- shard-adlp: NOTRUN -> [SKIP][14] ([Intel XE#1124]) +6 other tests skip
[14]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-adlp-4/igt@kms_big_fb@4-tiled-16bpp-rotate-0.html
* igt@kms_big_fb@4-tiled-addfb-size-offset-overflow:
- shard-adlp: NOTRUN -> [SKIP][15] ([Intel XE#607]) +1 other test skip
[15]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-adlp-8/igt@kms_big_fb@4-tiled-addfb-size-offset-overflow.html
* igt@kms_big_fb@4-tiled-max-hw-stride-64bpp-rotate-180-hflip:
- shard-lnl: NOTRUN -> [SKIP][16] ([Intel XE#1407]) +2 other tests skip
[16]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-lnl-2/igt@kms_big_fb@4-tiled-max-hw-stride-64bpp-rotate-180-hflip.html
* igt@kms_big_fb@x-tiled-32bpp-rotate-270:
- shard-adlp: NOTRUN -> [SKIP][17] ([Intel XE#316])
[17]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-adlp-2/igt@kms_big_fb@x-tiled-32bpp-rotate-270.html
* igt@kms_big_fb@x-tiled-64bpp-rotate-90:
- shard-dg2-set2: NOTRUN -> [SKIP][18] ([Intel XE#316]) +1 other test skip
[18]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-436/igt@kms_big_fb@x-tiled-64bpp-rotate-90.html
* igt@kms_big_fb@y-tiled-max-hw-stride-32bpp-rotate-180-hflip:
- shard-dg2-set2: NOTRUN -> [SKIP][19] ([Intel XE#1124]) +5 other tests skip
[19]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-436/igt@kms_big_fb@y-tiled-max-hw-stride-32bpp-rotate-180-hflip.html
* igt@kms_big_fb@y-tiled-max-hw-stride-64bpp-rotate-0-async-flip:
- shard-adlp: [PASS][20] -> [DMESG-FAIL][21] ([Intel XE#1033]) +8 other tests dmesg-fail
[20]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-adlp-4/igt@kms_big_fb@y-tiled-max-hw-stride-64bpp-rotate-0-async-flip.html
[21]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-adlp-6/igt@kms_big_fb@y-tiled-max-hw-stride-64bpp-rotate-0-async-flip.html
* igt@kms_big_fb@yf-tiled-8bpp-rotate-270:
- shard-lnl: NOTRUN -> [SKIP][22] ([Intel XE#1124]) +4 other tests skip
[22]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-lnl-1/igt@kms_big_fb@yf-tiled-8bpp-rotate-270.html
* igt@kms_bw@linear-tiling-2-displays-3840x2160p:
- shard-dg2-set2: NOTRUN -> [SKIP][23] ([Intel XE#367])
[23]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-463/igt@kms_bw@linear-tiling-2-displays-3840x2160p.html
* igt@kms_ccs@bad-aux-stride-4-tiled-mtl-rc-ccs@pipe-a-dp-2:
- shard-dg2-set2: NOTRUN -> [SKIP][24] ([Intel XE#787]) +244 other tests skip
[24]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-432/igt@kms_ccs@bad-aux-stride-4-tiled-mtl-rc-ccs@pipe-a-dp-2.html
* igt@kms_ccs@bad-aux-stride-y-tiled-gen12-rc-ccs-cc@pipe-d-dp-4:
- shard-dg2-set2: NOTRUN -> [SKIP][25] ([Intel XE#455] / [Intel XE#787]) +38 other tests skip
[25]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-466/igt@kms_ccs@bad-aux-stride-y-tiled-gen12-rc-ccs-cc@pipe-d-dp-4.html
* igt@kms_ccs@bad-rotation-90-4-tiled-dg2-rc-ccs-cc@pipe-a-hdmi-a-6:
- shard-dg2-set2: NOTRUN -> [DMESG-WARN][26] ([Intel XE#1033]) +19 other tests dmesg-warn
[26]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-434/igt@kms_ccs@bad-rotation-90-4-tiled-dg2-rc-ccs-cc@pipe-a-hdmi-a-6.html
* igt@kms_ccs@bad-rotation-90-4-tiled-lnl-ccs@pipe-c-dp-2:
- shard-bmg: NOTRUN -> [SKIP][27] ([Intel XE#2652] / [Intel XE#787]) +15 other tests skip
[27]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-1/igt@kms_ccs@bad-rotation-90-4-tiled-lnl-ccs@pipe-c-dp-2.html
* igt@kms_ccs@crc-primary-basic-4-tiled-bmg-ccs@pipe-c-edp-1:
- shard-lnl: NOTRUN -> [SKIP][28] ([Intel XE#2669]) +3 other tests skip
[28]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-lnl-1/igt@kms_ccs@crc-primary-basic-4-tiled-bmg-ccs@pipe-c-edp-1.html
* igt@kms_ccs@crc-primary-suspend-4-tiled-bmg-ccs:
- shard-dg2-set2: NOTRUN -> [SKIP][29] ([Intel XE#3442])
[29]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-466/igt@kms_ccs@crc-primary-suspend-4-tiled-bmg-ccs.html
* igt@kms_ccs@crc-primary-suspend-4-tiled-bmg-ccs@pipe-d-hdmi-a-3:
- shard-bmg: NOTRUN -> [INCOMPLETE][30] ([Intel XE#3862])
[30]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-4/igt@kms_ccs@crc-primary-suspend-4-tiled-bmg-ccs@pipe-d-hdmi-a-3.html
* igt@kms_ccs@crc-primary-suspend-4-tiled-dg2-mc-ccs:
- shard-adlp: NOTRUN -> [SKIP][31] ([Intel XE#455] / [Intel XE#787]) +17 other tests skip
[31]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-adlp-2/igt@kms_ccs@crc-primary-suspend-4-tiled-dg2-mc-ccs.html
* igt@kms_ccs@crc-primary-suspend-4-tiled-dg2-mc-ccs@pipe-d-dp-2:
- shard-dg2-set2: NOTRUN -> [ABORT][32] ([Intel XE#2625])
[32]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-432/igt@kms_ccs@crc-primary-suspend-4-tiled-dg2-mc-ccs@pipe-d-dp-2.html
* igt@kms_ccs@crc-sprite-planes-basic-4-tiled-dg2-mc-ccs:
- shard-lnl: NOTRUN -> [SKIP][33] ([Intel XE#2887]) +6 other tests skip
[33]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-lnl-6/igt@kms_ccs@crc-sprite-planes-basic-4-tiled-dg2-mc-ccs.html
* igt@kms_ccs@crc-sprite-planes-basic-4-tiled-dg2-mc-ccs@pipe-b-hdmi-a-1:
- shard-adlp: NOTRUN -> [SKIP][34] ([Intel XE#787]) +26 other tests skip
[34]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-adlp-2/igt@kms_ccs@crc-sprite-planes-basic-4-tiled-dg2-mc-ccs@pipe-b-hdmi-a-1.html
* igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs:
- shard-dg2-set2: [PASS][35] -> [INCOMPLETE][36] ([Intel XE#1727] / [Intel XE#3124] / [Intel XE#4010])
[35]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-466/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs.html
[36]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-463/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs.html
* igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs@pipe-c-dp-4:
- shard-dg2-set2: [PASS][37] -> [DMESG-WARN][38] ([Intel XE#1727] / [Intel XE#3113])
[37]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-466/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs@pipe-c-dp-4.html
[38]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-463/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs@pipe-c-dp-4.html
* igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs@pipe-d-hdmi-a-6:
- shard-dg2-set2: [PASS][39] -> [INCOMPLETE][40] ([Intel XE#3124] / [Intel XE#4010])
[39]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-466/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs@pipe-d-hdmi-a-6.html
[40]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-463/igt@kms_ccs@random-ccs-data-4-tiled-dg2-rc-ccs@pipe-d-hdmi-a-6.html
* igt@kms_cdclk@plane-scaling@pipe-b-dp-4:
- shard-dg2-set2: NOTRUN -> [SKIP][41] ([Intel XE#1152]) +3 other tests skip
[41]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-463/igt@kms_cdclk@plane-scaling@pipe-b-dp-4.html
* igt@kms_chamelium_audio@dp-audio:
- shard-lnl: NOTRUN -> [SKIP][42] ([Intel XE#373]) +1 other test skip
[42]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-lnl-1/igt@kms_chamelium_audio@dp-audio.html
* igt@kms_chamelium_audio@dp-audio-edid:
- shard-adlp: NOTRUN -> [SKIP][43] ([Intel XE#373])
[43]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-adlp-4/igt@kms_chamelium_audio@dp-audio-edid.html
* igt@kms_chamelium_color@degamma:
- shard-adlp: NOTRUN -> [SKIP][44] ([Intel XE#306])
[44]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-adlp-4/igt@kms_chamelium_color@degamma.html
- shard-dg2-set2: NOTRUN -> [SKIP][45] ([Intel XE#306]) +2 other tests skip
[45]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-436/igt@kms_chamelium_color@degamma.html
- shard-lnl: NOTRUN -> [SKIP][46] ([Intel XE#306])
[46]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-lnl-5/igt@kms_chamelium_color@degamma.html
* igt@kms_chamelium_frames@hdmi-crc-nonplanar-formats:
- shard-dg2-set2: NOTRUN -> [SKIP][47] ([Intel XE#373]) +3 other tests skip
[47]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-466/igt@kms_chamelium_frames@hdmi-crc-nonplanar-formats.html
* igt@kms_content_protection@atomic@pipe-a-dp-2:
- shard-bmg: NOTRUN -> [FAIL][48] ([Intel XE#1178]) +1 other test fail
[48]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-7/igt@kms_content_protection@atomic@pipe-a-dp-2.html
* igt@kms_content_protection@dp-mst-type-0:
- shard-dg2-set2: NOTRUN -> [SKIP][49] ([Intel XE#307])
[49]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-432/igt@kms_content_protection@dp-mst-type-0.html
* igt@kms_content_protection@srm@pipe-a-dp-4:
- shard-dg2-set2: NOTRUN -> [FAIL][50] ([Intel XE#1178]) +3 other tests fail
[50]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-436/igt@kms_content_protection@srm@pipe-a-dp-4.html
* igt@kms_content_protection@type1:
- shard-lnl: NOTRUN -> [SKIP][51] ([Intel XE#3278])
[51]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-lnl-5/igt@kms_content_protection@type1.html
* igt@kms_content_protection@uevent:
- shard-dg2-set2: NOTRUN -> [FAIL][52] ([Intel XE#1188]) +1 other test fail
[52]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-463/igt@kms_content_protection@uevent.html
* igt@kms_content_protection@uevent@pipe-a-dp-2:
- shard-bmg: NOTRUN -> [FAIL][53] ([Intel XE#1188])
[53]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-7/igt@kms_content_protection@uevent@pipe-a-dp-2.html
* igt@kms_cursor_crc@cursor-random-256x256@pipe-d-dp-2:
- shard-bmg: NOTRUN -> [DMESG-WARN][54] ([Intel XE#4172]) +4 other tests dmesg-warn
[54]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-2/igt@kms_cursor_crc@cursor-random-256x256@pipe-d-dp-2.html
* igt@kms_cursor_crc@cursor-random-32x10:
- shard-dg2-set2: NOTRUN -> [SKIP][55] ([Intel XE#455]) +10 other tests skip
[55]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-432/igt@kms_cursor_crc@cursor-random-32x10.html
* igt@kms_cursor_crc@cursor-rapid-movement-32x10:
- shard-lnl: NOTRUN -> [SKIP][56] ([Intel XE#1424]) +4 other tests skip
[56]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-lnl-6/igt@kms_cursor_crc@cursor-rapid-movement-32x10.html
* igt@kms_cursor_legacy@cursora-vs-flipb-atomic:
- shard-lnl: NOTRUN -> [SKIP][57] ([Intel XE#309])
[57]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-lnl-5/igt@kms_cursor_legacy@cursora-vs-flipb-atomic.html
* igt@kms_cursor_legacy@cursorb-vs-flipa-atomic-transitions-varying-size:
- shard-bmg: [PASS][58] -> [DMESG-WARN][59] ([Intel XE#877]) +1 other test dmesg-warn
[58]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-8/igt@kms_cursor_legacy@cursorb-vs-flipa-atomic-transitions-varying-size.html
[59]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-7/igt@kms_cursor_legacy@cursorb-vs-flipa-atomic-transitions-varying-size.html
* igt@kms_cursor_legacy@cursorb-vs-flipb-atomic:
- shard-adlp: NOTRUN -> [SKIP][60] ([Intel XE#309])
[60]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-adlp-6/igt@kms_cursor_legacy@cursorb-vs-flipb-atomic.html
- shard-bmg: [PASS][61] -> [SKIP][62] ([Intel XE#2291]) +1 other test skip
[61]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-7/igt@kms_cursor_legacy@cursorb-vs-flipb-atomic.html
[62]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-6/igt@kms_cursor_legacy@cursorb-vs-flipb-atomic.html
* igt@kms_dither@fb-8bpc-vs-panel-6bpc:
- shard-bmg: [PASS][63] -> [SKIP][64] ([Intel XE#1340])
[63]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-4/igt@kms_dither@fb-8bpc-vs-panel-6bpc.html
[64]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-6/igt@kms_dither@fb-8bpc-vs-panel-6bpc.html
* igt@kms_dsc@dsc-with-bpc-formats:
- shard-lnl: NOTRUN -> [SKIP][65] ([Intel XE#2244])
[65]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-lnl-6/igt@kms_dsc@dsc-with-bpc-formats.html
* igt@kms_fbcon_fbt@psr:
- shard-adlp: NOTRUN -> [SKIP][66] ([Intel XE#776])
[66]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-adlp-4/igt@kms_fbcon_fbt@psr.html
* igt@kms_feature_discovery@display-4x:
- shard-lnl: NOTRUN -> [SKIP][67] ([Intel XE#1138])
[67]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-lnl-2/igt@kms_feature_discovery@display-4x.html
* igt@kms_flip@2x-flip-vs-dpms:
- shard-adlp: NOTRUN -> [SKIP][68] ([Intel XE#310]) +2 other tests skip
[68]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-adlp-8/igt@kms_flip@2x-flip-vs-dpms.html
* igt@kms_flip@2x-flip-vs-dpms-off-vs-modeset-interruptible:
- shard-bmg: [PASS][69] -> [SKIP][70] ([Intel XE#2316]) +4 other tests skip
[69]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-7/igt@kms_flip@2x-flip-vs-dpms-off-vs-modeset-interruptible.html
[70]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-6/igt@kms_flip@2x-flip-vs-dpms-off-vs-modeset-interruptible.html
* igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@ab-hdmi-a6-dp4:
- shard-dg2-set2: NOTRUN -> [FAIL][71] ([Intel XE#301] / [Intel XE#3321]) +1 other test fail
[71]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-466/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@ab-hdmi-a6-dp4.html
* igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@bc-hdmi-a6-dp4:
- shard-dg2-set2: NOTRUN -> [FAIL][72] ([Intel XE#301]) +3 other tests fail
[72]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-466/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@bc-hdmi-a6-dp4.html
* igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@cd-hdmi-a6-dp4:
- shard-dg2-set2: NOTRUN -> [DMESG-FAIL][73] ([Intel XE#1033]) +1 other test dmesg-fail
[73]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-466/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible@cd-hdmi-a6-dp4.html
* igt@kms_flip@2x-flip-vs-expired-vblank@ab-dp2-hdmi-a3:
- shard-bmg: [PASS][74] -> [FAIL][75] ([Intel XE#3321]) +1 other test fail
[74]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-4/igt@kms_flip@2x-flip-vs-expired-vblank@ab-dp2-hdmi-a3.html
[75]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-2/igt@kms_flip@2x-flip-vs-expired-vblank@ab-dp2-hdmi-a3.html
* igt@kms_flip@2x-flip-vs-rmfb:
- shard-lnl: NOTRUN -> [SKIP][76] ([Intel XE#1421]) +3 other tests skip
[76]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-lnl-6/igt@kms_flip@2x-flip-vs-rmfb.html
* igt@kms_flip@2x-flip-vs-suspend-interruptible@cd-hdmi-a6-dp4:
- shard-dg2-set2: [PASS][77] -> [INCOMPLETE][78] ([Intel XE#2049] / [Intel XE#2597]) +1 other test incomplete
[77]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-434/igt@kms_flip@2x-flip-vs-suspend-interruptible@cd-hdmi-a6-dp4.html
[78]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-466/igt@kms_flip@2x-flip-vs-suspend-interruptible@cd-hdmi-a6-dp4.html
* igt@kms_flip@busy-flip:
- shard-dg2-set2: [PASS][79] -> [DMESG-WARN][80] ([Intel XE#1033]) +57 other tests dmesg-warn
[79]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-463/igt@kms_flip@busy-flip.html
[80]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-434/igt@kms_flip@busy-flip.html
* igt@kms_flip@flip-vs-expired-vblank@a-dp2:
- shard-dg2-set2: [PASS][81] -> [FAIL][82] ([Intel XE#301]) +1 other test fail
[81]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-432/igt@kms_flip@flip-vs-expired-vblank@a-dp2.html
[82]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-432/igt@kms_flip@flip-vs-expired-vblank@a-dp2.html
* igt@kms_flip@flip-vs-expired-vblank@d-dp2:
- shard-bmg: NOTRUN -> [FAIL][83] ([Intel XE#3321]) +2 other tests fail
[83]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-5/igt@kms_flip@flip-vs-expired-vblank@d-dp2.html
* igt@kms_flip@wf_vblank-ts-check-interruptible:
- shard-lnl: [PASS][84] -> [FAIL][85] ([Intel XE#3149] / [Intel XE#886])
[84]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-lnl-4/igt@kms_flip@wf_vblank-ts-check-interruptible.html
[85]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-lnl-2/igt@kms_flip@wf_vblank-ts-check-interruptible.html
* igt@kms_flip@wf_vblank-ts-check-interruptible@a-hdmi-a3:
- shard-bmg: [PASS][86] -> [FAIL][87] ([Intel XE#2882]) +1 other test fail
[86]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-2/igt@kms_flip@wf_vblank-ts-check-interruptible@a-hdmi-a3.html
[87]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-6/igt@kms_flip@wf_vblank-ts-check-interruptible@a-hdmi-a3.html
* igt@kms_flip@wf_vblank-ts-check-interruptible@c-edp1:
- shard-lnl: [PASS][88] -> [FAIL][89] ([Intel XE#886]) +1 other test fail
[88]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-lnl-4/igt@kms_flip@wf_vblank-ts-check-interruptible@c-edp1.html
[89]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-lnl-2/igt@kms_flip@wf_vblank-ts-check-interruptible@c-edp1.html
* igt@kms_flip_scaled_crc@flip-32bpp-4tile-to-32bpp-4tiledg2rcccs-downscaling:
- shard-lnl: NOTRUN -> [SKIP][90] ([Intel XE#1401] / [Intel XE#1745]) +3 other tests skip
[90]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-lnl-2/igt@kms_flip_scaled_crc@flip-32bpp-4tile-to-32bpp-4tiledg2rcccs-downscaling.html
* igt@kms_flip_scaled_crc@flip-32bpp-4tile-to-32bpp-4tiledg2rcccs-upscaling@pipe-a-default-mode:
- shard-lnl: NOTRUN -> [SKIP][91] ([Intel XE#1401]) +3 other tests skip
[91]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-lnl-1/igt@kms_flip_scaled_crc@flip-32bpp-4tile-to-32bpp-4tiledg2rcccs-upscaling@pipe-a-default-mode.html
* igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-64bpp-yftile-upscaling@pipe-a-valid-mode:
- shard-bmg: NOTRUN -> [SKIP][92] ([Intel XE#2293]) +6 other tests skip
[92]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-6/igt@kms_flip_scaled_crc@flip-32bpp-yftile-to-64bpp-yftile-upscaling@pipe-a-valid-mode.html
* igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-32bpp-4tiledg2rcccs-downscaling@pipe-a-valid-mode:
- shard-bmg: NOTRUN -> [SKIP][93] ([Intel XE#2380])
[93]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-2/igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-32bpp-4tiledg2rcccs-downscaling@pipe-a-valid-mode.html
* igt@kms_frontbuffer_tracking@drrs-1p-primscrn-spr-indfb-draw-mmap-wc:
- shard-adlp: NOTRUN -> [SKIP][94] ([Intel XE#651]) +3 other tests skip
[94]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-adlp-2/igt@kms_frontbuffer_tracking@drrs-1p-primscrn-spr-indfb-draw-mmap-wc.html
* igt@kms_frontbuffer_tracking@drrs-2p-primscrn-cur-indfb-onoff:
- shard-dg2-set2: NOTRUN -> [SKIP][95] ([Intel XE#651]) +15 other tests skip
[95]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-434/igt@kms_frontbuffer_tracking@drrs-2p-primscrn-cur-indfb-onoff.html
* igt@kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-pri-shrfb-draw-render:
- shard-lnl: NOTRUN -> [SKIP][96] ([Intel XE#651]) +6 other tests skip
[96]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-lnl-2/igt@kms_frontbuffer_tracking@fbcdrrs-1p-primscrn-pri-shrfb-draw-render.html
* igt@kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-pri-shrfb-draw-blt:
- shard-lnl: NOTRUN -> [SKIP][97] ([Intel XE#656]) +7 other tests skip
[97]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-lnl-6/igt@kms_frontbuffer_tracking@fbcdrrs-2p-scndscrn-pri-shrfb-draw-blt.html
* igt@kms_frontbuffer_tracking@pipe-fbc-rte:
- shard-adlp: NOTRUN -> [SKIP][98] ([Intel XE#455]) +7 other tests skip
[98]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-adlp-6/igt@kms_frontbuffer_tracking@pipe-fbc-rte.html
* igt@kms_frontbuffer_tracking@psr-1p-primscrn-spr-indfb-draw-blt:
- shard-adlp: NOTRUN -> [SKIP][99] ([Intel XE#653]) +4 other tests skip
[99]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-adlp-3/igt@kms_frontbuffer_tracking@psr-1p-primscrn-spr-indfb-draw-blt.html
* igt@kms_frontbuffer_tracking@psr-2p-scndscrn-pri-shrfb-draw-blt:
- shard-adlp: NOTRUN -> [SKIP][100] ([Intel XE#656]) +16 other tests skip
[100]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-adlp-3/igt@kms_frontbuffer_tracking@psr-2p-scndscrn-pri-shrfb-draw-blt.html
- shard-dg2-set2: NOTRUN -> [SKIP][101] ([Intel XE#653]) +18 other tests skip
[101]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-432/igt@kms_frontbuffer_tracking@psr-2p-scndscrn-pri-shrfb-draw-blt.html
* igt@kms_joiner@basic-big-joiner:
- shard-adlp: NOTRUN -> [SKIP][102] ([Intel XE#346])
[102]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-adlp-3/igt@kms_joiner@basic-big-joiner.html
* igt@kms_joiner@switch-modeset-ultra-joiner-big-joiner:
- shard-dg2-set2: NOTRUN -> [SKIP][103] ([Intel XE#2925])
[103]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-436/igt@kms_joiner@switch-modeset-ultra-joiner-big-joiner.html
* igt@kms_plane@pixel-format:
- shard-adlp: NOTRUN -> [INCOMPLETE][104] ([Intel XE#1035])
[104]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-adlp-3/igt@kms_plane@pixel-format.html
* igt@kms_plane@pixel-format@pipe-a-plane-3:
- shard-adlp: NOTRUN -> [WARN][105] ([Intel XE#2078]) +1 other test warn
[105]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-adlp-3/igt@kms_plane@pixel-format@pipe-a-plane-3.html
* igt@kms_plane_cursor@primary@pipe-a-hdmi-a-6-size-256:
- shard-dg2-set2: NOTRUN -> [FAIL][106] ([Intel XE#616]) +2 other tests fail
[106]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-436/igt@kms_plane_cursor@primary@pipe-a-hdmi-a-6-size-256.html
* igt@kms_plane_scaling@planes-unity-scaling-downscale-factor-0-25@pipe-d:
- shard-dg2-set2: NOTRUN -> [SKIP][107] ([Intel XE#2763] / [Intel XE#455]) +3 other tests skip
[107]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-463/igt@kms_plane_scaling@planes-unity-scaling-downscale-factor-0-25@pipe-d.html
* igt@kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-25@pipe-b:
- shard-dg2-set2: NOTRUN -> [SKIP][108] ([Intel XE#2763]) +11 other tests skip
[108]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-434/igt@kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-25@pipe-b.html
* igt@kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-75@pipe-a:
- shard-bmg: NOTRUN -> [SKIP][109] ([Intel XE#2763]) +7 other tests skip
[109]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-7/igt@kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-75@pipe-a.html
* igt@kms_pm_backlight@brightness-with-dpms:
- shard-dg2-set2: NOTRUN -> [SKIP][110] ([Intel XE#2938])
[110]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-466/igt@kms_pm_backlight@brightness-with-dpms.html
* igt@kms_pm_backlight@fade-with-suspend:
- shard-dg2-set2: NOTRUN -> [SKIP][111] ([Intel XE#870])
[111]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-436/igt@kms_pm_backlight@fade-with-suspend.html
* igt@kms_pm_dc@dc5-psr:
- shard-adlp: NOTRUN -> [SKIP][112] ([Intel XE#1129])
[112]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-adlp-8/igt@kms_pm_dc@dc5-psr.html
- shard-dg2-set2: NOTRUN -> [SKIP][113] ([Intel XE#1129])
[113]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-463/igt@kms_pm_dc@dc5-psr.html
- shard-lnl: NOTRUN -> [FAIL][114] ([Intel XE#718])
[114]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-lnl-4/igt@kms_pm_dc@dc5-psr.html
* igt@kms_pm_dc@dc5-retention-flops:
- shard-lnl: NOTRUN -> [SKIP][115] ([Intel XE#3309])
[115]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-lnl-7/igt@kms_pm_dc@dc5-retention-flops.html
- shard-adlp: NOTRUN -> [SKIP][116] ([Intel XE#3309])
[116]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-adlp-2/igt@kms_pm_dc@dc5-retention-flops.html
* igt@kms_psr2_sf@fbc-pr-cursor-plane-move-continuous-sf:
- shard-adlp: NOTRUN -> [SKIP][117] ([Intel XE#1489]) +2 other tests skip
[117]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-adlp-8/igt@kms_psr2_sf@fbc-pr-cursor-plane-move-continuous-sf.html
* igt@kms_psr2_sf@fbc-pr-overlay-plane-move-continuous-exceed-fully-sf:
- shard-dg2-set2: NOTRUN -> [SKIP][118] ([Intel XE#1489]) +5 other tests skip
[118]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-432/igt@kms_psr2_sf@fbc-pr-overlay-plane-move-continuous-exceed-fully-sf.html
* igt@kms_psr@fbc-psr2-cursor-plane-onoff:
- shard-dg2-set2: NOTRUN -> [SKIP][119] ([Intel XE#2850] / [Intel XE#929]) +10 other tests skip
[119]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-466/igt@kms_psr@fbc-psr2-cursor-plane-onoff.html
* igt@kms_psr@pr-dpms:
- shard-lnl: NOTRUN -> [SKIP][120] ([Intel XE#1406]) +1 other test skip
[120]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-lnl-8/igt@kms_psr@pr-dpms.html
* igt@kms_psr@pr-primary-page-flip:
- shard-adlp: NOTRUN -> [SKIP][121] ([Intel XE#2850] / [Intel XE#929]) +7 other tests skip
[121]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-adlp-2/igt@kms_psr@pr-primary-page-flip.html
* igt@kms_rotation_crc@primary-yf-tiled-reflect-x-180:
- shard-dg2-set2: NOTRUN -> [SKIP][122] ([Intel XE#1127])
[122]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-436/igt@kms_rotation_crc@primary-yf-tiled-reflect-x-180.html
* igt@kms_rotation_crc@sprite-rotation-90:
- shard-dg2-set2: NOTRUN -> [SKIP][123] ([Intel XE#3414])
[123]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-463/igt@kms_rotation_crc@sprite-rotation-90.html
* igt@kms_setmode@basic:
- shard-bmg: [PASS][124] -> [FAIL][125] ([Intel XE#2883]) +2 other tests fail
[124]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-4/igt@kms_setmode@basic.html
[125]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-5/igt@kms_setmode@basic.html
* igt@kms_universal_plane@cursor-fb-leak:
- shard-lnl: [PASS][126] -> [FAIL][127] ([Intel XE#899]) +2 other tests fail
[126]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-lnl-4/igt@kms_universal_plane@cursor-fb-leak.html
[127]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-lnl-6/igt@kms_universal_plane@cursor-fb-leak.html
* igt@kms_vrr@cmrr:
- shard-adlp: NOTRUN -> [SKIP][128] ([Intel XE#2168])
[128]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-adlp-4/igt@kms_vrr@cmrr.html
* igt@kms_vrr@flip-basic:
- shard-lnl: NOTRUN -> [FAIL][129] ([Intel XE#1522]) +1 other test fail
[129]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-lnl-4/igt@kms_vrr@flip-basic.html
* igt@xe_compute_preempt@compute-preempt@engine-drm_xe_engine_class_compute:
- shard-dg2-set2: NOTRUN -> [SKIP][130] ([Intel XE#1280] / [Intel XE#455])
[130]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-466/igt@xe_compute_preempt@compute-preempt@engine-drm_xe_engine_class_compute.html
* igt@xe_copy_basic@mem-copy-linear-0xfffe:
- shard-dg2-set2: NOTRUN -> [SKIP][131] ([Intel XE#1123])
[131]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-436/igt@xe_copy_basic@mem-copy-linear-0xfffe.html
* igt@xe_eudebug@basic-vm-access-parameters-userptr:
- shard-dg2-set2: NOTRUN -> [SKIP][132] ([Intel XE#3889])
[132]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-463/igt@xe_eudebug@basic-vm-access-parameters-userptr.html
* igt@xe_eudebug@discovery-empty:
- shard-dg2-set2: NOTRUN -> [SKIP][133] ([Intel XE#2905]) +8 other tests skip
[133]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-436/igt@xe_eudebug@discovery-empty.html
* igt@xe_eudebug_online@set-breakpoint:
- shard-lnl: NOTRUN -> [SKIP][134] ([Intel XE#2905]) +3 other tests skip
[134]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-lnl-1/igt@xe_eudebug_online@set-breakpoint.html
* igt@xe_eudebug_online@single-step-one:
- shard-adlp: NOTRUN -> [SKIP][135] ([Intel XE#2905]) +3 other tests skip
[135]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-adlp-4/igt@xe_eudebug_online@single-step-one.html
* igt@xe_evict@evict-beng-small-external:
- shard-adlp: NOTRUN -> [SKIP][136] ([Intel XE#261] / [Intel XE#688]) +2 other tests skip
[136]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-adlp-8/igt@xe_evict@evict-beng-small-external.html
* igt@xe_evict@evict-large-external-cm:
- shard-lnl: NOTRUN -> [SKIP][137] ([Intel XE#688]) +2 other tests skip
[137]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-lnl-7/igt@xe_evict@evict-large-external-cm.html
* igt@xe_exec_basic@multigpu-many-execqueues-many-vm-basic-defer-mmap:
- shard-adlp: NOTRUN -> [SKIP][138] ([Intel XE#1392]) +2 other tests skip
[138]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-adlp-4/igt@xe_exec_basic@multigpu-many-execqueues-many-vm-basic-defer-mmap.html
* igt@xe_exec_basic@multigpu-many-execqueues-many-vm-null-defer-mmap:
- shard-lnl: NOTRUN -> [SKIP][139] ([Intel XE#1392])
[139]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-lnl-6/igt@xe_exec_basic@multigpu-many-execqueues-many-vm-null-defer-mmap.html
* igt@xe_exec_basic@multigpu-no-exec-basic:
- shard-dg2-set2: [PASS][140] -> [SKIP][141] ([Intel XE#1392]) +1 other test skip
[140]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-463/igt@xe_exec_basic@multigpu-no-exec-basic.html
[141]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-432/igt@xe_exec_basic@multigpu-no-exec-basic.html
* igt@xe_exec_compute_mode@many-rebind:
- shard-adlp: [PASS][142] -> [DMESG-FAIL][143] ([Intel XE#3868])
[142]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-adlp-3/igt@xe_exec_compute_mode@many-rebind.html
[143]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-adlp-3/igt@xe_exec_compute_mode@many-rebind.html
* igt@xe_exec_fault_mode@many-execqueues-rebind:
- shard-adlp: NOTRUN -> [SKIP][144] ([Intel XE#288]) +10 other tests skip
[144]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-adlp-2/igt@xe_exec_fault_mode@many-execqueues-rebind.html
* igt@xe_exec_fault_mode@many-userptr-rebind-imm:
- shard-dg2-set2: NOTRUN -> [SKIP][145] ([Intel XE#288]) +15 other tests skip
[145]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-434/igt@xe_exec_fault_mode@many-userptr-rebind-imm.html
* igt@xe_exercise_blt@fast-copy-inc-dimension@xmajor-vram01-system-481x481:
- shard-bmg: [PASS][146] -> [DMESG-WARN][147] ([Intel XE#4172]) +33 other tests dmesg-warn
[146]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-6/igt@xe_exercise_blt@fast-copy-inc-dimension@xmajor-vram01-system-481x481.html
[147]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-2/igt@xe_exercise_blt@fast-copy-inc-dimension@xmajor-vram01-system-481x481.html
* igt@xe_fault_injection@inject-fault-probe-function-xe_ggtt_init_early:
- shard-adlp: NOTRUN -> [DMESG-WARN][148] ([Intel XE#4173])
[148]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-adlp-4/igt@xe_fault_injection@inject-fault-probe-function-xe_ggtt_init_early.html
* igt@xe_live_ktest@xe_bo@xe_ccs_migrate_kunit:
- shard-bmg: NOTRUN -> [SKIP][149] ([Intel XE#2229])
[149]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-7/igt@xe_live_ktest@xe_bo@xe_ccs_migrate_kunit.html
* igt@xe_module_load@load:
- shard-dg2-set2: ([PASS][150], [PASS][151], [PASS][152], [PASS][153], [PASS][154], [PASS][155], [PASS][156], [PASS][157], [PASS][158], [PASS][159], [PASS][160], [PASS][161], [PASS][162], [PASS][163], [PASS][164], [PASS][165], [PASS][166], [PASS][167], [PASS][168], [PASS][169], [PASS][170], [PASS][171], [PASS][172], [PASS][173], [PASS][174]) -> ([PASS][175], [PASS][176], [PASS][177], [PASS][178], [PASS][179], [PASS][180], [SKIP][181], [PASS][182], [PASS][183], [PASS][184], [PASS][185], [PASS][186], [PASS][187], [PASS][188], [PASS][189], [PASS][190], [PASS][191], [PASS][192], [PASS][193], [PASS][194], [PASS][195], [PASS][196], [PASS][197], [PASS][198], [PASS][199], [PASS][200]) ([Intel XE#378])
[150]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-434/igt@xe_module_load@load.html
[151]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@xe_module_load@load.html
[152]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-463/igt@xe_module_load@load.html
[153]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-463/igt@xe_module_load@load.html
[154]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-463/igt@xe_module_load@load.html
[155]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-436/igt@xe_module_load@load.html
[156]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-466/igt@xe_module_load@load.html
[157]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-463/igt@xe_module_load@load.html
[158]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-432/igt@xe_module_load@load.html
[159]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-432/igt@xe_module_load@load.html
[160]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-466/igt@xe_module_load@load.html
[161]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-436/igt@xe_module_load@load.html
[162]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-436/igt@xe_module_load@load.html
[163]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-466/igt@xe_module_load@load.html
[164]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-434/igt@xe_module_load@load.html
[165]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-434/igt@xe_module_load@load.html
[166]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@xe_module_load@load.html
[167]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@xe_module_load@load.html
[168]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@xe_module_load@load.html
[169]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@xe_module_load@load.html
[170]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@xe_module_load@load.html
[171]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@xe_module_load@load.html
[172]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@xe_module_load@load.html
[173]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-432/igt@xe_module_load@load.html
[174]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-432/igt@xe_module_load@load.html
[175]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-432/igt@xe_module_load@load.html
[176]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-432/igt@xe_module_load@load.html
[177]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-434/igt@xe_module_load@load.html
[178]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-434/igt@xe_module_load@load.html
[179]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-434/igt@xe_module_load@load.html
[180]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-463/igt@xe_module_load@load.html
[181]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-463/igt@xe_module_load@load.html
[182]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-436/igt@xe_module_load@load.html
[183]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-436/igt@xe_module_load@load.html
[184]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-436/igt@xe_module_load@load.html
[185]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-436/igt@xe_module_load@load.html
[186]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-436/igt@xe_module_load@load.html
[187]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-463/igt@xe_module_load@load.html
[188]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-463/igt@xe_module_load@load.html
[189]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-463/igt@xe_module_load@load.html
[190]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-432/igt@xe_module_load@load.html
[191]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-432/igt@xe_module_load@load.html
[192]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-434/igt@xe_module_load@load.html
[193]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-466/igt@xe_module_load@load.html
[194]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-466/igt@xe_module_load@load.html
[195]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-466/igt@xe_module_load@load.html
[196]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-432/igt@xe_module_load@load.html
[197]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-432/igt@xe_module_load@load.html
[198]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-466/igt@xe_module_load@load.html
[199]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-466/igt@xe_module_load@load.html
[200]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-432/igt@xe_module_load@load.html
* igt@xe_noexec_ping_pong:
- shard-adlp: NOTRUN -> [SKIP][201] ([Intel XE#379])
[201]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-adlp-6/igt@xe_noexec_ping_pong.html
* igt@xe_oa@non-zero-reason:
- shard-adlp: NOTRUN -> [SKIP][202] ([Intel XE#2541] / [Intel XE#3573])
[202]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-adlp-4/igt@xe_oa@non-zero-reason.html
* igt@xe_oa@syncs-ufence-wait-cfg:
- shard-dg2-set2: NOTRUN -> [SKIP][203] ([Intel XE#2541] / [Intel XE#3573])
[203]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-463/igt@xe_oa@syncs-ufence-wait-cfg.html
* igt@xe_pat@pat-index-xelpg:
- shard-lnl: NOTRUN -> [SKIP][204] ([Intel XE#979])
[204]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-lnl-8/igt@xe_pat@pat-index-xelpg.html
* igt@xe_pm@s2idle-vm-bind-unbind-all:
- shard-dg2-set2: [PASS][205] -> [ABORT][206] ([Intel XE#1358] / [Intel XE#1794])
[205]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-434/igt@xe_pm@s2idle-vm-bind-unbind-all.html
[206]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-432/igt@xe_pm@s2idle-vm-bind-unbind-all.html
* igt@xe_pm@s3-basic-exec:
- shard-dg2-set2: NOTRUN -> [DMESG-WARN][207] ([Intel XE#1033] / [Intel XE#569]) +1 other test dmesg-warn
[207]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-466/igt@xe_pm@s3-basic-exec.html
* igt@xe_pm@s3-exec-after:
- shard-dg2-set2: [PASS][208] -> [ABORT][209] ([Intel XE#1358]) +1 other test abort
[208]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-466/igt@xe_pm@s3-exec-after.html
[209]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-432/igt@xe_pm@s3-exec-after.html
* igt@xe_pm@s3-vm-bind-prefetch:
- shard-dg2-set2: NOTRUN -> [ABORT][210] ([Intel XE#1358] / [Intel XE#1794])
[210]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-432/igt@xe_pm@s3-vm-bind-prefetch.html
* igt@xe_query@multigpu-query-oa-units:
- shard-dg2-set2: NOTRUN -> [SKIP][211] ([Intel XE#944]) +1 other test skip
[211]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-436/igt@xe_query@multigpu-query-oa-units.html
* igt@xe_query@multigpu-query-uc-fw-version-huc:
- shard-adlp: NOTRUN -> [SKIP][212] ([Intel XE#944]) +1 other test skip
[212]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-adlp-4/igt@xe_query@multigpu-query-uc-fw-version-huc.html
- shard-lnl: NOTRUN -> [SKIP][213] ([Intel XE#944])
[213]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-lnl-6/igt@xe_query@multigpu-query-uc-fw-version-huc.html
* igt@xe_wedged@basic-wedged:
- shard-adlp: [PASS][214] -> [DMESG-WARN][215] ([Intel XE#4173]) +1 other test dmesg-warn
[214]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-adlp-2/igt@xe_wedged@basic-wedged.html
[215]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-adlp-3/igt@xe_wedged@basic-wedged.html
#### Possible fixes ####
* igt@core_hotunplug@hotreplug:
- shard-bmg: [SKIP][216] ([Intel XE#2136]) -> [PASS][217] +22 other tests pass
[216]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@core_hotunplug@hotreplug.html
[217]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-4/igt@core_hotunplug@hotreplug.html
* igt@core_setmaster@master-drop-set-shared-fd:
- shard-dg2-set2: [SKIP][218] ([Intel XE#3453]) -> [PASS][219]
[218]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@core_setmaster@master-drop-set-shared-fd.html
[219]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-434/igt@core_setmaster@master-drop-set-shared-fd.html
* igt@fbdev@info:
- shard-bmg: [SKIP][220] ([Intel XE#2134]) -> [PASS][221] +3 other tests pass
[220]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@fbdev@info.html
[221]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-2/igt@fbdev@info.html
* igt@fbdev@write:
- shard-dg2-set2: [SKIP][222] ([Intel XE#2134]) -> [PASS][223] +2 other tests pass
[222]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@fbdev@write.html
[223]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-466/igt@fbdev@write.html
* igt@kms_async_flips@async-flip-suspend-resume:
- shard-adlp: [DMESG-WARN][224] ([Intel XE#1033]) -> [PASS][225] +2 other tests pass
[224]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-adlp-2/igt@kms_async_flips@async-flip-suspend-resume.html
[225]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-adlp-6/igt@kms_async_flips@async-flip-suspend-resume.html
* igt@kms_async_flips@async-flip-with-page-flip-events-atomic:
- shard-lnl: [FAIL][226] ([Intel XE#3719] / [Intel XE#911]) -> [PASS][227] +3 other tests pass
[226]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-lnl-6/igt@kms_async_flips@async-flip-with-page-flip-events-atomic.html
[227]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-lnl-7/igt@kms_async_flips@async-flip-with-page-flip-events-atomic.html
* igt@kms_atomic@plane-invalid-params-fence:
- shard-dg2-set2: [SKIP][228] ([Intel XE#2423] / [i915#2575]) -> [PASS][229] +120 other tests pass
[228]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@kms_atomic@plane-invalid-params-fence.html
[229]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-466/igt@kms_atomic@plane-invalid-params-fence.html
* igt@kms_cursor_legacy@cursora-vs-flipb-toggle:
- shard-bmg: [SKIP][230] ([Intel XE#2291]) -> [PASS][231]
[230]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-6/igt@kms_cursor_legacy@cursora-vs-flipb-toggle.html
[231]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-7/igt@kms_cursor_legacy@cursora-vs-flipb-toggle.html
* igt@kms_feature_discovery@display-2x:
- shard-bmg: [SKIP][232] ([Intel XE#2373]) -> [PASS][233]
[232]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-6/igt@kms_feature_discovery@display-2x.html
[233]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-7/igt@kms_feature_discovery@display-2x.html
* igt@kms_flip@2x-flip-vs-expired-vblank@ad-dp2-hdmi-a3:
- shard-bmg: [FAIL][234] ([Intel XE#3321]) -> [PASS][235]
[234]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-4/igt@kms_flip@2x-flip-vs-expired-vblank@ad-dp2-hdmi-a3.html
[235]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-2/igt@kms_flip@2x-flip-vs-expired-vblank@ad-dp2-hdmi-a3.html
* igt@kms_flip@2x-flip-vs-wf_vblank-interruptible@cd-hdmi-a6-dp4:
- shard-dg2-set2: [DMESG-WARN][236] ([Intel XE#1033]) -> [PASS][237] +18 other tests pass
[236]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-434/igt@kms_flip@2x-flip-vs-wf_vblank-interruptible@cd-hdmi-a6-dp4.html
[237]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-434/igt@kms_flip@2x-flip-vs-wf_vblank-interruptible@cd-hdmi-a6-dp4.html
* igt@kms_flip@2x-plain-flip-fb-recreate:
- shard-bmg: [SKIP][238] ([Intel XE#2423]) -> [PASS][239] +116 other tests pass
[238]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@kms_flip@2x-plain-flip-fb-recreate.html
[239]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-2/igt@kms_flip@2x-plain-flip-fb-recreate.html
* igt@kms_flip@2x-wf_vblank-ts-check:
- shard-bmg: [SKIP][240] ([Intel XE#2316]) -> [PASS][241] +2 other tests pass
[240]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-6/igt@kms_flip@2x-wf_vblank-ts-check.html
[241]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-8/igt@kms_flip@2x-wf_vblank-ts-check.html
* igt@kms_flip@flip-vs-expired-vblank@d-hdmi-a2:
- shard-dg2-set2: [FAIL][242] ([Intel XE#301]) -> [PASS][243] +1 other test pass
[242]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-432/igt@kms_flip@flip-vs-expired-vblank@d-hdmi-a2.html
[243]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-432/igt@kms_flip@flip-vs-expired-vblank@d-hdmi-a2.html
* igt@kms_flip@flip-vs-suspend-interruptible:
- shard-adlp: [DMESG-WARN][244] ([Intel XE#2953]) -> [PASS][245] +1 other test pass
[244]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-adlp-2/igt@kms_flip@flip-vs-suspend-interruptible.html
[245]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-adlp-4/igt@kms_flip@flip-vs-suspend-interruptible.html
* igt@kms_flip@plain-flip-fb-recreate:
- shard-dg2-set2: [FAIL][246] ([Intel XE#2882]) -> [PASS][247]
[246]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-432/igt@kms_flip@plain-flip-fb-recreate.html
[247]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-466/igt@kms_flip@plain-flip-fb-recreate.html
* igt@kms_flip_scaled_crc@flip-32bpp-4tile-to-64bpp-4tile-downscaling:
- shard-dg2-set2: [SKIP][248] ([Intel XE#2136]) -> [PASS][249] +31 other tests pass
[248]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@kms_flip_scaled_crc@flip-32bpp-4tile-to-64bpp-4tile-downscaling.html
[249]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-463/igt@kms_flip_scaled_crc@flip-32bpp-4tile-to-64bpp-4tile-downscaling.html
* igt@kms_flip_scaled_crc@flip-32bpp-xtile-to-64bpp-xtile-upscaling:
- shard-dg2-set2: [SKIP][250] ([Intel XE#2136] / [Intel XE#2351]) -> [PASS][251] +12 other tests pass
[250]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@kms_flip_scaled_crc@flip-32bpp-xtile-to-64bpp-xtile-upscaling.html
[251]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-466/igt@kms_flip_scaled_crc@flip-32bpp-xtile-to-64bpp-xtile-upscaling.html
* igt@kms_frontbuffer_tracking@fbc-1p-offscren-pri-shrfb-draw-blt:
- shard-adlp: [DMESG-FAIL][252] ([Intel XE#1033]) -> [PASS][253] +7 other tests pass
[252]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-adlp-8/igt@kms_frontbuffer_tracking@fbc-1p-offscren-pri-shrfb-draw-blt.html
[253]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-adlp-4/igt@kms_frontbuffer_tracking@fbc-1p-offscren-pri-shrfb-draw-blt.html
* igt@kms_plane_scaling@plane-upscale-20x20-with-modifiers:
- shard-adlp: [DMESG-WARN][254] -> [PASS][255] +2 other tests pass
[254]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-adlp-4/igt@kms_plane_scaling@plane-upscale-20x20-with-modifiers.html
[255]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-adlp-6/igt@kms_plane_scaling@plane-upscale-20x20-with-modifiers.html
* igt@kms_pm_dc@dc5-dpms:
- shard-lnl: [FAIL][256] ([Intel XE#718]) -> [PASS][257]
[256]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-lnl-6/igt@kms_pm_dc@dc5-dpms.html
[257]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-lnl-1/igt@kms_pm_dc@dc5-dpms.html
* igt@kms_pm_rpm@cursor-dpms:
- shard-dg2-set2: [SKIP][258] ([Intel XE#2446]) -> [PASS][259] +2 other tests pass
[258]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@kms_pm_rpm@cursor-dpms.html
[259]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-436/igt@kms_pm_rpm@cursor-dpms.html
* igt@kms_pm_rpm@universal-planes:
- shard-bmg: [SKIP][260] ([Intel XE#2446]) -> [PASS][261] +1 other test pass
[260]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@kms_pm_rpm@universal-planes.html
[261]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-5/igt@kms_pm_rpm@universal-planes.html
* igt@kms_setmode@invalid-clone-single-crtc:
- shard-bmg: [SKIP][262] ([Intel XE#1435]) -> [PASS][263]
[262]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-6/igt@kms_setmode@invalid-clone-single-crtc.html
[263]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-8/igt@kms_setmode@invalid-clone-single-crtc.html
* igt@kms_vblank@wait-busy-hang:
- shard-bmg: [DMESG-WARN][264] ([Intel XE#4172]) -> [PASS][265] +11 other tests pass
[264]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-6/igt@kms_vblank@wait-busy-hang.html
[265]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-6/igt@kms_vblank@wait-busy-hang.html
* igt@kms_vrr@cmrr@pipe-a-edp-1:
- shard-lnl: [FAIL][266] ([Intel XE#2159]) -> [PASS][267] +1 other test pass
[266]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-lnl-1/igt@kms_vrr@cmrr@pipe-a-edp-1.html
[267]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-lnl-3/igt@kms_vrr@cmrr@pipe-a-edp-1.html
* igt@xe_ccs@ctrl-surf-copy-new-ctx:
- shard-dg2-set2: [SKIP][268] ([Intel XE#1130]) -> [PASS][269] +220 other tests pass
[268]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@xe_ccs@ctrl-surf-copy-new-ctx.html
[269]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-463/igt@xe_ccs@ctrl-surf-copy-new-ctx.html
* igt@xe_exec_basic@multigpu-many-execqueues-many-vm-bindexecqueue-userptr-rebind:
- shard-dg2-set2: [SKIP][270] ([Intel XE#1392]) -> [PASS][271] +5 other tests pass
[270]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-432/igt@xe_exec_basic@multigpu-many-execqueues-many-vm-bindexecqueue-userptr-rebind.html
[271]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-463/igt@xe_exec_basic@multigpu-many-execqueues-many-vm-bindexecqueue-userptr-rebind.html
* igt@xe_live_ktest@xe_bo:
- shard-dg2-set2: [SKIP][272] ([Intel XE#2229] / [Intel XE#455]) -> [PASS][273] +1 other test pass
[272]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@xe_live_ktest@xe_bo.html
[273]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-463/igt@xe_live_ktest@xe_bo.html
- shard-bmg: [SKIP][274] ([Intel XE#1192]) -> [PASS][275]
[274]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-2/igt@xe_live_ktest@xe_bo.html
[275]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-7/igt@xe_live_ktest@xe_bo.html
* igt@xe_live_ktest@xe_bo@xe_ccs_migrate_kunit:
- shard-dg2-set2: [SKIP][276] ([Intel XE#2229]) -> [PASS][277]
[276]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@xe_live_ktest@xe_bo@xe_ccs_migrate_kunit.html
[277]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-463/igt@xe_live_ktest@xe_bo@xe_ccs_migrate_kunit.html
* igt@xe_module_load@many-reload:
- shard-bmg: [FAIL][278] ([Intel XE#3546]) -> [PASS][279]
[278]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@xe_module_load@many-reload.html
[279]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-1/igt@xe_module_load@many-reload.html
* igt@xe_module_load@reload:
- shard-dg2-set2: [FAIL][280] ([Intel XE#3546]) -> [PASS][281]
[280]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@xe_module_load@reload.html
[281]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-436/igt@xe_module_load@reload.html
* igt@xe_pm@s2idle-basic:
- shard-dg2-set2: [ABORT][282] ([Intel XE#1358] / [Intel XE#1794]) -> [PASS][283] +1 other test pass
[282]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-432/igt@xe_pm@s2idle-basic.html
[283]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-436/igt@xe_pm@s2idle-basic.html
* igt@xe_pm@s3-vm-bind-userptr:
- shard-bmg: [DMESG-WARN][284] ([Intel XE#4172] / [Intel XE#569]) -> [PASS][285] +1 other test pass
[284]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-6/igt@xe_pm@s3-vm-bind-userptr.html
[285]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-8/igt@xe_pm@s3-vm-bind-userptr.html
* igt@xe_pm@s4-vm-bind-unbind-all:
- shard-adlp: [ABORT][286] ([Intel XE#1358] / [Intel XE#1607] / [Intel XE#1794]) -> [PASS][287] +1 other test pass
[286]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-adlp-9/igt@xe_pm@s4-vm-bind-unbind-all.html
[287]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-adlp-3/igt@xe_pm@s4-vm-bind-unbind-all.html
* igt@xe_sysfs_preempt_timeout@preempt_timeout_us-timeout:
- shard-bmg: [SKIP][288] ([Intel XE#1130]) -> [PASS][289] +249 other tests pass
[288]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@xe_sysfs_preempt_timeout@preempt_timeout_us-timeout.html
[289]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-2/igt@xe_sysfs_preempt_timeout@preempt_timeout_us-timeout.html
#### Warnings ####
* igt@kms_async_flips@invalid-async-flip-atomic:
- shard-bmg: [SKIP][290] ([Intel XE#2423]) -> [SKIP][291] ([Intel XE#3768])
[290]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@kms_async_flips@invalid-async-flip-atomic.html
[291]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-5/igt@kms_async_flips@invalid-async-flip-atomic.html
* igt@kms_atomic_transition@plane-all-modeset-transition-fencing-internal-panels:
- shard-bmg: [SKIP][292] ([Intel XE#2423]) -> [SKIP][293] ([Intel XE#2370])
[292]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@kms_atomic_transition@plane-all-modeset-transition-fencing-internal-panels.html
[293]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-1/igt@kms_atomic_transition@plane-all-modeset-transition-fencing-internal-panels.html
* igt@kms_big_fb@linear-32bpp-rotate-270:
- shard-bmg: [SKIP][294] ([Intel XE#2136]) -> [SKIP][295] ([Intel XE#2327]) +5 other tests skip
[294]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@kms_big_fb@linear-32bpp-rotate-270.html
[295]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-8/igt@kms_big_fb@linear-32bpp-rotate-270.html
* igt@kms_big_fb@x-tiled-32bpp-rotate-90:
- shard-dg2-set2: [SKIP][296] ([Intel XE#2136]) -> [SKIP][297] ([Intel XE#316]) +1 other test skip
[296]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@kms_big_fb@x-tiled-32bpp-rotate-90.html
[297]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-466/igt@kms_big_fb@x-tiled-32bpp-rotate-90.html
* igt@kms_big_fb@x-tiled-8bpp-rotate-90:
- shard-dg2-set2: [SKIP][298] ([Intel XE#2136] / [Intel XE#2351]) -> [SKIP][299] ([Intel XE#316]) +1 other test skip
[298]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@kms_big_fb@x-tiled-8bpp-rotate-90.html
[299]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-466/igt@kms_big_fb@x-tiled-8bpp-rotate-90.html
* igt@kms_big_fb@y-tiled-64bpp-rotate-180:
- shard-dg2-set2: [SKIP][300] ([Intel XE#2136] / [Intel XE#2351]) -> [SKIP][301] ([Intel XE#1124]) +7 other tests skip
[300]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@kms_big_fb@y-tiled-64bpp-rotate-180.html
[301]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-436/igt@kms_big_fb@y-tiled-64bpp-rotate-180.html
* igt@kms_big_fb@y-tiled-addfb-size-offset-overflow:
- shard-dg2-set2: [SKIP][302] ([Intel XE#2136] / [Intel XE#2351]) -> [SKIP][303] ([Intel XE#607])
[302]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@kms_big_fb@y-tiled-addfb-size-offset-overflow.html
[303]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-434/igt@kms_big_fb@y-tiled-addfb-size-offset-overflow.html
* igt@kms_big_fb@y-tiled-max-hw-stride-32bpp-rotate-0:
- shard-dg2-set2: [SKIP][304] ([Intel XE#2136]) -> [SKIP][305] ([Intel XE#1124]) +9 other tests skip
[304]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@kms_big_fb@y-tiled-max-hw-stride-32bpp-rotate-0.html
[305]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-432/igt@kms_big_fb@y-tiled-max-hw-stride-32bpp-rotate-0.html
* igt@kms_big_fb@y-tiled-max-hw-stride-64bpp-rotate-0-hflip:
- shard-adlp: [DMESG-FAIL][306] ([Intel XE#1033]) -> [FAIL][307] ([Intel XE#1874])
[306]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-adlp-8/igt@kms_big_fb@y-tiled-max-hw-stride-64bpp-rotate-0-hflip.html
[307]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-adlp-2/igt@kms_big_fb@y-tiled-max-hw-stride-64bpp-rotate-0-hflip.html
* igt@kms_big_fb@yf-tiled-16bpp-rotate-270:
- shard-bmg: [SKIP][308] ([Intel XE#2136]) -> [SKIP][309] ([Intel XE#1124]) +18 other tests skip
[308]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@kms_big_fb@yf-tiled-16bpp-rotate-270.html
[309]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-5/igt@kms_big_fb@yf-tiled-16bpp-rotate-270.html
* igt@kms_big_fb@yf-tiled-addfb:
- shard-dg2-set2: [SKIP][310] ([Intel XE#2136] / [Intel XE#2351]) -> [SKIP][311] ([Intel XE#619])
[310]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@kms_big_fb@yf-tiled-addfb.html
[311]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-463/igt@kms_big_fb@yf-tiled-addfb.html
* igt@kms_big_fb@yf-tiled-addfb-size-offset-overflow:
- shard-dg2-set2: [SKIP][312] ([Intel XE#2136]) -> [SKIP][313] ([Intel XE#607])
[312]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@kms_big_fb@yf-tiled-addfb-size-offset-overflow.html
[313]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-436/igt@kms_big_fb@yf-tiled-addfb-size-offset-overflow.html
* igt@kms_bw@connected-linear-tiling-3-displays-2560x1440p:
- shard-dg2-set2: [SKIP][314] ([Intel XE#2423] / [i915#2575]) -> [SKIP][315] ([Intel XE#2191]) +1 other test skip
[314]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@kms_bw@connected-linear-tiling-3-displays-2560x1440p.html
[315]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-436/igt@kms_bw@connected-linear-tiling-3-displays-2560x1440p.html
* igt@kms_bw@connected-linear-tiling-4-displays-3840x2160p:
- shard-bmg: [SKIP][316] ([Intel XE#2423]) -> [SKIP][317] ([Intel XE#2314] / [Intel XE#2894]) +2 other tests skip
[316]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@kms_bw@connected-linear-tiling-4-displays-3840x2160p.html
[317]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-4/igt@kms_bw@connected-linear-tiling-4-displays-3840x2160p.html
* igt@kms_bw@linear-tiling-3-displays-3840x2160p:
- shard-dg2-set2: [SKIP][318] ([Intel XE#2423] / [i915#2575]) -> [SKIP][319] ([Intel XE#367]) +4 other tests skip
[318]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@kms_bw@linear-tiling-3-displays-3840x2160p.html
[319]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-466/igt@kms_bw@linear-tiling-3-displays-3840x2160p.html
* igt@kms_bw@linear-tiling-4-displays-3840x2160p:
- shard-bmg: [SKIP][320] ([Intel XE#2423]) -> [SKIP][321] ([Intel XE#367]) +3 other tests skip
[320]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@kms_bw@linear-tiling-4-displays-3840x2160p.html
[321]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-1/igt@kms_bw@linear-tiling-4-displays-3840x2160p.html
* igt@kms_ccs@bad-rotation-90-4-tiled-dg2-rc-ccs-cc:
- shard-dg2-set2: [SKIP][322] ([Intel XE#2136]) -> [DMESG-WARN][323] ([Intel XE#1033])
[322]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@kms_ccs@bad-rotation-90-4-tiled-dg2-rc-ccs-cc.html
[323]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-434/igt@kms_ccs@bad-rotation-90-4-tiled-dg2-rc-ccs-cc.html
* igt@kms_ccs@bad-rotation-90-4-tiled-lnl-ccs:
- shard-bmg: [SKIP][324] ([Intel XE#2136]) -> [SKIP][325] ([Intel XE#2652] / [Intel XE#787]) +1 other test skip
[324]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@kms_ccs@bad-rotation-90-4-tiled-lnl-ccs.html
[325]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-1/igt@kms_ccs@bad-rotation-90-4-tiled-lnl-ccs.html
* igt@kms_ccs@ccs-on-another-bo-4-tiled-mtl-mc-ccs:
- shard-dg2-set2: [SKIP][326] ([Intel XE#2136] / [Intel XE#2351]) -> [SKIP][327] ([Intel XE#455] / [Intel XE#787]) +1 other test skip
[326]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@kms_ccs@ccs-on-another-bo-4-tiled-mtl-mc-ccs.html
[327]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-466/igt@kms_ccs@ccs-on-another-bo-4-tiled-mtl-mc-ccs.html
* igt@kms_ccs@crc-primary-suspend-4-tiled-bmg-ccs:
- shard-bmg: [SKIP][328] ([Intel XE#2136]) -> [INCOMPLETE][329] ([Intel XE#3862] / [Intel XE#4172])
[328]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@kms_ccs@crc-primary-suspend-4-tiled-bmg-ccs.html
[329]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-4/igt@kms_ccs@crc-primary-suspend-4-tiled-bmg-ccs.html
* igt@kms_ccs@crc-primary-suspend-4-tiled-dg2-mc-ccs:
- shard-dg2-set2: [SKIP][330] ([Intel XE#2136]) -> [ABORT][331] ([Intel XE#2625])
[330]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@kms_ccs@crc-primary-suspend-4-tiled-dg2-mc-ccs.html
[331]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-432/igt@kms_ccs@crc-primary-suspend-4-tiled-dg2-mc-ccs.html
* igt@kms_ccs@crc-primary-suspend-y-tiled-gen12-rc-ccs:
- shard-bmg: [SKIP][332] ([Intel XE#2136]) -> [SKIP][333] ([Intel XE#3432])
[332]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@kms_ccs@crc-primary-suspend-y-tiled-gen12-rc-ccs.html
[333]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-8/igt@kms_ccs@crc-primary-suspend-y-tiled-gen12-rc-ccs.html
* igt@kms_ccs@crc-sprite-planes-basic-4-tiled-bmg-ccs:
- shard-dg2-set2: [SKIP][334] ([Intel XE#2136]) -> [SKIP][335] ([Intel XE#2907]) +2 other tests skip
[334]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@kms_ccs@crc-sprite-planes-basic-4-tiled-bmg-ccs.html
[335]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-436/igt@kms_ccs@crc-sprite-planes-basic-4-tiled-bmg-ccs.html
* igt@kms_ccs@crc-sprite-planes-basic-4-tiled-dg2-rc-ccs-cc:
- shard-bmg: [SKIP][336] ([Intel XE#2136]) -> [SKIP][337] ([Intel XE#2887]) +19 other tests skip
[336]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@kms_ccs@crc-sprite-planes-basic-4-tiled-dg2-rc-ccs-cc.html
[337]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-5/igt@kms_ccs@crc-sprite-planes-basic-4-tiled-dg2-rc-ccs-cc.html
* igt@kms_ccs@random-ccs-data-4-tiled-mtl-mc-ccs:
- shard-dg2-set2: [SKIP][338] ([Intel XE#2136]) -> [SKIP][339] ([Intel XE#455] / [Intel XE#787]) +17 other tests skip
[338]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@kms_ccs@random-ccs-data-4-tiled-mtl-mc-ccs.html
[339]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-436/igt@kms_ccs@random-ccs-data-4-tiled-mtl-mc-ccs.html
* igt@kms_cdclk@mode-transition-all-outputs:
- shard-dg2-set2: [SKIP][340] ([Intel XE#2136] / [Intel XE#2351]) -> [SKIP][341] ([Intel XE#314])
[340]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@kms_cdclk@mode-transition-all-outputs.html
[341]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-466/igt@kms_cdclk@mode-transition-all-outputs.html
* igt@kms_cdclk@plane-scaling:
- shard-bmg: [SKIP][342] ([Intel XE#2136]) -> [SKIP][343] ([Intel XE#2724])
[342]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@kms_cdclk@plane-scaling.html
[343]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-1/igt@kms_cdclk@plane-scaling.html
* igt@kms_chamelium_color@ctm-red-to-blue:
- shard-dg2-set2: [SKIP][344] ([Intel XE#2423] / [i915#2575]) -> [SKIP][345] ([Intel XE#306]) +1 other test skip
[344]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@kms_chamelium_color@ctm-red-to-blue.html
[345]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-434/igt@kms_chamelium_color@ctm-red-to-blue.html
* igt@kms_chamelium_color@degamma:
- shard-bmg: [SKIP][346] ([Intel XE#2423]) -> [SKIP][347] ([Intel XE#2325]) +1 other test skip
[346]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@kms_chamelium_color@degamma.html
[347]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-8/igt@kms_chamelium_color@degamma.html
* igt@kms_chamelium_edid@dp-edid-resolution-list:
- shard-bmg: [SKIP][348] ([Intel XE#2423]) -> [SKIP][349] ([Intel XE#2252]) +12 other tests skip
[348]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@kms_chamelium_edid@dp-edid-resolution-list.html
[349]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-8/igt@kms_chamelium_edid@dp-edid-resolution-list.html
* igt@kms_chamelium_hpd@vga-hpd:
- shard-dg2-set2: [SKIP][350] ([Intel XE#2423] / [i915#2575]) -> [SKIP][351] ([Intel XE#373]) +15 other tests skip
[350]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@kms_chamelium_hpd@vga-hpd.html
[351]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-432/igt@kms_chamelium_hpd@vga-hpd.html
* igt@kms_content_protection@dp-mst-lic-type-0:
- shard-dg2-set2: [SKIP][352] ([Intel XE#2423] / [i915#2575]) -> [SKIP][353] ([Intel XE#307]) +1 other test skip
[352]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@kms_content_protection@dp-mst-lic-type-0.html
[353]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-463/igt@kms_content_protection@dp-mst-lic-type-0.html
* igt@kms_content_protection@legacy:
- shard-bmg: [SKIP][354] ([Intel XE#2423]) -> [FAIL][355] ([Intel XE#1178]) +1 other test fail
[354]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@kms_content_protection@legacy.html
[355]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-5/igt@kms_content_protection@legacy.html
* igt@kms_content_protection@lic-type-1:
- shard-bmg: [SKIP][356] ([Intel XE#2423]) -> [SKIP][357] ([Intel XE#2341])
[356]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@kms_content_protection@lic-type-1.html
[357]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-6/igt@kms_content_protection@lic-type-1.html
* igt@kms_content_protection@srm:
- shard-dg2-set2: [SKIP][358] ([Intel XE#2423] / [i915#2575]) -> [FAIL][359] ([Intel XE#1178])
[358]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@kms_content_protection@srm.html
[359]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-436/igt@kms_content_protection@srm.html
* igt@kms_content_protection@uevent:
- shard-bmg: [SKIP][360] ([Intel XE#2423]) -> [FAIL][361] ([Intel XE#1188])
[360]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@kms_content_protection@uevent.html
[361]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-7/igt@kms_content_protection@uevent.html
* igt@kms_cursor_crc@cursor-offscreen-512x512:
- shard-bmg: [SKIP][362] ([Intel XE#2423]) -> [SKIP][363] ([Intel XE#2321])
[362]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@kms_cursor_crc@cursor-offscreen-512x512.html
[363]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-4/igt@kms_cursor_crc@cursor-offscreen-512x512.html
* igt@kms_cursor_crc@cursor-onscreen-512x170:
- shard-dg2-set2: [SKIP][364] ([Intel XE#2423] / [i915#2575]) -> [SKIP][365] ([Intel XE#308]) +1 other test skip
[364]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@kms_cursor_crc@cursor-onscreen-512x170.html
[365]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-434/igt@kms_cursor_crc@cursor-onscreen-512x170.html
* igt@kms_cursor_crc@cursor-random-256x256:
- shard-bmg: [SKIP][366] ([Intel XE#2423]) -> [DMESG-WARN][367] ([Intel XE#4172]) +2 other tests dmesg-warn
[366]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@kms_cursor_crc@cursor-random-256x256.html
[367]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-2/igt@kms_cursor_crc@cursor-random-256x256.html
* igt@kms_cursor_crc@cursor-sliding-256x85:
- shard-bmg: [SKIP][368] ([Intel XE#2423]) -> [SKIP][369] ([Intel XE#2320]) +4 other tests skip
[368]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@kms_cursor_crc@cursor-sliding-256x85.html
[369]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-5/igt@kms_cursor_crc@cursor-sliding-256x85.html
* igt@kms_cursor_legacy@short-busy-flip-before-cursor-atomic-transitions-varying-size:
- shard-dg2-set2: [SKIP][370] ([Intel XE#2423] / [i915#2575]) -> [SKIP][371] ([Intel XE#323]) +1 other test skip
[370]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@kms_cursor_legacy@short-busy-flip-before-cursor-atomic-transitions-varying-size.html
[371]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-466/igt@kms_cursor_legacy@short-busy-flip-before-cursor-atomic-transitions-varying-size.html
* igt@kms_dirtyfb@psr-dirtyfb-ioctl:
- shard-bmg: [SKIP][372] ([Intel XE#2136]) -> [SKIP][373] ([Intel XE#1508])
[372]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@kms_dirtyfb@psr-dirtyfb-ioctl.html
[373]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-7/igt@kms_dirtyfb@psr-dirtyfb-ioctl.html
* igt@kms_dsc@dsc-fractional-bpp:
- shard-bmg: [SKIP][374] ([Intel XE#2136]) -> [SKIP][375] ([Intel XE#2244]) +2 other tests skip
[374]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@kms_dsc@dsc-fractional-bpp.html
[375]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-1/igt@kms_dsc@dsc-fractional-bpp.html
* igt@kms_dsc@dsc-with-output-formats-with-bpc:
- shard-dg2-set2: [SKIP][376] ([Intel XE#2136]) -> [SKIP][377] ([Intel XE#455]) +4 other tests skip
[376]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@kms_dsc@dsc-with-output-formats-with-bpc.html
[377]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-466/igt@kms_dsc@dsc-with-output-formats-with-bpc.html
* igt@kms_fbcon_fbt@fbc:
- shard-bmg: [SKIP][378] ([Intel XE#2136]) -> [SKIP][379] ([Intel XE#4156])
[378]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@kms_fbcon_fbt@fbc.html
[379]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-6/igt@kms_fbcon_fbt@fbc.html
* igt@kms_fbcon_fbt@fbc-suspend:
- shard-dg2-set2: [SKIP][380] ([Intel XE#2136]) -> [DMESG-FAIL][381] ([Intel XE#1033])
[380]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@kms_fbcon_fbt@fbc-suspend.html
[381]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-434/igt@kms_fbcon_fbt@fbc-suspend.html
* igt@kms_fbcon_fbt@psr-suspend:
- shard-dg2-set2: [SKIP][382] ([Intel XE#2136]) -> [SKIP][383] ([Intel XE#776]) +1 other test skip
[382]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@kms_fbcon_fbt@psr-suspend.html
[383]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-432/igt@kms_fbcon_fbt@psr-suspend.html
* igt@kms_feature_discovery@display-4x:
- shard-dg2-set2: [SKIP][384] ([Intel XE#2423] / [i915#2575]) -> [SKIP][385] ([Intel XE#1138])
[384]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@kms_feature_discovery@display-4x.html
[385]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-432/igt@kms_feature_discovery@display-4x.html
* igt@kms_feature_discovery@dp-mst:
- shard-dg2-set2: [SKIP][386] ([Intel XE#2423] / [i915#2575]) -> [SKIP][387] ([Intel XE#1137])
[386]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@kms_feature_discovery@dp-mst.html
[387]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-463/igt@kms_feature_discovery@dp-mst.html
* igt@kms_flip@2x-blocking-wf_vblank:
- shard-bmg: [SKIP][388] ([Intel XE#2423]) -> [SKIP][389] ([Intel XE#2316]) +1 other test skip
[388]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@kms_flip@2x-blocking-wf_vblank.html
[389]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-6/igt@kms_flip@2x-blocking-wf_vblank.html
* igt@kms_flip@2x-flip-vs-expired-vblank:
- shard-bmg: [FAIL][390] ([Intel XE#3321]) -> [DMESG-FAIL][391] ([Intel XE#4172])
[390]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-4/igt@kms_flip@2x-flip-vs-expired-vblank.html
[391]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-2/igt@kms_flip@2x-flip-vs-expired-vblank.html
* igt@kms_flip@2x-flip-vs-expired-vblank-interruptible:
- shard-dg2-set2: [SKIP][392] ([Intel XE#2423] / [i915#2575]) -> [DMESG-FAIL][393] ([Intel XE#1033]) +1 other test dmesg-fail
[392]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible.html
[393]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-466/igt@kms_flip@2x-flip-vs-expired-vblank-interruptible.html
* igt@kms_flip@flip-vs-absolute-wf_vblank:
- shard-dg2-set2: [SKIP][394] ([Intel XE#2423] / [i915#2575]) -> [DMESG-WARN][395] ([Intel XE#1033]) +7 other tests dmesg-warn
[394]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@kms_flip@flip-vs-absolute-wf_vblank.html
[395]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-434/igt@kms_flip@flip-vs-absolute-wf_vblank.html
* igt@kms_flip@flip-vs-expired-vblank:
- shard-bmg: [SKIP][396] ([Intel XE#2423]) -> [FAIL][397] ([Intel XE#3321])
[396]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@kms_flip@flip-vs-expired-vblank.html
[397]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-5/igt@kms_flip@flip-vs-expired-vblank.html
* igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytileccs-downscaling:
- shard-dg2-set2: [SKIP][398] ([Intel XE#2136] / [Intel XE#2351]) -> [SKIP][399] ([Intel XE#455]) +2 other tests skip
[398]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytileccs-downscaling.html
[399]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-434/igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytileccs-downscaling.html
* igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytileccs-upscaling:
- shard-bmg: [SKIP][400] ([Intel XE#2136]) -> [SKIP][401] ([Intel XE#2293] / [Intel XE#2380]) +6 other tests skip
[400]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytileccs-upscaling.html
[401]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-5/igt@kms_flip_scaled_crc@flip-32bpp-ytile-to-32bpp-ytileccs-upscaling.html
* igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-32bpp-4tiledg2rcccs-downscaling:
- shard-bmg: [SKIP][402] ([Intel XE#2136]) -> [SKIP][403] ([Intel XE#2380])
[402]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-32bpp-4tiledg2rcccs-downscaling.html
[403]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-2/igt@kms_flip_scaled_crc@flip-64bpp-4tile-to-32bpp-4tiledg2rcccs-downscaling.html
* igt@kms_frontbuffer_tracking@drrs-2p-primscrn-indfb-pgflip-blt:
- shard-bmg: [SKIP][404] ([Intel XE#2312]) -> [SKIP][405] ([Intel XE#2311]) +8 other tests skip
[404]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-6/igt@kms_frontbuffer_tracking@drrs-2p-primscrn-indfb-pgflip-blt.html
[405]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-5/igt@kms_frontbuffer_tracking@drrs-2p-primscrn-indfb-pgflip-blt.html
* igt@kms_frontbuffer_tracking@drrs-2p-primscrn-pri-indfb-draw-mmap-wc:
- shard-bmg: [SKIP][406] ([Intel XE#2311]) -> [SKIP][407] ([Intel XE#2312]) +7 other tests skip
[406]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-1/igt@kms_frontbuffer_tracking@drrs-2p-primscrn-pri-indfb-draw-mmap-wc.html
[407]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-6/igt@kms_frontbuffer_tracking@drrs-2p-primscrn-pri-indfb-draw-mmap-wc.html
* igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-spr-indfb-fullscreen:
- shard-dg2-set2: [SKIP][408] ([Intel XE#2136] / [Intel XE#2351]) -> [SKIP][409] ([Intel XE#651]) +15 other tests skip
[408]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-spr-indfb-fullscreen.html
[409]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-463/igt@kms_frontbuffer_tracking@drrs-2p-scndscrn-spr-indfb-fullscreen.html
* igt@kms_frontbuffer_tracking@drrs-indfb-scaledprimary:
- shard-dg2-set2: [SKIP][410] ([Intel XE#2136]) -> [SKIP][411] ([Intel XE#651]) +23 other tests skip
[410]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@kms_frontbuffer_tracking@drrs-indfb-scaledprimary.html
[411]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-463/igt@kms_frontbuffer_tracking@drrs-indfb-scaledprimary.html
* igt@kms_frontbuffer_tracking@drrs-rgb101010-draw-render:
- shard-bmg: [SKIP][412] ([Intel XE#2136]) -> [SKIP][413] ([Intel XE#2311]) +35 other tests skip
[412]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@kms_frontbuffer_tracking@drrs-rgb101010-draw-render.html
[413]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-5/igt@kms_frontbuffer_tracking@drrs-rgb101010-draw-render.html
* igt@kms_frontbuffer_tracking@fbc-1p-primscrn-indfb-pgflip-blt:
- shard-bmg: [SKIP][414] ([Intel XE#2136]) -> [SKIP][415] ([Intel XE#4141]) +12 other tests skip
[414]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-indfb-pgflip-blt.html
[415]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-2/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-indfb-pgflip-blt.html
* igt@kms_frontbuffer_tracking@fbc-2p-primscrn-pri-indfb-draw-mmap-wc:
- shard-dg2-set2: [SKIP][416] ([Intel XE#2136] / [Intel XE#2351]) -> [DMESG-WARN][417] ([Intel XE#1033])
[416]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-pri-indfb-draw-mmap-wc.html
[417]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-436/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-pri-indfb-draw-mmap-wc.html
* igt@kms_frontbuffer_tracking@fbc-2p-primscrn-spr-indfb-onoff:
- shard-bmg: [SKIP][418] ([Intel XE#2312]) -> [SKIP][419] ([Intel XE#4141]) +6 other tests skip
[418]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-6/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-spr-indfb-onoff.html
[419]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-7/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-spr-indfb-onoff.html
* igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-shrfb-pgflip-blt:
- shard-bmg: [SKIP][420] ([Intel XE#4141]) -> [SKIP][421] ([Intel XE#2312]) +7 other tests skip
[420]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-1/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-shrfb-pgflip-blt.html
[421]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-6/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-shrfb-pgflip-blt.html
* igt@kms_frontbuffer_tracking@fbc-suspend:
- shard-dg2-set2: [ABORT][422] ([Intel XE#1033] / [Intel XE#2625]) -> [DMESG-WARN][423] ([Intel XE#1033])
[422]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-432/igt@kms_frontbuffer_tracking@fbc-suspend.html
[423]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-434/igt@kms_frontbuffer_tracking@fbc-suspend.html
* igt@kms_frontbuffer_tracking@fbc-tiling-y:
- shard-dg2-set2: [SKIP][424] ([Intel XE#2136] / [Intel XE#2351]) -> [SKIP][425] ([Intel XE#658])
[424]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@kms_frontbuffer_tracking@fbc-tiling-y.html
[425]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-432/igt@kms_frontbuffer_tracking@fbc-tiling-y.html
* igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-indfb-plflip-blt:
- shard-bmg: [SKIP][426] ([Intel XE#2136]) -> [SKIP][427] ([Intel XE#2313]) +35 other tests skip
[426]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-indfb-plflip-blt.html
[427]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-2/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-indfb-plflip-blt.html
* igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-spr-indfb-draw-blt:
- shard-bmg: [SKIP][428] ([Intel XE#2313]) -> [SKIP][429] ([Intel XE#2312]) +7 other tests skip
[428]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-7/igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-spr-indfb-draw-blt.html
[429]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-6/igt@kms_frontbuffer_tracking@fbcpsr-2p-primscrn-spr-indfb-draw-blt.html
* igt@kms_frontbuffer_tracking@fbcpsr-tiling-4:
- shard-dg2-set2: [SKIP][430] ([Intel XE#2136] / [Intel XE#2351]) -> [SKIP][431] ([Intel XE#653]) +14 other tests skip
[430]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@kms_frontbuffer_tracking@fbcpsr-tiling-4.html
[431]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-463/igt@kms_frontbuffer_tracking@fbcpsr-tiling-4.html
* igt@kms_frontbuffer_tracking@fbcpsr-tiling-y:
- shard-bmg: [SKIP][432] ([Intel XE#2136]) -> [SKIP][433] ([Intel XE#2352])
[432]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@kms_frontbuffer_tracking@fbcpsr-tiling-y.html
[433]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-8/igt@kms_frontbuffer_tracking@fbcpsr-tiling-y.html
* igt@kms_frontbuffer_tracking@psr-1p-primscrn-pri-shrfb-draw-mmap-wc:
- shard-dg2-set2: [SKIP][434] ([Intel XE#2136]) -> [SKIP][435] ([Intel XE#653]) +32 other tests skip
[434]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@kms_frontbuffer_tracking@psr-1p-primscrn-pri-shrfb-draw-mmap-wc.html
[435]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-434/igt@kms_frontbuffer_tracking@psr-1p-primscrn-pri-shrfb-draw-mmap-wc.html
* igt@kms_frontbuffer_tracking@psr-2p-primscrn-cur-indfb-onoff:
- shard-bmg: [SKIP][436] ([Intel XE#2136]) -> [SKIP][437] ([Intel XE#2312]) +12 other tests skip
[436]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@kms_frontbuffer_tracking@psr-2p-primscrn-cur-indfb-onoff.html
[437]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-6/igt@kms_frontbuffer_tracking@psr-2p-primscrn-cur-indfb-onoff.html
* igt@kms_frontbuffer_tracking@psr-2p-scndscrn-indfb-msflip-blt:
- shard-bmg: [SKIP][438] ([Intel XE#2312]) -> [SKIP][439] ([Intel XE#2313]) +7 other tests skip
[438]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-6/igt@kms_frontbuffer_tracking@psr-2p-scndscrn-indfb-msflip-blt.html
[439]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-1/igt@kms_frontbuffer_tracking@psr-2p-scndscrn-indfb-msflip-blt.html
* igt@kms_getfb@getfb-reject-ccs:
- shard-dg2-set2: [SKIP][440] ([Intel XE#2423] / [i915#2575]) -> [SKIP][441] ([Intel XE#605])
[440]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@kms_getfb@getfb-reject-ccs.html
[441]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-432/igt@kms_getfb@getfb-reject-ccs.html
* igt@kms_joiner@basic-big-joiner:
- shard-dg2-set2: [SKIP][442] ([Intel XE#2136]) -> [SKIP][443] ([Intel XE#346]) +1 other test skip
[442]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@kms_joiner@basic-big-joiner.html
[443]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-463/igt@kms_joiner@basic-big-joiner.html
* igt@kms_joiner@basic-ultra-joiner:
- shard-bmg: [SKIP][444] ([Intel XE#2136]) -> [SKIP][445] ([Intel XE#2927]) +1 other test skip
[444]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@kms_joiner@basic-ultra-joiner.html
[445]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-2/igt@kms_joiner@basic-ultra-joiner.html
- shard-dg2-set2: [SKIP][446] ([Intel XE#2136]) -> [SKIP][447] ([Intel XE#2927])
[446]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@kms_joiner@basic-ultra-joiner.html
[447]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-463/igt@kms_joiner@basic-ultra-joiner.html
* igt@kms_multipipe_modeset@basic-max-pipe-crc-check:
- shard-bmg: [SKIP][448] ([Intel XE#2423]) -> [SKIP][449] ([Intel XE#2501])
[448]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@kms_multipipe_modeset@basic-max-pipe-crc-check.html
[449]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-7/igt@kms_multipipe_modeset@basic-max-pipe-crc-check.html
* igt@kms_plane_cursor@primary:
- shard-dg2-set2: [SKIP][450] ([Intel XE#2423] / [i915#2575]) -> [FAIL][451] ([Intel XE#616])
[450]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@kms_plane_cursor@primary.html
[451]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-436/igt@kms_plane_cursor@primary.html
* igt@kms_plane_scaling@planes-downscale-factor-0-25-unity-scaling:
- shard-dg2-set2: [SKIP][452] ([Intel XE#2423] / [i915#2575]) -> [SKIP][453] ([Intel XE#2763] / [Intel XE#455]) +3 other tests skip
[452]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@kms_plane_scaling@planes-downscale-factor-0-25-unity-scaling.html
[453]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-432/igt@kms_plane_scaling@planes-downscale-factor-0-25-unity-scaling.html
* igt@kms_plane_scaling@planes-downscale-factor-0-75-unity-scaling:
- shard-dg2-set2: [SKIP][454] ([Intel XE#2423] / [i915#2575]) -> [DMESG-WARN][455] ([Intel XE#1033] / [Intel XE#2566])
[454]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@kms_plane_scaling@planes-downscale-factor-0-75-unity-scaling.html
[455]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-436/igt@kms_plane_scaling@planes-downscale-factor-0-75-unity-scaling.html
* igt@kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-75:
- shard-bmg: [SKIP][456] ([Intel XE#2423]) -> [SKIP][457] ([Intel XE#2763]) +1 other test skip
[456]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-75.html
[457]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-7/igt@kms_plane_scaling@planes-upscale-20x20-downscale-factor-0-75.html
* igt@kms_pm_dc@dc3co-vpb-simulation:
- shard-bmg: [SKIP][458] ([Intel XE#2136]) -> [SKIP][459] ([Intel XE#2391])
[458]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@kms_pm_dc@dc3co-vpb-simulation.html
[459]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-5/igt@kms_pm_dc@dc3co-vpb-simulation.html
* igt@kms_pm_dc@dc5-dpms-negative:
- shard-bmg: [SKIP][460] ([Intel XE#2136]) -> [DMESG-WARN][461] ([Intel XE#4172])
[460]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@kms_pm_dc@dc5-dpms-negative.html
[461]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-1/igt@kms_pm_dc@dc5-dpms-negative.html
* igt@kms_pm_dc@dc5-psr:
- shard-bmg: [SKIP][462] ([Intel XE#2136]) -> [SKIP][463] ([Intel XE#2392])
[462]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@kms_pm_dc@dc5-psr.html
[463]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-7/igt@kms_pm_dc@dc5-psr.html
* igt@kms_pm_dc@dc5-retention-flops:
- shard-bmg: [SKIP][464] ([Intel XE#2136]) -> [SKIP][465] ([Intel XE#3309])
[464]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@kms_pm_dc@dc5-retention-flops.html
[465]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-1/igt@kms_pm_dc@dc5-retention-flops.html
* igt@kms_pm_dc@deep-pkgc:
- shard-dg2-set2: [SKIP][466] ([Intel XE#2136]) -> [SKIP][467] ([Intel XE#908])
[466]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@kms_pm_dc@deep-pkgc.html
[467]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-432/igt@kms_pm_dc@deep-pkgc.html
* igt@kms_pm_lpsp@kms-lpsp:
- shard-bmg: [SKIP][468] ([Intel XE#2136]) -> [SKIP][469] ([Intel XE#2499])
[468]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@kms_pm_lpsp@kms-lpsp.html
[469]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-2/igt@kms_pm_lpsp@kms-lpsp.html
* igt@kms_pm_rpm@dpms-mode-unset-lpsp:
- shard-bmg: [SKIP][470] ([Intel XE#2446]) -> [SKIP][471] ([Intel XE#1439] / [Intel XE#836])
[470]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@kms_pm_rpm@dpms-mode-unset-lpsp.html
[471]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-4/igt@kms_pm_rpm@dpms-mode-unset-lpsp.html
* igt@kms_pm_rpm@modeset-lpsp-stress:
- shard-dg2-set2: [SKIP][472] ([Intel XE#2446]) -> [DMESG-WARN][473] ([Intel XE#1033])
[472]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@kms_pm_rpm@modeset-lpsp-stress.html
[473]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-466/igt@kms_pm_rpm@modeset-lpsp-stress.html
* igt@kms_pm_rpm@system-suspend-modeset:
- shard-dg2-set2: [SKIP][474] ([Intel XE#2446]) -> [DMESG-WARN][475] ([Intel XE#1033] / [Intel XE#2042])
[474]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@kms_pm_rpm@system-suspend-modeset.html
[475]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-466/igt@kms_pm_rpm@system-suspend-modeset.html
* igt@kms_psr2_sf@fbc-pr-plane-move-sf-dmg-area:
- shard-dg2-set2: [SKIP][476] ([Intel XE#2136]) -> [SKIP][477] ([Intel XE#1489]) +13 other tests skip
[476]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@kms_psr2_sf@fbc-pr-plane-move-sf-dmg-area.html
[477]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-436/igt@kms_psr2_sf@fbc-pr-plane-move-sf-dmg-area.html
* igt@kms_psr2_sf@psr2-cursor-plane-move-continuous-exceed-fully-sf:
- shard-bmg: [SKIP][478] ([Intel XE#2136]) -> [SKIP][479] ([Intel XE#1489]) +12 other tests skip
[478]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@kms_psr2_sf@psr2-cursor-plane-move-continuous-exceed-fully-sf.html
[479]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-8/igt@kms_psr2_sf@psr2-cursor-plane-move-continuous-exceed-fully-sf.html
* igt@kms_psr2_su@page_flip-nv12:
- shard-bmg: [SKIP][480] ([Intel XE#2136]) -> [SKIP][481] ([Intel XE#2387])
[480]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@kms_psr2_su@page_flip-nv12.html
[481]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-2/igt@kms_psr2_su@page_flip-nv12.html
* igt@kms_psr2_su@page_flip-xrgb8888:
- shard-dg2-set2: [SKIP][482] ([Intel XE#2136]) -> [SKIP][483] ([Intel XE#1122])
[482]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@kms_psr2_su@page_flip-xrgb8888.html
[483]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-436/igt@kms_psr2_su@page_flip-xrgb8888.html
* igt@kms_psr@fbc-pr-cursor-blt:
- shard-bmg: [SKIP][484] ([Intel XE#2136]) -> [SKIP][485] ([Intel XE#2234] / [Intel XE#2850]) +19 other tests skip
[484]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@kms_psr@fbc-pr-cursor-blt.html
[485]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-8/igt@kms_psr@fbc-pr-cursor-blt.html
* igt@kms_psr@fbc-psr2-sprite-plane-move:
- shard-dg2-set2: [SKIP][486] ([Intel XE#2136]) -> [SKIP][487] ([Intel XE#2850] / [Intel XE#929]) +10 other tests skip
[486]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@kms_psr@fbc-psr2-sprite-plane-move.html
[487]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-463/igt@kms_psr@fbc-psr2-sprite-plane-move.html
* igt@kms_psr@psr-dpms:
- shard-dg2-set2: [SKIP][488] ([Intel XE#2136] / [Intel XE#2351]) -> [SKIP][489] ([Intel XE#2850] / [Intel XE#929]) +9 other tests skip
[488]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@kms_psr@psr-dpms.html
[489]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-434/igt@kms_psr@psr-dpms.html
* igt@kms_psr_stress_test@flip-primary-invalidate-overlay:
- shard-dg2-set2: [SKIP][490] ([Intel XE#2136] / [Intel XE#2351]) -> [SKIP][491] ([Intel XE#2939])
[490]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@kms_psr_stress_test@flip-primary-invalidate-overlay.html
[491]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-436/igt@kms_psr_stress_test@flip-primary-invalidate-overlay.html
* igt@kms_rotation_crc@primary-y-tiled-reflect-x-180:
- shard-bmg: [SKIP][492] ([Intel XE#2423]) -> [SKIP][493] ([Intel XE#2330])
[492]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@kms_rotation_crc@primary-y-tiled-reflect-x-180.html
[493]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-5/igt@kms_rotation_crc@primary-y-tiled-reflect-x-180.html
* igt@kms_rotation_crc@sprite-rotation-270:
- shard-dg2-set2: [SKIP][494] ([Intel XE#2423] / [i915#2575]) -> [SKIP][495] ([Intel XE#3414]) +3 other tests skip
[494]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@kms_rotation_crc@sprite-rotation-270.html
[495]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-436/igt@kms_rotation_crc@sprite-rotation-270.html
* igt@kms_rotation_crc@sprite-rotation-90-pos-100-0:
- shard-bmg: [SKIP][496] ([Intel XE#2423]) -> [SKIP][497] ([Intel XE#3414] / [Intel XE#3904]) +1 other test skip
[496]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@kms_rotation_crc@sprite-rotation-90-pos-100-0.html
[497]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-6/igt@kms_rotation_crc@sprite-rotation-90-pos-100-0.html
* igt@kms_scaling_modes@scaling-mode-center:
- shard-bmg: [SKIP][498] ([Intel XE#2423]) -> [SKIP][499] ([Intel XE#2413])
[498]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@kms_scaling_modes@scaling-mode-center.html
[499]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-7/igt@kms_scaling_modes@scaling-mode-center.html
* igt@kms_tiled_display@basic-test-pattern:
- shard-bmg: [SKIP][500] ([Intel XE#2423]) -> [SKIP][501] ([Intel XE#2426])
[500]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@kms_tiled_display@basic-test-pattern.html
[501]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-7/igt@kms_tiled_display@basic-test-pattern.html
* igt@kms_tiled_display@basic-test-pattern-with-chamelium:
- shard-dg2-set2: [SKIP][502] ([Intel XE#2423] / [i915#2575]) -> [SKIP][503] ([Intel XE#1500])
[502]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@kms_tiled_display@basic-test-pattern-with-chamelium.html
[503]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-466/igt@kms_tiled_display@basic-test-pattern-with-chamelium.html
* igt@kms_vrr@flip-suspend:
- shard-bmg: [SKIP][504] ([Intel XE#2423]) -> [SKIP][505] ([Intel XE#1499]) +1 other test skip
[504]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@kms_vrr@flip-suspend.html
[505]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-5/igt@kms_vrr@flip-suspend.html
* igt@kms_vrr@flipline:
- shard-dg2-set2: [SKIP][506] ([Intel XE#2423] / [i915#2575]) -> [SKIP][507] ([Intel XE#455]) +7 other tests skip
[506]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@kms_vrr@flipline.html
[507]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-436/igt@kms_vrr@flipline.html
* igt@kms_vrr@lobf:
- shard-bmg: [SKIP][508] ([Intel XE#2423]) -> [SKIP][509] ([Intel XE#2168])
[508]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@kms_vrr@lobf.html
[509]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-6/igt@kms_vrr@lobf.html
* igt@kms_writeback@writeback-check-output-xrgb2101010:
- shard-dg2-set2: [SKIP][510] ([Intel XE#2423] / [i915#2575]) -> [SKIP][511] ([Intel XE#756]) +1 other test skip
[510]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@kms_writeback@writeback-check-output-xrgb2101010.html
[511]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-463/igt@kms_writeback@writeback-check-output-xrgb2101010.html
* igt@kms_writeback@writeback-fb-id-xrgb2101010:
- shard-bmg: [SKIP][512] ([Intel XE#2423]) -> [SKIP][513] ([Intel XE#756])
[512]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@kms_writeback@writeback-fb-id-xrgb2101010.html
[513]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-2/igt@kms_writeback@writeback-fb-id-xrgb2101010.html
* igt@sriov_basic@enable-vfs-autoprobe-off:
- shard-bmg: [SKIP][514] ([Intel XE#2423]) -> [SKIP][515] ([Intel XE#1091] / [Intel XE#2849])
[514]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@sriov_basic@enable-vfs-autoprobe-off.html
[515]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-2/igt@sriov_basic@enable-vfs-autoprobe-off.html
- shard-dg2-set2: [SKIP][516] ([Intel XE#2423] / [i915#2575]) -> [SKIP][517] ([Intel XE#1091] / [Intel XE#2849])
[516]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@sriov_basic@enable-vfs-autoprobe-off.html
[517]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-466/igt@sriov_basic@enable-vfs-autoprobe-off.html
* igt@xe_compute_preempt@compute-preempt:
- shard-dg2-set2: [SKIP][518] ([Intel XE#1130]) -> [SKIP][519] ([Intel XE#1280] / [Intel XE#455])
[518]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@xe_compute_preempt@compute-preempt.html
[519]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-466/igt@xe_compute_preempt@compute-preempt.html
* igt@xe_copy_basic@mem-set-linear-0xfd:
- shard-dg2-set2: [SKIP][520] ([Intel XE#1130]) -> [SKIP][521] ([Intel XE#1126])
[520]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@xe_copy_basic@mem-set-linear-0xfd.html
[521]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-463/igt@xe_copy_basic@mem-set-linear-0xfd.html
* igt@xe_eudebug@basic-vm-access-parameters-userptr:
- shard-bmg: [SKIP][522] ([Intel XE#1130]) -> [SKIP][523] ([Intel XE#3889]) +1 other test skip
[522]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@xe_eudebug@basic-vm-access-parameters-userptr.html
[523]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-1/igt@xe_eudebug@basic-vm-access-parameters-userptr.html
* igt@xe_eudebug@basic-vm-bind-metadata-discovery:
- shard-bmg: [SKIP][524] ([Intel XE#1130]) -> [SKIP][525] ([Intel XE#2905]) +11 other tests skip
[524]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@xe_eudebug@basic-vm-bind-metadata-discovery.html
[525]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-4/igt@xe_eudebug@basic-vm-bind-metadata-discovery.html
* igt@xe_exec_basic@multigpu-once-basic-defer-bind:
- shard-bmg: [SKIP][526] ([Intel XE#1130]) -> [SKIP][527] ([Intel XE#2322]) +13 other tests skip
[526]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@xe_exec_basic@multigpu-once-basic-defer-bind.html
[527]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-2/igt@xe_exec_basic@multigpu-once-basic-defer-bind.html
* igt@xe_exec_basic@multigpu-once-rebind:
- shard-dg2-set2: [SKIP][528] ([Intel XE#1130]) -> [SKIP][529] ([Intel XE#1392]) +2 other tests skip
[528]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@xe_exec_basic@multigpu-once-rebind.html
[529]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-432/igt@xe_exec_basic@multigpu-once-rebind.html
* igt@xe_exec_fault_mode@twice-userptr-rebind-imm:
- shard-dg2-set2: [SKIP][530] ([Intel XE#1130]) -> [SKIP][531] ([Intel XE#288]) +34 other tests skip
[530]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@xe_exec_fault_mode@twice-userptr-rebind-imm.html
[531]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-436/igt@xe_exec_fault_mode@twice-userptr-rebind-imm.html
* igt@xe_exec_sip_eudebug@breakpoint-writesip:
- shard-dg2-set2: [SKIP][532] ([Intel XE#1130]) -> [SKIP][533] ([Intel XE#2905]) +15 other tests skip
[532]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@xe_exec_sip_eudebug@breakpoint-writesip.html
[533]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-436/igt@xe_exec_sip_eudebug@breakpoint-writesip.html
* igt@xe_huc_copy@huc_copy:
- shard-dg2-set2: [SKIP][534] ([Intel XE#1130]) -> [SKIP][535] ([Intel XE#255])
[534]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@xe_huc_copy@huc_copy.html
[535]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-463/igt@xe_huc_copy@huc_copy.html
* igt@xe_live_ktest@xe_eudebug:
- shard-bmg: [SKIP][536] ([Intel XE#2833]) -> [SKIP][537] ([Intel XE#1192])
[536]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-4/igt@xe_live_ktest@xe_eudebug.html
[537]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-6/igt@xe_live_ktest@xe_eudebug.html
* igt@xe_live_ktest@xe_mocs:
- shard-bmg: [FAIL][538] ([Intel XE#1999]) -> [SKIP][539] ([Intel XE#1192])
[538]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@xe_live_ktest@xe_mocs.html
[539]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-2/igt@xe_live_ktest@xe_mocs.html
* igt@xe_mmap@pci-membarrier-parallel:
- shard-dg2-set2: [SKIP][540] ([Intel XE#1130]) -> [DMESG-WARN][541] ([Intel XE#1033]) +1 other test dmesg-warn
[540]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@xe_mmap@pci-membarrier-parallel.html
[541]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-434/igt@xe_mmap@pci-membarrier-parallel.html
* igt@xe_oa@closed-fd-and-unmapped-access:
- shard-dg2-set2: [SKIP][542] ([Intel XE#1130]) -> [SKIP][543] ([Intel XE#2541] / [Intel XE#3573]) +11 other tests skip
[542]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@xe_oa@closed-fd-and-unmapped-access.html
[543]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-436/igt@xe_oa@closed-fd-and-unmapped-access.html
* igt@xe_pat@display-vs-wb-transient:
- shard-dg2-set2: [SKIP][544] ([Intel XE#1130]) -> [SKIP][545] ([Intel XE#1337])
[544]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@xe_pat@display-vs-wb-transient.html
[545]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-436/igt@xe_pat@display-vs-wb-transient.html
* igt@xe_pat@pat-index-xe2:
- shard-dg2-set2: [SKIP][546] ([Intel XE#1130]) -> [SKIP][547] ([Intel XE#977])
[546]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@xe_pat@pat-index-xe2.html
[547]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-434/igt@xe_pat@pat-index-xe2.html
* igt@xe_pat@pat-index-xelpg:
- shard-dg2-set2: [SKIP][548] ([Intel XE#1130]) -> [SKIP][549] ([Intel XE#979])
[548]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@xe_pat@pat-index-xelpg.html
[549]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-466/igt@xe_pat@pat-index-xelpg.html
* igt@xe_pm@d3cold-mmap-vram:
- shard-dg2-set2: [SKIP][550] ([Intel XE#1130]) -> [SKIP][551] ([Intel XE#2284] / [Intel XE#366]) +3 other tests skip
[550]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@xe_pm@d3cold-mmap-vram.html
[551]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-466/igt@xe_pm@d3cold-mmap-vram.html
* igt@xe_pm@d3cold-multiple-execs:
- shard-bmg: [SKIP][552] ([Intel XE#1130]) -> [SKIP][553] ([Intel XE#2284]) +1 other test skip
[552]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@xe_pm@d3cold-multiple-execs.html
[553]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-8/igt@xe_pm@d3cold-multiple-execs.html
* igt@xe_pm@s2idle-exec-after:
- shard-dg2-set2: [SKIP][554] ([Intel XE#1130]) -> [ABORT][555] ([Intel XE#1358])
[554]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@xe_pm@s2idle-exec-after.html
[555]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-432/igt@xe_pm@s2idle-exec-after.html
* igt@xe_pm@s3-basic:
- shard-bmg: [SKIP][556] ([Intel XE#1130]) -> [DMESG-WARN][557] ([Intel XE#4172] / [Intel XE#569])
[556]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@xe_pm@s3-basic.html
[557]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-7/igt@xe_pm@s3-basic.html
* igt@xe_pm_residency@cpg-basic:
- shard-bmg: [SKIP][558] ([Intel XE#1130]) -> [DMESG-WARN][559] ([Intel XE#4172]) +2 other tests dmesg-warn
[558]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@xe_pm_residency@cpg-basic.html
[559]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-7/igt@xe_pm_residency@cpg-basic.html
* igt@xe_query@multigpu-query-uc-fw-version-guc:
- shard-dg2-set2: [SKIP][560] ([Intel XE#1130]) -> [SKIP][561] ([Intel XE#944]) +3 other tests skip
[560]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@xe_query@multigpu-query-uc-fw-version-guc.html
[561]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-436/igt@xe_query@multigpu-query-uc-fw-version-guc.html
* igt@xe_query@multigpu-query-uc-fw-version-huc:
- shard-bmg: [SKIP][562] ([Intel XE#1130]) -> [SKIP][563] ([Intel XE#944]) +2 other tests skip
[562]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-bmg-3/igt@xe_query@multigpu-query-uc-fw-version-huc.html
[563]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-bmg-7/igt@xe_query@multigpu-query-uc-fw-version-huc.html
* igt@xe_sriov_flr@flr-each-isolation:
- shard-dg2-set2: [SKIP][564] ([Intel XE#1130]) -> [SKIP][565] ([Intel XE#3342])
[564]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@xe_sriov_flr@flr-each-isolation.html
[565]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-436/igt@xe_sriov_flr@flr-each-isolation.html
* igt@xe_wedged@wedged-mode-toggle:
- shard-dg2-set2: [SKIP][566] ([Intel XE#1130]) -> [ABORT][567] ([Intel XE#3075] / [Intel XE#3084])
[566]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b/shard-dg2-433/igt@xe_wedged@wedged-mode-toggle.html
[567]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/shard-dg2-436/igt@xe_wedged@wedged-mode-toggle.html
{name}: This element is suppressed. This means it is ignored when computing
the status of the difference (SUCCESS, WARNING, or FAILURE).
[Intel XE#1033]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1033
[Intel XE#1035]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1035
[Intel XE#1091]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1091
[Intel XE#1122]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1122
[Intel XE#1123]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1123
[Intel XE#1124]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1124
[Intel XE#1126]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1126
[Intel XE#1127]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1127
[Intel XE#1129]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1129
[Intel XE#1130]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1130
[Intel XE#1137]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1137
[Intel XE#1138]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1138
[Intel XE#1152]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1152
[Intel XE#1178]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1178
[Intel XE#1188]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1188
[Intel XE#1192]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1192
[Intel XE#1280]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1280
[Intel XE#1337]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1337
[Intel XE#1340]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1340
[Intel XE#1358]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1358
[Intel XE#1392]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1392
[Intel XE#1401]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1401
[Intel XE#1406]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1406
[Intel XE#1407]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1407
[Intel XE#1421]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1421
[Intel XE#1424]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1424
[Intel XE#1435]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1435
[Intel XE#1439]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1439
[Intel XE#1489]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1489
[Intel XE#1499]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1499
[Intel XE#1500]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1500
[Intel XE#1508]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1508
[Intel XE#1522]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1522
[Intel XE#1607]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1607
[Intel XE#1727]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1727
[Intel XE#1745]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1745
[Intel XE#1794]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1794
[Intel XE#1874]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1874
[Intel XE#1999]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1999
[Intel XE#2042]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2042
[Intel XE#2049]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2049
[Intel XE#2078]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2078
[Intel XE#2134]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2134
[Intel XE#2136]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2136
[Intel XE#2159]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2159
[Intel XE#2168]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2168
[Intel XE#2191]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2191
[Intel XE#2229]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2229
[Intel XE#2234]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2234
[Intel XE#2244]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2244
[Intel XE#2252]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2252
[Intel XE#2284]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2284
[Intel XE#2291]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2291
[Intel XE#2293]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2293
[Intel XE#2311]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2311
[Intel XE#2312]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2312
[Intel XE#2313]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2313
[Intel XE#2314]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2314
[Intel XE#2316]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2316
[Intel XE#2320]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2320
[Intel XE#2321]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2321
[Intel XE#2322]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2322
[Intel XE#2325]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2325
[Intel XE#2327]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2327
[Intel XE#2330]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2330
[Intel XE#2341]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2341
[Intel XE#2351]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2351
[Intel XE#2352]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2352
[Intel XE#2370]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2370
[Intel XE#2373]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2373
[Intel XE#2380]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2380
[Intel XE#2387]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2387
[Intel XE#2391]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2391
[Intel XE#2392]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2392
[Intel XE#2413]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2413
[Intel XE#2423]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2423
[Intel XE#2426]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2426
[Intel XE#2446]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2446
[Intel XE#2499]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2499
[Intel XE#2501]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2501
[Intel XE#2541]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2541
[Intel XE#255]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/255
[Intel XE#2550]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2550
[Intel XE#2566]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2566
[Intel XE#2597]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2597
[Intel XE#261]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/261
[Intel XE#2625]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2625
[Intel XE#2652]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2652
[Intel XE#2669]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2669
[Intel XE#2724]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2724
[Intel XE#2763]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2763
[Intel XE#2833]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2833
[Intel XE#2849]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2849
[Intel XE#2850]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2850
[Intel XE#288]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/288
[Intel XE#2882]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2882
[Intel XE#2883]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2883
[Intel XE#2887]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2887
[Intel XE#2894]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2894
[Intel XE#2905]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2905
[Intel XE#2907]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2907
[Intel XE#2925]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2925
[Intel XE#2927]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2927
[Intel XE#2938]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2938
[Intel XE#2939]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2939
[Intel XE#2953]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/2953
[Intel XE#301]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/301
[Intel XE#306]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/306
[Intel XE#307]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/307
[Intel XE#3075]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3075
[Intel XE#308]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/308
[Intel XE#3084]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3084
[Intel XE#309]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/309
[Intel XE#310]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/310
[Intel XE#3113]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3113
[Intel XE#3124]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3124
[Intel XE#314]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/314
[Intel XE#3149]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3149
[Intel XE#316]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/316
[Intel XE#323]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/323
[Intel XE#3278]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3278
[Intel XE#3309]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3309
[Intel XE#3321]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3321
[Intel XE#3342]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3342
[Intel XE#3414]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3414
[Intel XE#3432]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3432
[Intel XE#3442]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3442
[Intel XE#3453]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3453
[Intel XE#346]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/346
[Intel XE#3546]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3546
[Intel XE#3573]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3573
[Intel XE#366]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/366
[Intel XE#367]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/367
[Intel XE#3718]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3718
[Intel XE#3719]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3719
[Intel XE#373]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/373
[Intel XE#3767]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3767
[Intel XE#3768]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3768
[Intel XE#378]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/378
[Intel XE#379]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/379
[Intel XE#3862]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3862
[Intel XE#3868]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3868
[Intel XE#3884]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3884
[Intel XE#3889]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3889
[Intel XE#3904]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/3904
[Intel XE#4010]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4010
[Intel XE#4141]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4141
[Intel XE#4156]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4156
[Intel XE#4172]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4172
[Intel XE#4173]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/4173
[Intel XE#455]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/455
[Intel XE#569]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/569
[Intel XE#605]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/605
[Intel XE#607]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/607
[Intel XE#616]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/616
[Intel XE#619]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/619
[Intel XE#651]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/651
[Intel XE#653]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/653
[Intel XE#656]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/656
[Intel XE#658]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/658
[Intel XE#688]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/688
[Intel XE#718]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/718
[Intel XE#756]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/756
[Intel XE#776]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/776
[Intel XE#787]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/787
[Intel XE#827]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/827
[Intel XE#836]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/836
[Intel XE#870]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/870
[Intel XE#877]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/877
[Intel XE#886]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/886
[Intel XE#899]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/899
[Intel XE#908]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/908
[Intel XE#911]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/911
[Intel XE#929]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/929
[Intel XE#944]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/944
[Intel XE#977]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/977
[Intel XE#979]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/979
[i915#2575]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/2575
Build changes
-------------
* IGT: IGT_8214 -> IGT_8216
* Linux: xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b -> xe-pw-131815v17
IGT_8214: 7a8a3744466fbb89127201077f030033c72df948 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
IGT_8216: b7ebe99077e2a0ae39fff84cdaefa7851a513cb3 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
xe-2572-c2a5da40b8b1c5af77dcdabed8516069949fea3b: c2a5da40b8b1c5af77dcdabed8516069949fea3b
xe-pw-131815v17: 131815v17
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-131815v17/index.html
[-- Attachment #2: Type: text/html, Size: 175079 bytes --]
^ permalink raw reply [flat|nested] 26+ messages in thread