* [PATCH v2 0/3] drm/xe/vf: Post-migration recovery of GGTT nodes and CTB
@ 2024-11-16 2:12 Tomasz Lis
2024-11-16 2:12 ` [PATCH v2 1/3] drm/drm_mm: Safe macro for iterating through nodes in range Tomasz Lis
` (9 more replies)
0 siblings, 10 replies; 16+ messages in thread
From: Tomasz Lis @ 2024-11-16 2:12 UTC (permalink / raw)
To: intel-xe
Cc: Michał Winiarski, Michał Wajdeczko,
Piotr Piórkowski
To support VF Migration, it is necessary to do fixups to any
non-virtualized resources. These fixups need to be applied within
VM, on the KMD working with VF.
This series adds two fixup functions to the recovery worker:
* for fixing drm_mm nodes which represent GGTT allocations
* for fixing content of outgoing CTB buffer
v2: Fixed missing include, made checkpatch happy
Tomasz Lis (3):
drm/drm_mm: Safe macro for iterating through nodes in range
drm/xe/sriov: Shifting GGTT area post migration
drm/xe/vf: Fixup CTB send buffer messages after migration
drivers/gpu/drm/xe/xe_gt_sriov_vf.c | 177 ++++++++++++++++++++++
drivers/gpu/drm/xe/xe_gt_sriov_vf.h | 1 +
drivers/gpu/drm/xe/xe_gt_sriov_vf_types.h | 2 +
drivers/gpu/drm/xe/xe_guc_ct.c | 146 ++++++++++++++++++
drivers/gpu/drm/xe/xe_guc_ct.h | 2 +
drivers/gpu/drm/xe/xe_sriov_vf.c | 27 ++++
include/drm/drm_mm.h | 19 +++
7 files changed, 374 insertions(+)
--
2.25.1
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH v2 1/3] drm/drm_mm: Safe macro for iterating through nodes in range
2024-11-16 2:12 [PATCH v2 0/3] drm/xe/vf: Post-migration recovery of GGTT nodes and CTB Tomasz Lis
@ 2024-11-16 2:12 ` Tomasz Lis
2024-11-16 18:29 ` Michal Wajdeczko
2024-11-16 2:12 ` [PATCH v2 2/3] drm/xe/sriov: Shifting GGTT area post migration Tomasz Lis
` (8 subsequent siblings)
9 siblings, 1 reply; 16+ messages in thread
From: Tomasz Lis @ 2024-11-16 2:12 UTC (permalink / raw)
To: intel-xe
Cc: Michał Winiarski, Michał Wajdeczko,
Piotr Piórkowski
Benefits of drm_mm_for_each_node_safe and drm_mm_for_each_node_in_range
squished together into one macro.
Signed-off-by: Tomasz Lis <tomasz.lis@intel.com>
---
include/drm/drm_mm.h | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/include/drm/drm_mm.h b/include/drm/drm_mm.h
index f654874c4ce6..43e99441f6ba 100644
--- a/include/drm/drm_mm.h
+++ b/include/drm/drm_mm.h
@@ -504,6 +504,25 @@ __drm_mm_interval_first(const struct drm_mm *mm, u64 start, u64 last);
node__->start < (end__); \
node__ = list_next_entry(node__, node_list))
+/**
+ * drm_mm_for_each_node_in_range_safe - iterator to walk over a range of
+ * allocated nodes
+ * @node__: drm_mm_node structure to assign to in each iteration step
+ * @next__: &struct drm_mm_node to store the next step
+ * @mm__: drm_mm allocator to walk
+ * @start__: starting offset, the first node will overlap this
+ * @end__: ending offset, the last node will start before this (but may overlap)
+ *
+ * This iterator walks over all nodes in the range allocator that lie
+ * between @start and @end. It is implemented similarly to list_for_each_safe(),
+ * so safe against removal of elements.
+ */
+#define drm_mm_for_each_node_in_range_safe(node__, next__, mm__, start__, end__) \
+ for (node__ = __drm_mm_interval_first((mm__), (start__), (end__)-1), \
+ next__ = list_next_entry(node__, node_list); \
+ node__->start < (end__); \
+ node__ = next__, next__ = list_next_entry(next__, node_list))
+
void drm_mm_scan_init_with_range(struct drm_mm_scan *scan,
struct drm_mm *mm,
u64 size, u64 alignment, unsigned long color,
--
2.25.1
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v2 2/3] drm/xe/sriov: Shifting GGTT area post migration
2024-11-16 2:12 [PATCH v2 0/3] drm/xe/vf: Post-migration recovery of GGTT nodes and CTB Tomasz Lis
2024-11-16 2:12 ` [PATCH v2 1/3] drm/drm_mm: Safe macro for iterating through nodes in range Tomasz Lis
@ 2024-11-16 2:12 ` Tomasz Lis
2024-11-16 19:29 ` Michal Wajdeczko
2024-11-16 2:12 ` [PATCH v2 3/3] drm/xe/vf: Fixup CTB send buffer messages after migration Tomasz Lis
` (7 subsequent siblings)
9 siblings, 1 reply; 16+ messages in thread
From: Tomasz Lis @ 2024-11-16 2:12 UTC (permalink / raw)
To: intel-xe
Cc: Michał Winiarski, Michał Wajdeczko,
Piotr Piórkowski
We have only one GGTT for all IOV functions, with each VF having assigned
a range of addresses for its use. After migration, a VF can receive a
different range of addresses than it had initially.
This implements shifting GGTT addresses within drm_mm nodes, so that
VMAs stay valid after migration. This will make the driver use new
addresses when accessing GGTT from the moment the shifting ends.
By taking the ggtt->lock for the period of VMA fixups, this change
also adds constaint on that mutex. Any locks used during the recovery
cannot ever wait for hardware response - because after migration,
the hardware will not do anything until fixups are finished.
Signed-off-by: Tomasz Lis <tomasz.lis@intel.com>
---
drivers/gpu/drm/xe/xe_gt_sriov_vf.c | 175 ++++++++++++++++++++++++++++
drivers/gpu/drm/xe/xe_gt_sriov_vf.h | 1 +
drivers/gpu/drm/xe/xe_sriov_vf.c | 15 +++
3 files changed, 191 insertions(+)
diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_vf.c b/drivers/gpu/drm/xe/xe_gt_sriov_vf.c
index cca5d5732802..ae24c47ed8f8 100644
--- a/drivers/gpu/drm/xe/xe_gt_sriov_vf.c
+++ b/drivers/gpu/drm/xe/xe_gt_sriov_vf.c
@@ -912,6 +912,181 @@ int xe_gt_sriov_vf_query_runtime(struct xe_gt *gt)
return err;
}
+static u64 drm_mm_node_end(struct drm_mm_node *node)
+{
+ return node->start + node->size;
+}
+
+static s64 vf_get_post_migration_ggtt_shift(struct xe_gt *gt)
+{
+ struct xe_gt_sriov_vf_selfconfig *config = >->sriov.vf.self_config;
+ struct xe_tile *tile = gt_to_tile(gt);
+ u64 old_base;
+ s64 ggtt_shift;
+
+ old_base = drm_mm_node_end(&tile->sriov.vf.ggtt_balloon[0]->base);
+ ggtt_shift = config->ggtt_base - (s64)old_base;
+
+ xe_gt_sriov_info(gt, "GGTT base shifted from %#llx to %#llx\n",
+ old_base, old_base + ggtt_shift);
+
+ return ggtt_shift;
+}
+
+static void xe_ggtt_mm_shift_nodes(struct xe_ggtt *ggtt, struct drm_mm_node *balloon_beg,
+ struct drm_mm_node *balloon_fin, s64 shift)
+{
+ struct drm_mm_node *node, *tmpn;
+ int err;
+ LIST_HEAD(temp_list_head);
+
+ lockdep_assert_held(&ggtt->lock);
+
+ /*
+ * Move nodes, from range previously assigned to this VF, into temp list.
+ *
+ * The balloon_beg and balloon_fin nodes are there to eliminate unavailable
+ * ranges from use: first reserves the GGTT area below the range for current VF,
+ * and second reserves area above. There may also exist extra nodes at the bottom
+ * or top of GGTT range, as long as there are no free spaces inbetween. Such
+ * extra nodes will be left unchanged.
+ *
+ * Below is a GGTT layout of example VF, with a certain address range assigned to
+ * said VF, and inaccessible areas above and below:
+ *
+ * 0 ggtt->size
+ * |<--------------------------- Total GGTT size ----------------------------->|
+ *
+ * +-----------+-------------------------+----------+--------------+-----------+
+ * |\\\\\\\\\\\|/////////////////////////| VF mem |//////////////|\\\\\\\\\\\|
+ * +-----------+-------------------------+----------+--------------+-----------+
+ *
+ * Hardware enforced access rules before migration:
+ *
+ * |<------- inaccessible for VF ------->|<VF owned>|<-- inaccessible for VF ->|
+ *
+ * drm_mm nodes used for tracking allocations:
+ *
+ * |<- extra ->|<------- balloon ------->|<- nodes->|<-- balloon ->|<- extra ->|
+ *
+ * After the migration, GGTT area assigned to the VF might have shifted, either
+ * to lower or to higher address. But we expect the total size and extra areas to
+ * be identical, as migration can only happen between matching platforms.
+ * Below is an example of GGTT layout of the VF after migration. Content of the
+ * GGTT for VF has been moved to a new area, and we receive its address from GuC:
+ *
+ * +-----------+--------------+----------+-------------------------+-----------+
+ * |\\\\\\\\\\\|//////////////| VF mem |/////////////////////////|\\\\\\\\\\\|
+ * +-----------+--------------+----------+-------------------------+-----------+
+ *
+ * Hardware enforced access rules after migration:
+ *
+ * |<- inaccessible for VF -->|<VF owned>|<------- inaccessible for VF ------->|
+ *
+ * So the VF has a new slice of GGTT assigned, and during migration process, the
+ * memory content was copied to that new area. But the drm_mm nodes within i915
+ * are still tracking allocations using the old addresses. The nodes within VF
+ * owned area have to be shifted, and balloon nodes need to be resized to
+ * properly mask out areas not owned by the VF.
+ *
+ * Fixed drm_mm nodes used for tracking allocations:
+ *
+ * |<- extra ->|<- balloon ->|<-- VF -->|<-------- balloon ------>|<- extra ->|
+ *
+ * Due to use of GPU profiles, we do not expect the old and new GGTT ares to
+ * overlap; but our node shifting will fix addresses properly regardless.
+ *
+ */
+ drm_mm_for_each_node_in_range_safe(node, tmpn, &ggtt->mm,
+ drm_mm_node_end(balloon_beg),
+ balloon_fin->start) {
+ drm_mm_remove_node(node);
+ list_add(&node->node_list, &temp_list_head);
+ }
+
+ /* shift and re-add ballooning nodes */
+ if (drm_mm_node_allocated(balloon_beg))
+ drm_mm_remove_node(balloon_beg);
+ if (drm_mm_node_allocated(balloon_fin))
+ drm_mm_remove_node(balloon_fin);
+ balloon_beg->size += shift;
+ balloon_fin->start += shift;
+ balloon_fin->size -= shift;
+ if (balloon_beg->size != 0) {
+ err = drm_mm_reserve_node(&ggtt->mm, balloon_beg);
+ XE_WARN_ON(err);
+ }
+ if (balloon_fin->size != 0) {
+ err = drm_mm_reserve_node(&ggtt->mm, balloon_fin);
+ XE_WARN_ON(err);
+ }
+
+ /*
+ * Now the GGTT VM contains only nodes outside of area assigned to this VF.
+ * We can re-add all VF nodes with shifted offsets.
+ */
+ list_for_each_entry_safe(node, tmpn, &temp_list_head, node_list) {
+ list_del(&node->node_list);
+ node->start += shift;
+ err = drm_mm_reserve_node(&ggtt->mm, node);
+ XE_WARN_ON(err);
+ }
+}
+
+static void xe_ggtt_node_shift_nodes(struct xe_ggtt *ggtt, struct xe_ggtt_node *balloon_beg,
+ struct xe_ggtt_node *balloon_fin, s64 shift)
+{
+ struct drm_mm_node *balloon_mm_beg, *balloon_mm_end;
+ struct drm_mm_node loc_beg, loc_end;
+
+ if (balloon_beg && balloon_beg->ggtt)
+ balloon_mm_beg = &balloon_beg->base;
+ else {
+ loc_beg.color = 0;
+ loc_beg.flags = 0;
+ loc_beg.start = xe_wopcm_size(ggtt->tile->xe);
+ loc_beg.size = 0;
+ balloon_mm_beg = &loc_beg;
+ }
+
+ if (balloon_fin && balloon_fin->ggtt)
+ balloon_mm_end = &balloon_fin->base;
+ else {
+ loc_end.color = 0;
+ loc_end.flags = 0;
+ loc_end.start = GUC_GGTT_TOP;
+ loc_end.size = 0;
+ balloon_mm_end = &loc_end;
+ }
+
+ drm_dbg(&ggtt->tile->xe->drm, "tli: node shift start beg %llx %llx end %llx %llx\n",
+ balloon_mm_beg->start, balloon_mm_beg->size,
+ balloon_mm_end->start, balloon_mm_end->size);
+ xe_ggtt_mm_shift_nodes(ggtt, balloon_mm_beg, balloon_mm_end, shift);
+ drm_dbg(&ggtt->tile->xe->drm, "tli: node shift end\n");
+}
+
+/**
+ * xe_gt_sriov_vf_fixup_ggtt_nodes - Shift GGTT allocations to match assigned range.
+ * @gt: the &xe_gt struct instance
+ *
+ * Since Global GTT is not virtualized, each VF has an assigned range
+ * within the global space. This range might have changed during migration,
+ * which requires all memory addresses pointing to GGTT to be shifted.
+ */
+void xe_gt_sriov_vf_fixup_ggtt_nodes(struct xe_gt *gt)
+{
+ struct xe_tile *tile = gt_to_tile(gt);
+ struct xe_ggtt *ggtt = tile->mem.ggtt;
+ s64 ggtt_shift;
+
+ mutex_lock(&ggtt->lock);
+ ggtt_shift = vf_get_post_migration_ggtt_shift(gt);
+ xe_ggtt_node_shift_nodes(ggtt, tile->sriov.vf.ggtt_balloon[0],
+ tile->sriov.vf.ggtt_balloon[1], ggtt_shift);
+ mutex_unlock(&ggtt->lock);
+}
+
static int vf_runtime_reg_cmp(const void *a, const void *b)
{
const struct vf_runtime_reg *ra = a;
diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_vf.h b/drivers/gpu/drm/xe/xe_gt_sriov_vf.h
index 912d20814261..a8745ec23380 100644
--- a/drivers/gpu/drm/xe/xe_gt_sriov_vf.h
+++ b/drivers/gpu/drm/xe/xe_gt_sriov_vf.h
@@ -17,6 +17,7 @@ int xe_gt_sriov_vf_query_config(struct xe_gt *gt);
int xe_gt_sriov_vf_connect(struct xe_gt *gt);
int xe_gt_sriov_vf_query_runtime(struct xe_gt *gt);
int xe_gt_sriov_vf_prepare_ggtt(struct xe_gt *gt);
+void xe_gt_sriov_vf_fixup_ggtt_nodes(struct xe_gt *gt);
int xe_gt_sriov_vf_notify_resfix_done(struct xe_gt *gt);
void xe_gt_sriov_vf_migrated_event_handler(struct xe_gt *gt);
diff --git a/drivers/gpu/drm/xe/xe_sriov_vf.c b/drivers/gpu/drm/xe/xe_sriov_vf.c
index c1275e64aa9c..5bcd55999e0e 100644
--- a/drivers/gpu/drm/xe/xe_sriov_vf.c
+++ b/drivers/gpu/drm/xe/xe_sriov_vf.c
@@ -7,6 +7,7 @@
#include "xe_assert.h"
#include "xe_device.h"
+#include "xe_gt.h"
#include "xe_gt_sriov_printk.h"
#include "xe_gt_sriov_vf.h"
#include "xe_pm.h"
@@ -170,6 +171,19 @@ static bool vf_post_migration_imminent(struct xe_device *xe)
work_pending(&xe->sriov.vf.migration.worker);
}
+static void vf_post_migration_fixup_ggtt_nodes(struct xe_device *xe)
+{
+ struct xe_gt *gt;
+ unsigned int id;
+
+ for_each_gt(gt, xe, id) {
+ /* media doesn't have its own ggtt */
+ if (xe_gt_is_media_type(gt))
+ continue;
+ xe_gt_sriov_vf_fixup_ggtt_nodes(gt);
+ }
+}
+
/*
* Notify all GuCs about resource fixups apply finished.
*/
@@ -201,6 +215,7 @@ static void vf_post_migration_recovery(struct xe_device *xe)
if (unlikely(err))
goto fail;
+ vf_post_migration_fixup_ggtt_nodes(xe);
/* FIXME: add the recovery steps */
vf_post_migration_notify_resfix_done(xe);
xe_pm_runtime_put(xe);
--
2.25.1
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v2 3/3] drm/xe/vf: Fixup CTB send buffer messages after migration
2024-11-16 2:12 [PATCH v2 0/3] drm/xe/vf: Post-migration recovery of GGTT nodes and CTB Tomasz Lis
2024-11-16 2:12 ` [PATCH v2 1/3] drm/drm_mm: Safe macro for iterating through nodes in range Tomasz Lis
2024-11-16 2:12 ` [PATCH v2 2/3] drm/xe/sriov: Shifting GGTT area post migration Tomasz Lis
@ 2024-11-16 2:12 ` Tomasz Lis
2024-11-16 20:01 ` Michal Wajdeczko
2024-11-16 2:17 ` ✓ CI.Patch_applied: success for drm/xe/vf: Post-migration recovery of GGTT nodes and CTB (rev2) Patchwork
` (6 subsequent siblings)
9 siblings, 1 reply; 16+ messages in thread
From: Tomasz Lis @ 2024-11-16 2:12 UTC (permalink / raw)
To: intel-xe
Cc: Michał Winiarski, Michał Wajdeczko,
Piotr Piórkowski
During post-migration recovery of a VF, it in necessary to update
GGTT references included in messages which are going to be sent
to GuC. GuC will start consuming messages after VF KMD will inform
it about fixups being done; before that, the VF KMD is expected
to update any H2G messages which are already in send buffer but
were not consumed by GuC.
Only a small subset of messages allowed for VFs have GGTT references
in them. This patch adds the functionality to parse the CTB send
ring buffer and shift addresses contained within.
While fixing the CTB content, ct->lock is not taken. This means
the only barier taken remains GGTT address lock - which is ok,
because only requests with GGTT addresses matter, but it also means
tail changes can happen during the CTB fixups execution (which may
be ignored as any new messages will not have anything to fix).
The GGTT address locking will be introduced in a future series.
Signed-off-by: Tomasz Lis <tomasz.lis@intel.com>
---
drivers/gpu/drm/xe/xe_gt_sriov_vf.c | 2 +
drivers/gpu/drm/xe/xe_gt_sriov_vf_types.h | 2 +
drivers/gpu/drm/xe/xe_guc_ct.c | 146 ++++++++++++++++++++++
drivers/gpu/drm/xe/xe_guc_ct.h | 2 +
drivers/gpu/drm/xe/xe_sriov_vf.c | 12 ++
5 files changed, 164 insertions(+)
diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_vf.c b/drivers/gpu/drm/xe/xe_gt_sriov_vf.c
index ae24c47ed8f8..604cbbf55d4f 100644
--- a/drivers/gpu/drm/xe/xe_gt_sriov_vf.c
+++ b/drivers/gpu/drm/xe/xe_gt_sriov_vf.c
@@ -920,12 +920,14 @@ static u64 drm_mm_node_end(struct drm_mm_node *node)
static s64 vf_get_post_migration_ggtt_shift(struct xe_gt *gt)
{
struct xe_gt_sriov_vf_selfconfig *config = >->sriov.vf.self_config;
+ struct xe_gt_sriov_vf_runtime *runtime = >->sriov.vf.runtime;
struct xe_tile *tile = gt_to_tile(gt);
u64 old_base;
s64 ggtt_shift;
old_base = drm_mm_node_end(&tile->sriov.vf.ggtt_balloon[0]->base);
ggtt_shift = config->ggtt_base - (s64)old_base;
+ runtime->ggtt_shift = ggtt_shift;
xe_gt_sriov_info(gt, "GGTT base shifted from %#llx to %#llx\n",
old_base, old_base + ggtt_shift);
diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_vf_types.h b/drivers/gpu/drm/xe/xe_gt_sriov_vf_types.h
index a57f13b5afcd..6af219b0eb1e 100644
--- a/drivers/gpu/drm/xe/xe_gt_sriov_vf_types.h
+++ b/drivers/gpu/drm/xe/xe_gt_sriov_vf_types.h
@@ -65,6 +65,8 @@ struct xe_gt_sriov_vf_runtime {
/** @regs.value: register value. */
u32 value;
} *regs;
+ /** @ggtt_shift: difference in ggtt_base on last migration */
+ s64 ggtt_shift;
};
/**
diff --git a/drivers/gpu/drm/xe/xe_guc_ct.c b/drivers/gpu/drm/xe/xe_guc_ct.c
index 7eb175a0b874..119f4627a6d5 100644
--- a/drivers/gpu/drm/xe/xe_guc_ct.c
+++ b/drivers/gpu/drm/xe/xe_guc_ct.c
@@ -84,6 +84,8 @@ struct g2h_fence {
bool done;
};
+#define make_u64(hi, lo) ((u64)((u64)(u32)(hi) << 32 | (u32)(lo)))
+
static void g2h_fence_init(struct g2h_fence *g2h_fence, u32 *response_buffer)
{
g2h_fence->response_buffer = response_buffer;
@@ -1620,6 +1622,150 @@ static void g2h_worker_func(struct work_struct *w)
receive_g2h(ct);
}
+/*
+ * ct_update_addresses_in_message - Shift any GGTT addresses within
+ * a single message left within CTB from before post-migration recovery.
+ * @ct: pointer to CT struct of the target GuC
+ * @cmds: iomap buffer containing CT messages
+ * @head: start of the target message within the buffer
+ * @len: length of the target message
+ * @size: size of the commands buffer
+ * @shift: the address shift to be added to each GGTT reference
+ */
+static void ct_update_addresses_in_message(struct xe_guc_ct *ct,
+ struct iosys_map *cmds, u32 head,
+ u32 len, u32 size, s64 shift)
+{
+ struct xe_device *xe = ct_to_xe(ct);
+ u32 action, i, n;
+ u32 msg[2];
+ u64 offset;
+
+#define read32(o, p) \
+do { \
+ xe_map_memcpy_from(xe, msg, cmds, (head + p) * sizeof(u32), \
+ 1 * sizeof(u32)); \
+ o = msg[0]; \
+} while (0)
+#define fixup64(p) \
+do { \
+ xe_map_memcpy_from(xe, msg, cmds, (head + p) * sizeof(u32), \
+ 2 * sizeof(u32)); \
+ offset = make_u64(msg[1], msg[0]); \
+ offset += shift; \
+ msg[0] = lower_32_bits(offset); \
+ msg[1] = upper_32_bits(offset); \
+ xe_map_memcpy_to(xe, cmds, (head + p) * sizeof(u32), msg, 2 * sizeof(u32)); \
+} while (0)
+
+ xe_map_memcpy_from(xe, msg, cmds, head * sizeof(u32),
+ 1 * sizeof(u32));
+ action = FIELD_GET(GUC_HXG_REQUEST_MSG_0_ACTION, msg[0]);
+ switch (action) {
+ case XE_GUC_ACTION_REGISTER_CONTEXT:
+ case XE_GUC_ACTION_REGISTER_CONTEXT_MULTI_LRC:
+ /* field wq_desc */
+ fixup64(5);
+ /* field wq_base */
+ fixup64(7);
+ if (action == XE_GUC_ACTION_REGISTER_CONTEXT_MULTI_LRC) {
+ /* field number_children */
+ read32(n, 10);
+ /* field hwlrca and child lrcas */
+ for (i = 0; i < n; i++)
+ fixup64(11 + 2 * i);
+ } else {
+ /* field hwlrca */
+ fixup64(10);
+ }
+ break;
+ default:
+ break;
+ }
+#undef fixup64
+#undef read32
+}
+
+static int ct_update_addresses_in_buffer(struct xe_guc_ct *ct,
+ struct guc_ctb *h2g,
+ s64 shift, u32 *mhead, s32 avail)
+{
+ struct xe_device *xe = ct_to_xe(ct);
+ u32 head = *mhead;
+ u32 size = h2g->info.size;
+ u32 msg[1];
+ u32 len;
+
+ /* Read header */
+ xe_map_memcpy_from(xe, msg, &h2g->cmds, sizeof(u32) * head,
+ sizeof(u32));
+ len = FIELD_GET(GUC_CTB_MSG_0_NUM_DWORDS, msg[0]) + GUC_CTB_MSG_MIN_LEN;
+
+ if (unlikely(len > (u32)avail)) {
+ struct xe_gt *gt = ct_to_gt(ct);
+
+ xe_gt_err(gt, "H2G channel broken on read, avail=%d, len=%d, fixups skipped\n",
+ avail, len);
+ return 0;
+ }
+
+ head = (head + 1) % size;
+ ct_update_addresses_in_message(ct, &h2g->cmds, head, len - 1, size, shift);
+ *mhead = (head + len - 1) % size;
+
+ return avail - len;
+}
+
+/**
+ * xe_guc_ct_update_addresses - Shifts any GGTT addresses left
+ * within CTB from before post-migration recovery.
+ * @ct: pointer to CT struct of the target GuC
+ */
+int xe_guc_ct_update_addresses(struct xe_guc_ct *ct)
+{
+ struct xe_guc *guc = ct_to_guc(ct);
+ struct xe_gt *gt = guc_to_gt(guc);
+ struct xe_gt_sriov_vf_runtime *runtime = >->sriov.vf.runtime;
+ struct guc_ctb *h2g = &ct->ctbs.h2g;
+ u32 head = h2g->info.head;
+ u32 tail = READ_ONCE(h2g->info.tail);
+ u32 size = h2g->info.size;
+ s32 avail;
+ s64 ggtt_shift;
+
+ if (unlikely(h2g->info.broken))
+ return -EPIPE;
+
+ XE_WARN_ON(head > size);
+
+ if (unlikely(tail >= size)) {
+ xe_gt_err(gt, "H2G channel has Invalid tail offset (%u >= %u)\n",
+ tail, size);
+ goto corrupted;
+ }
+
+ avail = tail - head;
+
+ /* beware of buffer wrap case */
+ if (unlikely(avail < 0))
+ avail += size;
+ xe_gt_dbg(gt, "available %d (%u:%u:%u)\n", avail, head, tail, size);
+ XE_WARN_ON(avail < 0);
+
+ ggtt_shift = runtime->ggtt_shift;
+
+ while (avail > 0)
+ avail = ct_update_addresses_in_buffer(ct, h2g, ggtt_shift, &head, avail);
+
+ return 0;
+
+corrupted:
+ xe_gt_err(gt, "Corrupted descriptor head=%u tail=%u\n",
+ head, tail);
+ h2g->info.broken = true;
+ return -EPIPE;
+}
+
static struct xe_guc_ct_snapshot *guc_ct_snapshot_alloc(struct xe_guc_ct *ct, bool atomic,
bool want_ctb)
{
diff --git a/drivers/gpu/drm/xe/xe_guc_ct.h b/drivers/gpu/drm/xe/xe_guc_ct.h
index 82c4ae458dda..6b04fd4b1e03 100644
--- a/drivers/gpu/drm/xe/xe_guc_ct.h
+++ b/drivers/gpu/drm/xe/xe_guc_ct.h
@@ -22,6 +22,8 @@ void xe_guc_ct_snapshot_print(struct xe_guc_ct_snapshot *snapshot, struct drm_pr
void xe_guc_ct_snapshot_free(struct xe_guc_ct_snapshot *snapshot);
void xe_guc_ct_print(struct xe_guc_ct *ct, struct drm_printer *p, bool want_ctb);
+int xe_guc_ct_update_addresses(struct xe_guc_ct *ct);
+
static inline bool xe_guc_ct_enabled(struct xe_guc_ct *ct)
{
return ct->state == XE_GUC_CT_STATE_ENABLED;
diff --git a/drivers/gpu/drm/xe/xe_sriov_vf.c b/drivers/gpu/drm/xe/xe_sriov_vf.c
index 5bcd55999e0e..08c789ebfa18 100644
--- a/drivers/gpu/drm/xe/xe_sriov_vf.c
+++ b/drivers/gpu/drm/xe/xe_sriov_vf.c
@@ -10,6 +10,7 @@
#include "xe_gt.h"
#include "xe_gt_sriov_printk.h"
#include "xe_gt_sriov_vf.h"
+#include "xe_guc_ct.h"
#include "xe_pm.h"
#include "xe_sriov.h"
#include "xe_sriov_printk.h"
@@ -158,6 +159,15 @@ static int vf_post_migration_requery_guc(struct xe_device *xe)
return ret;
}
+static void vf_post_migration_fixup_ctb(struct xe_device *xe)
+{
+ struct xe_gt *gt;
+ unsigned int id;
+
+ for_each_gt(gt, xe, id)
+ xe_guc_ct_update_addresses(>->uc.guc.ct);
+}
+
/*
* vf_post_migration_imminent - Check if post-restore recovery is coming.
* @xe: the &xe_device struct instance
@@ -217,6 +227,8 @@ static void vf_post_migration_recovery(struct xe_device *xe)
vf_post_migration_fixup_ggtt_nodes(xe);
/* FIXME: add the recovery steps */
+ vf_post_migration_fixup_ctb(xe);
+
vf_post_migration_notify_resfix_done(xe);
xe_pm_runtime_put(xe);
drm_notice(&xe->drm, "migration recovery ended\n");
--
2.25.1
^ permalink raw reply related [flat|nested] 16+ messages in thread
* ✓ CI.Patch_applied: success for drm/xe/vf: Post-migration recovery of GGTT nodes and CTB (rev2)
2024-11-16 2:12 [PATCH v2 0/3] drm/xe/vf: Post-migration recovery of GGTT nodes and CTB Tomasz Lis
` (2 preceding siblings ...)
2024-11-16 2:12 ` [PATCH v2 3/3] drm/xe/vf: Fixup CTB send buffer messages after migration Tomasz Lis
@ 2024-11-16 2:17 ` Patchwork
2024-11-16 2:17 ` ✗ CI.checkpatch: warning " Patchwork
` (5 subsequent siblings)
9 siblings, 0 replies; 16+ messages in thread
From: Patchwork @ 2024-11-16 2:17 UTC (permalink / raw)
To: Tomasz Lis; +Cc: intel-xe
== Series Details ==
Series: drm/xe/vf: Post-migration recovery of GGTT nodes and CTB (rev2)
URL : https://patchwork.freedesktop.org/series/141439/
State : success
== Summary ==
=== Applying kernel patches on branch 'drm-tip' with base: ===
Base commit: 9a7388467f79 drm-tip: 2024y-11m-16d-00h-00m-45s UTC integration manifest
=== git am output follows ===
Applying: drm/drm_mm: Safe macro for iterating through nodes in range
Applying: drm/xe/sriov: Shifting GGTT area post migration
Applying: drm/xe/vf: Fixup CTB send buffer messages after migration
^ permalink raw reply [flat|nested] 16+ messages in thread
* ✗ CI.checkpatch: warning for drm/xe/vf: Post-migration recovery of GGTT nodes and CTB (rev2)
2024-11-16 2:12 [PATCH v2 0/3] drm/xe/vf: Post-migration recovery of GGTT nodes and CTB Tomasz Lis
` (3 preceding siblings ...)
2024-11-16 2:17 ` ✓ CI.Patch_applied: success for drm/xe/vf: Post-migration recovery of GGTT nodes and CTB (rev2) Patchwork
@ 2024-11-16 2:17 ` Patchwork
2024-11-16 2:18 ` ✓ CI.KUnit: success " Patchwork
` (4 subsequent siblings)
9 siblings, 0 replies; 16+ messages in thread
From: Patchwork @ 2024-11-16 2:17 UTC (permalink / raw)
To: Tomasz Lis; +Cc: intel-xe
== Series Details ==
Series: drm/xe/vf: Post-migration recovery of GGTT nodes and CTB (rev2)
URL : https://patchwork.freedesktop.org/series/141439/
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 92e00ec09ea2e7026264fbd635da4c9bde405270
Author: Tomasz Lis <tomasz.lis@intel.com>
Date: Sat Nov 16 03:12:38 2024 +0100
drm/xe/vf: Fixup CTB send buffer messages after migration
During post-migration recovery of a VF, it in necessary to update
GGTT references included in messages which are going to be sent
to GuC. GuC will start consuming messages after VF KMD will inform
it about fixups being done; before that, the VF KMD is expected
to update any H2G messages which are already in send buffer but
were not consumed by GuC.
Only a small subset of messages allowed for VFs have GGTT references
in them. This patch adds the functionality to parse the CTB send
ring buffer and shift addresses contained within.
While fixing the CTB content, ct->lock is not taken. This means
the only barier taken remains GGTT address lock - which is ok,
because only requests with GGTT addresses matter, but it also means
tail changes can happen during the CTB fixups execution (which may
be ignored as any new messages will not have anything to fix).
The GGTT address locking will be introduced in a future series.
Signed-off-by: Tomasz Lis <tomasz.lis@intel.com>
+ /mt/dim checkpatch 9a7388467f79fb74c67a2444c5b1add91652f89e drm-intel
4d2ba25c1794 drm/drm_mm: Safe macro for iterating through nodes in range
-:32: CHECK:MACRO_ARG_REUSE: Macro argument reuse 'node__' - possible side-effects?
#32: FILE: include/drm/drm_mm.h:520:
+#define drm_mm_for_each_node_in_range_safe(node__, next__, mm__, start__, end__) \
+ for (node__ = __drm_mm_interval_first((mm__), (start__), (end__)-1), \
+ next__ = list_next_entry(node__, node_list); \
+ node__->start < (end__); \
+ node__ = next__, next__ = list_next_entry(next__, node_list))
-:32: CHECK:MACRO_ARG_REUSE: Macro argument reuse 'next__' - possible side-effects?
#32: FILE: include/drm/drm_mm.h:520:
+#define drm_mm_for_each_node_in_range_safe(node__, next__, mm__, start__, end__) \
+ for (node__ = __drm_mm_interval_first((mm__), (start__), (end__)-1), \
+ next__ = list_next_entry(node__, node_list); \
+ node__->start < (end__); \
+ node__ = next__, next__ = list_next_entry(next__, node_list))
-:32: CHECK:MACRO_ARG_REUSE: Macro argument reuse 'end__' - possible side-effects?
#32: FILE: include/drm/drm_mm.h:520:
+#define drm_mm_for_each_node_in_range_safe(node__, next__, mm__, start__, end__) \
+ for (node__ = __drm_mm_interval_first((mm__), (start__), (end__)-1), \
+ next__ = list_next_entry(node__, node_list); \
+ node__->start < (end__); \
+ node__ = next__, next__ = list_next_entry(next__, node_list))
-:33: CHECK:SPACING: spaces preferred around that '-' (ctx:VxV)
#33: FILE: include/drm/drm_mm.h:521:
+ for (node__ = __drm_mm_interval_first((mm__), (start__), (end__)-1), \
^
total: 0 errors, 0 warnings, 4 checks, 25 lines checked
7ad5c07295cc drm/xe/sriov: Shifting GGTT area post migration
-:45: CHECK:PARENTHESIS_ALIGNMENT: Alignment should match open parenthesis
#45: FILE: drivers/gpu/drm/xe/xe_gt_sriov_vf.c:931:
+ xe_gt_sriov_info(gt, "GGTT base shifted from %#llx to %#llx\n",
+ old_base, old_base + ggtt_shift);
-:51: CHECK:PARENTHESIS_ALIGNMENT: Alignment should match open parenthesis
#51: FILE: drivers/gpu/drm/xe/xe_gt_sriov_vf.c:937:
+static void xe_ggtt_mm_shift_nodes(struct xe_ggtt *ggtt, struct drm_mm_node *balloon_beg,
+ struct drm_mm_node *balloon_fin, s64 shift)
-:151: CHECK:PARENTHESIS_ALIGNMENT: Alignment should match open parenthesis
#151: FILE: drivers/gpu/drm/xe/xe_gt_sriov_vf.c:1037:
+static void xe_ggtt_node_shift_nodes(struct xe_ggtt *ggtt, struct xe_ggtt_node *balloon_beg,
+ struct xe_ggtt_node *balloon_fin, s64 shift)
-:156: CHECK:BRACES: braces {} should be used on all arms of this statement
#156: FILE: drivers/gpu/drm/xe/xe_gt_sriov_vf.c:1042:
+ if (balloon_beg && balloon_beg->ggtt)
[...]
+ else {
[...]
-:158: CHECK:BRACES: Unbalanced braces around else statement
#158: FILE: drivers/gpu/drm/xe/xe_gt_sriov_vf.c:1044:
+ else {
-:166: CHECK:BRACES: braces {} should be used on all arms of this statement
#166: FILE: drivers/gpu/drm/xe/xe_gt_sriov_vf.c:1052:
+ if (balloon_fin && balloon_fin->ggtt)
[...]
+ else {
[...]
-:168: CHECK:BRACES: Unbalanced braces around else statement
#168: FILE: drivers/gpu/drm/xe/xe_gt_sriov_vf.c:1054:
+ else {
total: 0 errors, 0 warnings, 7 checks, 221 lines checked
92e00ec09ea2 drm/xe/vf: Fixup CTB send buffer messages after migration
-:87: CHECK:PARENTHESIS_ALIGNMENT: Alignment should match open parenthesis
#87: FILE: drivers/gpu/drm/xe/xe_guc_ct.c:1636:
+static void ct_update_addresses_in_message(struct xe_guc_ct *ct,
+ struct iosys_map *cmds, u32 head,
-:95: CHECK:MACRO_ARG_PRECEDENCE: Macro argument 'p' may be better as '(p)' to avoid precedence issues
#95: FILE: drivers/gpu/drm/xe/xe_guc_ct.c:1644:
+#define read32(o, p) \
+do { \
+ xe_map_memcpy_from(xe, msg, cmds, (head + p) * sizeof(u32), \
+ 1 * sizeof(u32)); \
+ o = msg[0]; \
+} while (0)
-:101: CHECK:MACRO_ARG_REUSE: Macro argument reuse 'p' - possible side-effects?
#101: FILE: drivers/gpu/drm/xe/xe_guc_ct.c:1650:
+#define fixup64(p) \
+do { \
+ xe_map_memcpy_from(xe, msg, cmds, (head + p) * sizeof(u32), \
+ 2 * sizeof(u32)); \
+ offset = make_u64(msg[1], msg[0]); \
+ offset += shift; \
+ msg[0] = lower_32_bits(offset); \
+ msg[1] = upper_32_bits(offset); \
+ xe_map_memcpy_to(xe, cmds, (head + p) * sizeof(u32), msg, 2 * sizeof(u32)); \
+} while (0)
-:101: CHECK:MACRO_ARG_PRECEDENCE: Macro argument 'p' may be better as '(p)' to avoid precedence issues
#101: FILE: drivers/gpu/drm/xe/xe_guc_ct.c:1650:
+#define fixup64(p) \
+do { \
+ xe_map_memcpy_from(xe, msg, cmds, (head + p) * sizeof(u32), \
+ 2 * sizeof(u32)); \
+ offset = make_u64(msg[1], msg[0]); \
+ offset += shift; \
+ msg[0] = lower_32_bits(offset); \
+ msg[1] = upper_32_bits(offset); \
+ xe_map_memcpy_to(xe, cmds, (head + p) * sizeof(u32), msg, 2 * sizeof(u32)); \
+} while (0)
-:194: CHECK:PARENTHESIS_ALIGNMENT: Alignment should match open parenthesis
#194: FILE: drivers/gpu/drm/xe/xe_guc_ct.c:1743:
+ xe_gt_err(gt, "H2G channel has Invalid tail offset (%u >= %u)\n",
+ tail, size);
-:215: CHECK:PARENTHESIS_ALIGNMENT: Alignment should match open parenthesis
#215: FILE: drivers/gpu/drm/xe/xe_guc_ct.c:1764:
+ xe_gt_err(gt, "Corrupted descriptor head=%u tail=%u\n",
+ head, tail);
total: 0 errors, 0 warnings, 6 checks, 218 lines checked
^ permalink raw reply [flat|nested] 16+ messages in thread
* ✓ CI.KUnit: success for drm/xe/vf: Post-migration recovery of GGTT nodes and CTB (rev2)
2024-11-16 2:12 [PATCH v2 0/3] drm/xe/vf: Post-migration recovery of GGTT nodes and CTB Tomasz Lis
` (4 preceding siblings ...)
2024-11-16 2:17 ` ✗ CI.checkpatch: warning " Patchwork
@ 2024-11-16 2:18 ` Patchwork
2024-11-16 2:36 ` ✓ CI.Build: " Patchwork
` (3 subsequent siblings)
9 siblings, 0 replies; 16+ messages in thread
From: Patchwork @ 2024-11-16 2:18 UTC (permalink / raw)
To: Tomasz Lis; +Cc: intel-xe
== Series Details ==
Series: drm/xe/vf: Post-migration recovery of GGTT nodes and CTB (rev2)
URL : https://patchwork.freedesktop.org/series/141439/
State : success
== Summary ==
+ trap cleanup EXIT
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/xe/.kunitconfig
[02:17:44] Configuring KUnit Kernel ...
Generating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[02:17:48] 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)
| ^~~~~~~~~~~~~~~~~
[02:18:16] Starting KUnit Kernel (1/1)...
[02:18:16] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[02:18:17] =================== guc_dbm (7 subtests) ===================
[02:18:17] [PASSED] test_empty
[02:18:17] [PASSED] test_default
[02:18:17] ======================== test_size ========================
[02:18:17] [PASSED] 4
[02:18:17] [PASSED] 8
[02:18:17] [PASSED] 32
[02:18:17] [PASSED] 256
[02:18:17] ==================== [PASSED] test_size ====================
[02:18:17] ======================= test_reuse ========================
[02:18:17] [PASSED] 4
[02:18:17] [PASSED] 8
[02:18:17] [PASSED] 32
[02:18:17] [PASSED] 256
[02:18:17] =================== [PASSED] test_reuse ====================
[02:18:17] =================== test_range_overlap ====================
[02:18:17] [PASSED] 4
[02:18:17] [PASSED] 8
[02:18:17] [PASSED] 32
[02:18:17] [PASSED] 256
[02:18:17] =============== [PASSED] test_range_overlap ================
[02:18:17] =================== test_range_compact ====================
[02:18:17] [PASSED] 4
[02:18:17] [PASSED] 8
[02:18:17] [PASSED] 32
[02:18:17] [PASSED] 256
[02:18:17] =============== [PASSED] test_range_compact ================
[02:18:17] ==================== test_range_spare =====================
[02:18:17] [PASSED] 4
[02:18:17] [PASSED] 8
[02:18:17] [PASSED] 32
[02:18:17] [PASSED] 256
[02:18:17] ================ [PASSED] test_range_spare =================
[02:18:17] ===================== [PASSED] guc_dbm =====================
[02:18:17] =================== guc_idm (6 subtests) ===================
[02:18:17] [PASSED] bad_init
[02:18:17] [PASSED] no_init
[02:18:17] [PASSED] init_fini
[02:18:17] [PASSED] check_used
[02:18:17] [PASSED] check_quota
[02:18:17] [PASSED] check_all
[02:18:17] ===================== [PASSED] guc_idm =====================
[02:18:17] ================== no_relay (3 subtests) ===================
[02:18:17] [PASSED] xe_drops_guc2pf_if_not_ready
[02:18:17] [PASSED] xe_drops_guc2vf_if_not_ready
[02:18:17] [PASSED] xe_rejects_send_if_not_ready
[02:18:17] ==================== [PASSED] no_relay =====================
[02:18:17] ================== pf_relay (14 subtests) ==================
[02:18:17] [PASSED] pf_rejects_guc2pf_too_short
[02:18:17] [PASSED] pf_rejects_guc2pf_too_long
[02:18:17] [PASSED] pf_rejects_guc2pf_no_payload
[02:18:17] [PASSED] pf_fails_no_payload
[02:18:17] [PASSED] pf_fails_bad_origin
[02:18:17] [PASSED] pf_fails_bad_type
[02:18:17] [PASSED] pf_txn_reports_error
[02:18:17] [PASSED] pf_txn_sends_pf2guc
[02:18:17] [PASSED] pf_sends_pf2guc
[02:18:17] [SKIPPED] pf_loopback_nop
[02:18:17] [SKIPPED] pf_loopback_echo
[02:18:17] [SKIPPED] pf_loopback_fail
[02:18:17] [SKIPPED] pf_loopback_busy
[02:18:17] [SKIPPED] pf_loopback_retry
[02:18:17] ==================== [PASSED] pf_relay =====================
[02:18:17] ================== vf_relay (3 subtests) ===================
[02:18:17] [PASSED] vf_rejects_guc2vf_too_short
[02:18:17] [PASSED] vf_rejects_guc2vf_too_long
[02:18:17] [PASSED] vf_rejects_guc2vf_no_payload
[02:18:17] ==================== [PASSED] vf_relay =====================
[02:18:17] ================= pf_service (11 subtests) =================
[02:18:17] [PASSED] pf_negotiate_any
[02:18:17] [PASSED] pf_negotiate_base_match
[02:18:17] [PASSED] pf_negotiate_base_newer
[02:18:17] [PASSED] pf_negotiate_base_next
[02:18:17] [SKIPPED] pf_negotiate_base_older
[02:18:17] [PASSED] pf_negotiate_base_prev
[02:18:17] [PASSED] pf_negotiate_latest_match
[02:18:17] [PASSED] pf_negotiate_latest_newer
[02:18:17] [PASSED] pf_negotiate_latest_next
[02:18:17] [SKIPPED] pf_negotiate_latest_older
[02:18:17] [SKIPPED] pf_negotiate_latest_prev
[02:18:17] =================== [PASSED] pf_service ====================
[02:18:17] ===================== lmtt (1 subtest) =====================
[02:18:17] ======================== test_ops =========================
[02:18:17] [PASSED] 2-level
[02:18:17] [PASSED] multi-level
[02:18:17] ==================== [PASSED] test_ops =====================
[02:18:17] ====================== [PASSED] lmtt =======================
[02:18:17] =================== xe_mocs (2 subtests) ===================
[02:18:17] ================ xe_live_mocs_kernel_kunit ================
[02:18:17] =========== [SKIPPED] xe_live_mocs_kernel_kunit ============
[02:18:17] ================ xe_live_mocs_reset_kunit =================
[02:18:17] ============ [SKIPPED] xe_live_mocs_reset_kunit ============
[02:18:17] ==================== [SKIPPED] xe_mocs =====================
[02:18:17] ================= xe_migrate (2 subtests) ==================
[02:18:17] ================= xe_migrate_sanity_kunit =================
[02:18:17] ============ [SKIPPED] xe_migrate_sanity_kunit =============
[02:18:17] ================== xe_validate_ccs_kunit ==================
[02:18:17] ============= [SKIPPED] xe_validate_ccs_kunit ==============
[02:18:17] =================== [SKIPPED] xe_migrate ===================
[02:18:17] ================== xe_dma_buf (1 subtest) ==================
[02:18:17] ==================== xe_dma_buf_kunit =====================
[02:18:17] ================ [SKIPPED] xe_dma_buf_kunit ================
[02:18:17] =================== [SKIPPED] xe_dma_buf ===================
[02:18:17] ==================== xe_bo (3 subtests) ====================
[02:18:17] ================== xe_ccs_migrate_kunit ===================
[02:18:17] ============== [SKIPPED] xe_ccs_migrate_kunit ==============
[02:18:17] ==================== xe_bo_evict_kunit ====================
[02:18:17] =============== [SKIPPED] xe_bo_evict_kunit ================
[02:18:17] =================== xe_bo_shrink_kunit ====================
[02:18:17] =============== [SKIPPED] xe_bo_shrink_kunit ===============
[02:18:17] ===================== [SKIPPED] xe_bo ======================
[02:18:17] ==================== args (11 subtests) ====================
[02:18:17] [PASSED] count_args_test
[02:18:17] [PASSED] call_args_example
[02:18:17] [PASSED] call_args_test
[02:18:17] [PASSED] drop_first_arg_example
[02:18:17] [PASSED] drop_first_arg_test
[02:18:17] [PASSED] first_arg_example
[02:18:17] [PASSED] first_arg_test
[02:18:17] [PASSED] last_arg_example
[02:18:17] [PASSED] last_arg_test
[02:18:17] [PASSED] pick_arg_example
[02:18:17] [PASSED] sep_comma_examplestty: 'standard input': Inappropriate ioctl for device
[02:18:17] ====================== [PASSED] args =======================
[02:18:17] =================== xe_pci (2 subtests) ====================
[02:18:17] [PASSED] xe_gmdid_graphics_ip
[02:18:17] [PASSED] xe_gmdid_media_ip
[02:18:17] ===================== [PASSED] xe_pci ======================
[02:18:17] =================== xe_rtp (2 subtests) ====================
[02:18:17] =============== xe_rtp_process_to_sr_tests ================
[02:18:17] [PASSED] coalesce-same-reg
[02:18:17] [PASSED] no-match-no-add
[02:18:17] [PASSED] match-or
[02:18:17] [PASSED] match-or-xfail
[02:18:17] [PASSED] no-match-no-add-multiple-rules
[02:18:17] [PASSED] two-regs-two-entries
[02:18:17] [PASSED] clr-one-set-other
[02:18:17] [PASSED] set-field
[02:18:17] [PASSED] conflict-duplicate
[02:18:17] [PASSED] conflict-not-disjoint
[02:18:17] [PASSED] conflict-reg-type
[02:18:17] =========== [PASSED] xe_rtp_process_to_sr_tests ============
[02:18:17] ================== xe_rtp_process_tests ===================
[02:18:17] [PASSED] active1
[02:18:17] [PASSED] active2
[02:18:17] [PASSED] active-inactive
[02:18:17] [PASSED] inactive-active
[02:18:17] [PASSED] inactive-1st_or_active-inactive
[02:18:17] [PASSED] inactive-2nd_or_active-inactive
[02:18:17] [PASSED] inactive-last_or_active-inactive
[02:18:17] [PASSED] inactive-no_or_active-inactive
[02:18:17] ============== [PASSED] xe_rtp_process_tests ===============
[02:18:17] ===================== [PASSED] xe_rtp ======================
[02:18:17] ==================== xe_wa (1 subtest) =====================
[02:18:17] ======================== xe_wa_gt =========================
[02:18:17] [PASSED] TIGERLAKE (B0)
[02:18:17] [PASSED] DG1 (A0)
[02:18:17] [PASSED] DG1 (B0)
[02:18:17] [PASSED] ALDERLAKE_S (A0)
[02:18:17] [PASSED] ALDERLAKE_S (B0)
[02:18:17] [PASSED] ALDERLAKE_S (C0)
[02:18:17] [PASSED] ALDERLAKE_S (D0)
[02:18:17] [PASSED] ALDERLAKE_P (A0)
[02:18:17] [PASSED] ALDERLAKE_P (B0)
[02:18:17] [PASSED] ALDERLAKE_P (C0)
[02:18:17] [PASSED] ALDERLAKE_S_RPLS (D0)
[02:18:17] [PASSED] ALDERLAKE_P_RPLU (E0)
[02:18:17] [PASSED] DG2_G10 (C0)
[02:18:17] [PASSED] DG2_G11 (B1)
[02:18:17] [PASSED] DG2_G12 (A1)
[02:18:17] [PASSED] METEORLAKE (g:A0, m:A0)
[02:18:17] [PASSED] METEORLAKE (g:A0, m:A0)
[02:18:17] [PASSED] METEORLAKE (g:A0, m:A0)
[02:18:17] [PASSED] LUNARLAKE (g:A0, m:A0)
[02:18:17] [PASSED] LUNARLAKE (g:B0, m:A0)
[02:18:17] [PASSED] BATTLEMAGE (g:A0, m:A1)
[02:18:17] ==================== [PASSED] xe_wa_gt =====================
[02:18:17] ====================== [PASSED] xe_wa ======================
[02:18:17] ============================================================
[02:18:17] Testing complete. Ran 122 tests: passed: 106, skipped: 16
[02:18:17] Elapsed time: 32.863s total, 4.463s configuring, 28.133s building, 0.223s running
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/tests/.kunitconfig
[02:18:17] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[02:18:18] 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)
| ^~~~~~~~~~~~~~~~~
[02:18:41] Starting KUnit Kernel (1/1)...
[02:18:41] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[02:18:41] ================== drm_buddy (7 subtests) ==================
[02:18:41] [PASSED] drm_test_buddy_alloc_limit
[02:18:41] [PASSED] drm_test_buddy_alloc_optimistic
[02:18:41] [PASSED] drm_test_buddy_alloc_pessimistic
[02:18:41] [PASSED] drm_test_buddy_alloc_pathological
[02:18:41] [PASSED] drm_test_buddy_alloc_contiguous
[02:18:41] [PASSED] drm_test_buddy_alloc_clear
[02:18:41] [PASSED] drm_test_buddy_alloc_range_bias
[02:18:41] ==================== [PASSED] drm_buddy ====================
[02:18:41] ============= drm_cmdline_parser (40 subtests) =============
[02:18:41] [PASSED] drm_test_cmdline_force_d_only
[02:18:41] [PASSED] drm_test_cmdline_force_D_only_dvi
[02:18:41] [PASSED] drm_test_cmdline_force_D_only_hdmi
[02:18:41] [PASSED] drm_test_cmdline_force_D_only_not_digital
[02:18:41] [PASSED] drm_test_cmdline_force_e_only
[02:18:41] [PASSED] drm_test_cmdline_res
[02:18:41] [PASSED] drm_test_cmdline_res_vesa
[02:18:41] [PASSED] drm_test_cmdline_res_vesa_rblank
[02:18:41] [PASSED] drm_test_cmdline_res_rblank
[02:18:41] [PASSED] drm_test_cmdline_res_bpp
[02:18:41] [PASSED] drm_test_cmdline_res_refresh
[02:18:41] [PASSED] drm_test_cmdline_res_bpp_refresh
[02:18:41] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced
[02:18:41] [PASSED] drm_test_cmdline_res_bpp_refresh_margins
[02:18:41] [PASSED] drm_test_cmdline_res_bpp_refresh_force_off
[02:18:41] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on
[02:18:41] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_analog
[02:18:41] [PASSED] drm_test_cmdline_res_bpp_refresh_force_on_digital
[02:18:41] [PASSED] drm_test_cmdline_res_bpp_refresh_interlaced_margins_force_on
[02:18:41] [PASSED] drm_test_cmdline_res_margins_force_on
[02:18:41] [PASSED] drm_test_cmdline_res_vesa_margins
[02:18:41] [PASSED] drm_test_cmdline_name
[02:18:41] [PASSED] drm_test_cmdline_name_bpp
[02:18:41] [PASSED] drm_test_cmdline_name_option
[02:18:41] [PASSED] drm_test_cmdline_name_bpp_option
[02:18:41] [PASSED] drm_test_cmdline_rotate_0
[02:18:41] [PASSED] drm_test_cmdline_rotate_90
[02:18:41] [PASSED] drm_test_cmdline_rotate_180
[02:18:41] [PASSED] drm_test_cmdline_rotate_270
[02:18:41] [PASSED] drm_test_cmdline_hmirror
[02:18:41] [PASSED] drm_test_cmdline_vmirror
[02:18:41] [PASSED] drm_test_cmdline_margin_options
[02:18:41] [PASSED] drm_test_cmdline_multiple_options
[02:18:41] [PASSED] drm_test_cmdline_bpp_extra_and_option
[02:18:41] [PASSED] drm_test_cmdline_extra_and_option
[02:18:41] [PASSED] drm_test_cmdline_freestanding_options
[02:18:41] [PASSED] drm_test_cmdline_freestanding_force_e_and_options
[02:18:41] [PASSED] drm_test_cmdline_panel_orientation
[02:18:41] ================ drm_test_cmdline_invalid =================
[02:18:41] [PASSED] margin_only
[02:18:41] [PASSED] interlace_only
[02:18:41] [PASSED] res_missing_x
[02:18:41] [PASSED] res_missing_y
[02:18:41] [PASSED] res_bad_y
[02:18:41] [PASSED] res_missing_y_bpp
[02:18:41] [PASSED] res_bad_bpp
[02:18:41] [PASSED] res_bad_refresh
[02:18:41] [PASSED] res_bpp_refresh_force_on_off
[02:18:41] [PASSED] res_invalid_mode
[02:18:41] [PASSED] res_bpp_wrong_place_mode
[02:18:41] [PASSED] name_bpp_refresh
[02:18:41] [PASSED] name_refresh
[02:18:41] [PASSED] name_refresh_wrong_mode
[02:18:41] [PASSED] name_refresh_invalid_mode
[02:18:41] [PASSED] rotate_multiple
[02:18:41] [PASSED] rotate_invalid_val
[02:18:41] [PASSED] rotate_truncated
[02:18:41] [PASSED] invalid_option
[02:18:41] [PASSED] invalid_tv_option
[02:18:41] [PASSED] truncated_tv_option
[02:18:41] ============ [PASSED] drm_test_cmdline_invalid =============
[02:18:41] =============== drm_test_cmdline_tv_options ===============
[02:18:41] [PASSED] NTSC
[02:18:41] [PASSED] NTSC_443
[02:18:41] [PASSED] NTSC_J
[02:18:41] [PASSED] PAL
[02:18:41] [PASSED] PAL_M
[02:18:41] [PASSED] PAL_N
[02:18:41] [PASSED] SECAM
[02:18:41] [PASSED] MONO_525
[02:18:41] [PASSED] MONO_625
[02:18:41] =========== [PASSED] drm_test_cmdline_tv_options ===========
[02:18:41] =============== [PASSED] drm_cmdline_parser ================
[02:18:41] ========== drmm_connector_hdmi_init (19 subtests) ==========
[02:18:41] [PASSED] drm_test_connector_hdmi_init_valid
[02:18:41] [PASSED] drm_test_connector_hdmi_init_bpc_8
[02:18:41] [PASSED] drm_test_connector_hdmi_init_bpc_10
[02:18:41] [PASSED] drm_test_connector_hdmi_init_bpc_12
[02:18:41] [PASSED] drm_test_connector_hdmi_init_bpc_invalid
[02:18:41] [PASSED] drm_test_connector_hdmi_init_bpc_null
[02:18:41] [PASSED] drm_test_connector_hdmi_init_formats_empty
[02:18:41] [PASSED] drm_test_connector_hdmi_init_formats_no_rgb
[02:18:41] [PASSED] drm_test_connector_hdmi_init_null_ddc
[02:18:41] [PASSED] drm_test_connector_hdmi_init_null_product
[02:18:41] [PASSED] drm_test_connector_hdmi_init_null_vendor
[02:18:41] [PASSED] drm_test_connector_hdmi_init_product_length_exact
[02:18:41] [PASSED] drm_test_connector_hdmi_init_product_length_too_long
[02:18:41] [PASSED] drm_test_connector_hdmi_init_product_valid
[02:18:41] [PASSED] drm_test_connector_hdmi_init_vendor_length_exact
[02:18:41] [PASSED] drm_test_connector_hdmi_init_vendor_length_too_long
[02:18:41] [PASSED] drm_test_connector_hdmi_init_vendor_valid
[02:18:41] ========= drm_test_connector_hdmi_init_type_valid =========
[02:18:41] [PASSED] HDMI-A
[02:18:41] [PASSED] HDMI-B
[02:18:41] ===== [PASSED] drm_test_connector_hdmi_init_type_valid =====
[02:18:41] ======== drm_test_connector_hdmi_init_type_invalid ========
[02:18:41] [PASSED] Unknown
[02:18:41] [PASSED] VGA
[02:18:41] [PASSED] DVI-I
[02:18:41] [PASSED] DVI-D
[02:18:41] [PASSED] DVI-A
[02:18:41] [PASSED] Composite
[02:18:41] [PASSED] SVIDEO
[02:18:41] [PASSED] LVDS
[02:18:41] [PASSED] Component
[02:18:41] [PASSED] DIN
[02:18:41] [PASSED] DP
[02:18:41] [PASSED] TV
[02:18:41] [PASSED] eDP
[02:18:41] [PASSED] Virtual
[02:18:41] [PASSED] DSI
[02:18:41] [PASSED] DPI
[02:18:41] [PASSED] Writeback
[02:18:41] [PASSED] SPI
[02:18:41] [PASSED] USB
[02:18:41] ==== [PASSED] drm_test_connector_hdmi_init_type_invalid ====
[02:18:41] ============ [PASSED] drmm_connector_hdmi_init =============
[02:18:41] ============= drmm_connector_init (3 subtests) =============
[02:18:41] [PASSED] drm_test_drmm_connector_init
[02:18:41] [PASSED] drm_test_drmm_connector_init_null_ddc
[02:18:41] ========= drm_test_drmm_connector_init_type_valid =========
[02:18:41] [PASSED] Unknown
[02:18:41] [PASSED] VGA
[02:18:41] [PASSED] DVI-I
[02:18:41] [PASSED] DVI-D
[02:18:41] [PASSED] DVI-A
[02:18:41] [PASSED] Composite
[02:18:41] [PASSED] SVIDEO
[02:18:41] [PASSED] LVDS
[02:18:41] [PASSED] Component
[02:18:41] [PASSED] DIN
[02:18:41] [PASSED] DP
[02:18:41] [PASSED] HDMI-A
[02:18:41] [PASSED] HDMI-B
[02:18:41] [PASSED] TV
[02:18:41] [PASSED] eDP
[02:18:41] [PASSED] Virtual
[02:18:41] [PASSED] DSI
[02:18:41] [PASSED] DPI
[02:18:41] [PASSED] Writeback
[02:18:41] [PASSED] SPI
[02:18:41] [PASSED] USB
[02:18:41] ===== [PASSED] drm_test_drmm_connector_init_type_valid =====
[02:18:41] =============== [PASSED] drmm_connector_init ===============
[02:18:41] = drm_connector_attach_broadcast_rgb_property (2 subtests) =
[02:18:41] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property
[02:18:41] [PASSED] drm_test_drm_connector_attach_broadcast_rgb_property_hdmi_connector
[02:18:41] === [PASSED] drm_connector_attach_broadcast_rgb_property ===
[02:18:41] ========== drm_get_tv_mode_from_name (2 subtests) ==========
[02:18:41] ========== drm_test_get_tv_mode_from_name_valid ===========
[02:18:41] [PASSED] NTSC
[02:18:41] [PASSED] NTSC-443
[02:18:41] [PASSED] NTSC-J
[02:18:41] [PASSED] PAL
[02:18:41] [PASSED] PAL-M
[02:18:41] [PASSED] PAL-N
[02:18:41] [PASSED] SECAM
[02:18:41] [PASSED] Mono
[02:18:41] ====== [PASSED] drm_test_get_tv_mode_from_name_valid =======
[02:18:41] [PASSED] drm_test_get_tv_mode_from_name_truncated
[02:18:41] ============ [PASSED] drm_get_tv_mode_from_name ============
[02:18:41] = drm_test_connector_hdmi_compute_mode_clock (12 subtests) =
[02:18:41] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb
[02:18:41] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc
[02:18:41] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_10bpc_vic_1
[02:18:41] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc
[02:18:41] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_12bpc_vic_1
[02:18:41] [PASSED] drm_test_drm_hdmi_compute_mode_clock_rgb_double
[02:18:41] = drm_test_connector_hdmi_compute_mode_clock_yuv420_valid =
[02:18:41] [PASSED] VIC 96
[02:18:41] [PASSED] VIC 97
[02:18:41] [PASSED] VIC 101
[02:18:41] [PASSED] VIC 102
[02:18:41] [PASSED] VIC 106
[02:18:41] [PASSED] VIC 107
[02:18:41] === [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_valid ===
[02:18:41] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_10_bpc
[02:18:41] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv420_12_bpc
[02:18:41] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_8_bpc
[02:18:41] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_10_bpc
[02:18:41] [PASSED] drm_test_connector_hdmi_compute_mode_clock_yuv422_12_bpc
[02:18:41] === [PASSED] drm_test_connector_hdmi_compute_mode_clock ====
[02:18:41] == drm_hdmi_connector_get_broadcast_rgb_name (2 subtests) ==
[02:18:41] === drm_test_drm_hdmi_connector_get_broadcast_rgb_name ====
[02:18:41] [PASSED] Automatic
[02:18:41] [PASSED] Full
[02:18:41] [PASSED] Limited 16:235
[02:18:41] === [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name ===
[02:18:41] [PASSED] drm_test_drm_hdmi_connector_get_broadcast_rgb_name_invalid
[02:18:41] ==== [PASSED] drm_hdmi_connector_get_broadcast_rgb_name ====
[02:18:41] == drm_hdmi_connector_get_output_format_name (2 subtests) ==
[02:18:41] === drm_test_drm_hdmi_connector_get_output_format_name ====
[02:18:41] [PASSED] RGB
[02:18:41] [PASSED] YUV 4:2:0
[02:18:41] [PASSED] YUV 4:2:2
[02:18:41] [PASSED] YUV 4:4:4
[02:18:41] === [PASSED] drm_test_drm_hdmi_connector_get_output_format_name ===
[02:18:41] [PASSED] drm_test_drm_hdmi_connector_get_output_format_name_invalid
[02:18:41] ==== [PASSED] drm_hdmi_connector_get_output_format_name ====
[02:18:41] ============= drm_damage_helper (21 subtests) ==============
[02:18:41] [PASSED] drm_test_damage_iter_no_damage
[02:18:41] [PASSED] drm_test_damage_iter_no_damage_fractional_src
[02:18:41] [PASSED] drm_test_damage_iter_no_damage_src_moved
[02:18:41] [PASSED] drm_test_damage_iter_no_damage_fractional_src_moved
[02:18:41] [PASSED] drm_test_damage_iter_no_damage_not_visible
[02:18:41] [PASSED] drm_test_damage_iter_no_damage_no_crtc
[02:18:41] [PASSED] drm_test_damage_iter_no_damage_no_fb
[02:18:41] [PASSED] drm_test_damage_iter_simple_damage
[02:18:41] [PASSED] drm_test_damage_iter_single_damage
[02:18:41] [PASSED] drm_test_damage_iter_single_damage_intersect_src
[02:18:41] [PASSED] drm_test_damage_iter_single_damage_outside_src
[02:18:41] [PASSED] drm_test_damage_iter_single_damage_fractional_src
[02:18:41] [PASSED] drm_test_damage_iter_single_damage_intersect_fractional_src
[02:18:41] [PASSED] drm_test_damage_iter_single_damage_outside_fractional_src
[02:18:41] [PASSED] drm_test_damage_iter_single_damage_src_moved
[02:18:41] [PASSED] drm_test_damage_iter_single_damage_fractional_src_moved
[02:18:41] [PASSED] drm_test_damage_iter_damage
[02:18:41] [PASSED] drm_test_damage_iter_damage_one_intersect
[02:18:41] [PASSED] drm_test_damage_iter_damage_one_outside
[02:18:41] [PASSED] drm_test_damage_iter_damage_src_moved
[02:18:41] [PASSED] drm_test_damage_iter_damage_not_visible
[02:18:41] ================ [PASSED] drm_damage_helper ================
[02:18:41] ============== drm_dp_mst_helper (3 subtests) ==============
[02:18:41] ============== drm_test_dp_mst_calc_pbn_mode ==============
[02:18:41] [PASSED] Clock 154000 BPP 30 DSC disabled
[02:18:41] [PASSED] Clock 234000 BPP 30 DSC disabled
[02:18:41] [PASSED] Clock 297000 BPP 24 DSC disabled
[02:18:41] [PASSED] Clock 332880 BPP 24 DSC enabled
[02:18:41] [PASSED] Clock 324540 BPP 24 DSC enabled
[02:18:41] ========== [PASSED] drm_test_dp_mst_calc_pbn_mode ==========
[02:18:41] ============== drm_test_dp_mst_calc_pbn_div ===============
[02:18:41] [PASSED] Link rate 2000000 lane count 4
[02:18:41] [PASSED] Link rate 2000000 lane count 2
[02:18:41] [PASSED] Link rate 2000000 lane count 1
[02:18:41] [PASSED] Link rate 1350000 lane count 4
[02:18:41] [PASSED] Link rate 1350000 lane count 2
[02:18:41] [PASSED] Link rate 1350000 lane count 1
[02:18:41] [PASSED] Link rate 1000000 lane count 4
[02:18:41] [PASSED] Link rate 1000000 lane count 2
[02:18:41] [PASSED] Link rate 1000000 lane count 1
[02:18:41] [PASSED] Link rate 810000 lane count 4
[02:18:41] [PASSED] Link rate 810000 lane count 2
[02:18:41] [PASSED] Link rate 810000 lane count 1
[02:18:41] [PASSED] Link rate 540000 lane count 4
[02:18:41] [PASSED] Link rate 540000 lane count 2
[02:18:41] [PASSED] Link rate 540000 lane count 1
[02:18:41] [PASSED] Link rate 270000 lane count 4
[02:18:41] [PASSED] Link rate 270000 lane count 2
[02:18:41] [PASSED] Link rate 270000 lane count 1
[02:18:41] [PASSED] Link rate 162000 lane count 4
[02:18:41] [PASSED] Link rate 162000 lane count 2
[02:18:41] [PASSED] Link rate 162000 lane count 1
[02:18:41] ========== [PASSED] drm_test_dp_mst_calc_pbn_div ===========
[02:18:41] ========= drm_test_dp_mst_sideband_msg_req_decode =========
[02:18:41] [PASSED] DP_ENUM_PATH_RESOURCES with port number
[02:18:41] [PASSED] DP_POWER_UP_PHY with port number
[02:18:41] [PASSED] DP_POWER_DOWN_PHY with port number
[02:18:41] [PASSED] DP_ALLOCATE_PAYLOAD with SDP stream sinks
[02:18:41] [PASSED] DP_ALLOCATE_PAYLOAD with port number
[02:18:41] [PASSED] DP_ALLOCATE_PAYLOAD with VCPI
[02:18:41] [PASSED] DP_ALLOCATE_PAYLOAD with PBN
[02:18:41] [PASSED] DP_QUERY_PAYLOAD with port number
[02:18:41] [PASSED] DP_QUERY_PAYLOAD with VCPI
[02:18:41] [PASSED] DP_REMOTE_DPCD_READ with port number
[02:18:41] [PASSED] DP_REMOTE_DPCD_READ with DPCD address
[02:18:41] [PASSED] DP_REMOTE_DPCD_READ with max number of bytes
[02:18:41] [PASSED] DP_REMOTE_DPCD_WRITE with port number
[02:18:41] [PASSED] DP_REMOTE_DPCD_WRITE with DPCD address
[02:18:41] [PASSED] DP_REMOTE_DPCD_WRITE with data array
[02:18:41] [PASSED] DP_REMOTE_I2C_READ with port number
[02:18:41] [PASSED] DP_REMOTE_I2C_READ with I2C device ID
[02:18:41] [PASSED] DP_REMOTE_I2C_READ with transactions array
[02:18:41] [PASSED] DP_REMOTE_I2C_WRITE with port number
[02:18:41] [PASSED] DP_REMOTE_I2C_WRITE with I2C device ID
[02:18:41] [PASSED] DP_REMOTE_I2C_WRITE with data array
[02:18:41] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream ID
[02:18:41] [PASSED] DP_QUERY_STREAM_ENC_STATUS with client ID
[02:18:41] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream event
[02:18:41] [PASSED] DP_QUERY_STREAM_ENC_STATUS with valid stream event
[02:18:41] [PASSED] DP_QUERY_STREAM_ENC_STATUS with stream behavior
[02:18:41] [PASSED] DP_QUERY_STREAM_ENC_STATUS with a valid stream behavior
[02:18:41] ===== [PASSED] drm_test_dp_mst_sideband_msg_req_decode =====
[02:18:41] ================ [PASSED] drm_dp_mst_helper ================
[02:18:41] ================== drm_exec (7 subtests) ===================
[02:18:41] [PASSED] sanitycheck
[02:18:41] [PASSED] test_lock
[02:18:41] [PASSED] test_lock_unlock
[02:18:41] [PASSED] test_duplicates
[02:18:41] [PASSED] test_prepare
[02:18:41] [PASSED] test_prepare_array
[02:18:41] [PASSED] test_multiple_loops
[02:18:41] ==================== [PASSED] drm_exec =====================
[02:18:41] =========== drm_format_helper_test (17 subtests) ===========
[02:18:41] ============== drm_test_fb_xrgb8888_to_gray8 ==============
[02:18:41] [PASSED] single_pixel_source_buffer
[02:18:41] [PASSED] single_pixel_clip_rectangle
[02:18:41] [PASSED] well_known_colors
[02:18:41] [PASSED] destination_pitch
[02:18:41] ========== [PASSED] drm_test_fb_xrgb8888_to_gray8 ==========
[02:18:41] ============= drm_test_fb_xrgb8888_to_rgb332 ==============
[02:18:41] [PASSED] single_pixel_source_buffer
[02:18:41] [PASSED] single_pixel_clip_rectangle
[02:18:41] [PASSED] well_known_colors
[02:18:41] [PASSED] destination_pitch
[02:18:41] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb332 ==========
[02:18:41] ============= drm_test_fb_xrgb8888_to_rgb565 ==============
[02:18:41] [PASSED] single_pixel_source_buffer
[02:18:41] [PASSED] single_pixel_clip_rectangle
[02:18:41] [PASSED] well_known_colors
[02:18:41] [PASSED] destination_pitch
[02:18:41] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb565 ==========
[02:18:41] ============ drm_test_fb_xrgb8888_to_xrgb1555 =============
[02:18:41] [PASSED] single_pixel_source_buffer
[02:18:41] [PASSED] single_pixel_clip_rectangle
[02:18:41] [PASSED] well_known_colors
[02:18:41] [PASSED] destination_pitch
[02:18:41] ======== [PASSED] drm_test_fb_xrgb8888_to_xrgb1555 =========
[02:18:41] ============ drm_test_fb_xrgb8888_to_argb1555 =============
[02:18:41] [PASSED] single_pixel_source_buffer
[02:18:41] [PASSED] single_pixel_clip_rectangle
[02:18:41] [PASSED] well_known_colors
[02:18:41] [PASSED] destination_pitch
[02:18:41] ======== [PASSED] drm_test_fb_xrgb8888_to_argb1555 =========
[02:18:41] ============ drm_test_fb_xrgb8888_to_rgba5551 =============
[02:18:41] [PASSED] single_pixel_source_buffer
[02:18:41] [PASSED] single_pixel_clip_rectangle
[02:18:41] [PASSED] well_known_colors
[02:18:41] [PASSED] destination_pitch
[02:18:41] ======== [PASSED] drm_test_fb_xrgb8888_to_rgba5551 =========
[02:18:41] ============= drm_test_fb_xrgb8888_to_rgb888 ==============
[02:18:41] [PASSED] single_pixel_source_buffer
[02:18:41] [PASSED] single_pixel_clip_rectangle
[02:18:41] [PASSED] well_known_colors
[02:18:41] [PASSED] destination_pitch
[02:18:41] ========= [PASSED] drm_test_fb_xrgb8888_to_rgb888 ==========
[02:18:41] ============ drm_test_fb_xrgb8888_to_argb8888 =============
[02:18:41] [PASSED] single_pixel_source_buffer
[02:18:41] [PASSED] single_pixel_clip_rectangle
[02:18:41] [PASSED] well_known_colors
[02:18:41] [PASSED] destination_pitch
[02:18:41] ======== [PASSED] drm_test_fb_xrgb8888_to_argb8888 =========
[02:18:41] =========== drm_test_fb_xrgb8888_to_xrgb2101010 ===========
[02:18:41] [PASSED] single_pixel_source_buffer
[02:18:41] [PASSED] single_pixel_clip_rectangle
[02:18:41] [PASSED] well_known_colors
[02:18:41] [PASSED] destination_pitch
[02:18:41] ======= [PASSED] drm_test_fb_xrgb8888_to_xrgb2101010 =======
[02:18:41] =========== drm_test_fb_xrgb8888_to_argb2101010 ===========
[02:18:41] [PASSED] single_pixel_source_buffer
[02:18:41] [PASSED] single_pixel_clip_rectangle
[02:18:41] [PASSED] well_known_colors
[02:18:41] [PASSED] destination_pitch
[02:18:41] ======= [PASSED] drm_test_fb_xrgb8888_to_argb2101010 =======
[02:18:41] ============== drm_test_fb_xrgb8888_to_mono ===============
[02:18:41] [PASSED] single_pixel_source_buffer
[02:18:41] [PASSED] single_pixel_clip_rectangle
[02:18:41] [PASSED] well_known_colors
[02:18:41] [PASSED] destination_pitch
[02:18:41] ========== [PASSED] drm_test_fb_xrgb8888_to_mono ===========
[02:18:41] ==================== drm_test_fb_swab =====================
[02:18:41] [PASSED] single_pixel_source_buffer
[02:18:41] [PASSED] single_pixel_clip_rectangle
[02:18:41] [PASSED] well_known_colors
[02:18:41] [PASSED] destination_pitch
[02:18:41] ================ [PASSED] drm_test_fb_swab =================
[02:18:41] ============ drm_test_fb_xrgb8888_to_xbgr8888 =============
[02:18:41] [PASSED] single_pixel_source_buffer
[02:18:41] [PASSED] single_pixel_clip_rectangle
[02:18:41] [PASSED] well_known_colors
[02:18:41] [PASSED] destination_pitch
[02:18:41] ======== [PASSED] drm_test_fb_xrgb8888_to_xbgr8888 =========
[02:18:41] ============ drm_test_fb_xrgb8888_to_abgr8888 =============
[02:18:41] [PASSED] single_pixel_source_buffer
[02:18:41] [PASSED] single_pixel_clip_rectangle
[02:18:41] [PASSED] well_known_colors
[02:18:41] [PASSED] destination_pitch
[02:18:41] ======== [PASSED] drm_test_fb_xrgb8888_to_abgr8888 =========
[02:18:41] ================= drm_test_fb_clip_offset =================
[02:18:41] [PASSED] pass through
[02:18:41] [PASSED] horizontal offset
[02:18:41] [PASSED] vertical offset
[02:18:41] [PASSED] horizontal and vertical offset
[02:18:41] [PASSED] horizontal offset (custom pitch)
[02:18:41] [PASSED] vertical offset (custom pitch)
[02:18:41] [PASSED] horizontal and vertical offset (custom pitch)
[02:18:41] ============= [PASSED] drm_test_fb_clip_offset =============
[02:18:41] ============== drm_test_fb_build_fourcc_list ==============
[02:18:41] [PASSED] no native formats
[02:18:41] [PASSED] XRGB8888 as native format
[02:18:41] [PASSED] remove duplicates
[02:18:41] [PASSED] convert alpha formats
[02:18:41] [PASSED] random formats
[02:18:41] ========== [PASSED] drm_test_fb_build_fourcc_list ==========
[02:18:41] =================== drm_test_fb_memcpy ====================
[02:18:41] [PASSED] single_pixel_source_buffer: XR24 little-endian (0x34325258)
[02:18:41] [PASSED] single_pixel_source_buffer: XRA8 little-endian (0x38415258)
[02:18:41] [PASSED] single_pixel_source_buffer: YU24 little-endian (0x34325559)
[02:18:41] [PASSED] single_pixel_clip_rectangle: XB24 little-endian (0x34324258)
[02:18:41] [PASSED] single_pixel_clip_rectangle: XRA8 little-endian (0x38415258)
[02:18:41] [PASSED] single_pixel_clip_rectangle: YU24 little-endian (0x34325559)
[02:18:41] [PASSED] well_known_colors: XB24 little-endian (0x34324258)
[02:18:41] [PASSED] well_known_colors: XRA8 little-endian (0x38415258)
[02:18:41] [PASSED] well_known_colors: YU24 little-endian (0x34325559)
[02:18:41] [PASSED] destination_pitch: XB24 little-endian (0x34324258)
[02:18:41] [PASSED] destination_pitch: XRA8 little-endian (0x38415258)
[02:18:41] [PASSED] destination_pitch: YU24 little-endian (0x34325559)
[02:18:41] =============== [PASSED] drm_test_fb_memcpy ================
[02:18:41] ============= [PASSED] drm_format_helper_test ==============
[02:18:41] ================= drm_format (18 subtests) =================
[02:18:41] [PASSED] drm_test_format_block_width_invalid
[02:18:41] [PASSED] drm_test_format_block_width_one_plane
[02:18:41] [PASSED] drm_test_format_block_width_two_plane
[02:18:41] [PASSED] drm_test_format_block_width_three_plane
[02:18:41] [PASSED] drm_test_format_block_width_tiled
[02:18:41] [PASSED] drm_test_format_block_height_invalid
[02:18:41] [PASSED] drm_test_format_block_height_one_plane
[02:18:41] [PASSED] drm_test_format_block_height_two_plane
[02:18:41] [PASSED] drm_test_format_block_height_three_plane
[02:18:41] [PASSED] drm_test_format_block_height_tiled
[02:18:41] [PASSED] drm_test_format_min_pitch_invalid
[02:18:41] [PASSED] drm_test_format_min_pitch_one_plane_8bpp
[02:18:41] [PASSED] drm_test_format_min_pitch_one_plane_16bpp
[02:18:41] [PASSED] drm_test_format_min_pitch_one_plane_24bpp
[02:18:41] [PASSED] drm_test_format_min_pitch_one_plane_32bpp
[02:18:41] [PASSED] drm_test_format_min_pitch_two_plane
[02:18:41] [PASSED] drm_test_format_min_pitch_three_plane_8bpp
[02:18:41] [PASSED] drm_test_format_min_pitch_tiled
[02:18:41] =================== [PASSED] drm_format ====================
[02:18:41] ============== drm_framebuffer (10 subtests) ===============
[02:18:41] ========== drm_test_framebuffer_check_src_coords ==========
[02:18:41] [PASSED] Success: source fits into fb
[02:18:41] [PASSED] Fail: overflowing fb with x-axis coordinate
[02:18:41] [PASSED] Fail: overflowing fb with y-axis coordinate
[02:18:41] [PASSED] Fail: overflowing fb with source width
[02:18:41] [PASSED] Fail: overflowing fb with source height
[02:18:41] ====== [PASSED] drm_test_framebuffer_check_src_coords ======
[02:18:41] [PASSED] drm_test_framebuffer_cleanup
[02:18:41] =============== drm_test_framebuffer_create ===============
[02:18:41] [PASSED] ABGR8888 normal sizes
[02:18:41] [PASSED] ABGR8888 max sizes
[02:18:41] [PASSED] ABGR8888 pitch greater than min required
[02:18:41] [PASSED] ABGR8888 pitch less than min required
[02:18:41] [PASSED] ABGR8888 Invalid width
[02:18:41] [PASSED] ABGR8888 Invalid buffer handle
[02:18:41] [PASSED] No pixel format
[02:18:41] [PASSED] ABGR8888 Width 0
[02:18:41] [PASSED] ABGR8888 Height 0
[02:18:41] [PASSED] ABGR8888 Out of bound height * pitch combination
[02:18:41] [PASSED] ABGR8888 Large buffer offset
[02:18:41] [PASSED] ABGR8888 Buffer offset for inexistent plane
[02:18:41] [PASSED] ABGR8888 Invalid flag
[02:18:41] [PASSED] ABGR8888 Set DRM_MODE_FB_MODIFIERS without modifiers
[02:18:41] [PASSED] ABGR8888 Valid buffer modifier
[02:18:41] [PASSED] ABGR8888 Invalid buffer modifier(DRM_FORMAT_MOD_SAMSUNG_64_32_TILE)
[02:18:41] [PASSED] ABGR8888 Extra pitches without DRM_MODE_FB_MODIFIERS
[02:18:41] [PASSED] ABGR8888 Extra pitches with DRM_MODE_FB_MODIFIERS
[02:18:41] [PASSED] NV12 Normal sizes
[02:18:41] [PASSED] NV12 Max sizes
[02:18:41] [PASSED] NV12 Invalid pitch
[02:18:41] [PASSED] NV12 Invalid modifier/missing DRM_MODE_FB_MODIFIERS flag
[02:18:41] [PASSED] NV12 different modifier per-plane
[02:18:41] [PASSED] NV12 with DRM_FORMAT_MOD_SAMSUNG_64_32_TILE
[02:18:41] [PASSED] NV12 Valid modifiers without DRM_MODE_FB_MODIFIERS
[02:18:41] [PASSED] NV12 Modifier for inexistent plane
[02:18:41] [PASSED] NV12 Handle for inexistent plane
[02:18:41] [PASSED] NV12 Handle for inexistent plane without DRM_MODE_FB_MODIFIERS
[02:18:41] [PASSED] YVU420 DRM_MODE_FB_MODIFIERS set without modifier
[02:18:41] [PASSED] YVU420 Normal sizes
[02:18:41] [PASSED] YVU420 Max sizes
[02:18:41] [PASSED] YVU420 Invalid pitch
[02:18:41] [PASSED] YVU420 Different pitches
[02:18:41] [PASSED] YVU420 Different buffer offsets/pitches
[02:18:41] [PASSED] YVU420 Modifier set just for plane 0, without DRM_MODE_FB_MODIFIERS
[02:18:41] [PASSED] YVU420 Modifier set just for planes 0, 1, without DRM_MODE_FB_MODIFIERS
[02:18:41] [PASSED] YVU420 Modifier set just for plane 0, 1, with DRM_MODE_FB_MODIFIERS
[02:18:41] [PASSED] YVU420 Valid modifier
[02:18:41] [PASSED] YVU420 Different modifiers per plane
[02:18:41] [PASSED] YVU420 Modifier for inexistent plane
[02:18:41] [PASSED] YUV420_10BIT Invalid modifier(DRM_FORMAT_MOD_LINEAR)
[02:18:41] [PASSED] X0L2 Normal sizes
[02:18:41] [PASSED] X0L2 Max sizes
[02:18:41] [PASSED] X0L2 Invalid pitch
[02:18:41] [PASSED] X0L2 Pitch greater than minimum required
[02:18:41] [PASSED] X0L2 Handle for inexistent plane
[02:18:41] [PASSED] X0L2 Offset for inexistent plane, without DRM_MODE_FB_MODIFIERS set
[02:18:41] [PASSED] X0L2 Modifier without DRM_MODE_FB_MODIFIERS set
[02:18:41] [PASSED] X0L2 Valid modifier
[02:18:41] [PASSED] X0L2 Modifier for inexistent plane
[02:18:41] =========== [PASSED] drm_test_framebuffer_create ===========
[02:18:41] [PASSED] drm_test_framebuffer_free
[02:18:41] [PASSED] drm_test_framebuffer_init
[02:18:41] [PASSED] drm_test_framebuffer_init_bad_format
[02:18:41] [PASSED] drm_test_framebuffer_init_dev_mismatch
[02:18:41] [PASSED] drm_test_framebuffer_lookup
[02:18:41] [PASSED] drm_test_framebuffer_lookup_inexistent
[02:18:41] [PASSED] drm_test_framebuffer_modifiers_not_supported
[02:18:41] ================= [PASSED] drm_framebuffer =================
[02:18:41] ================ drm_gem_shmem (8 subtests) ================
[02:18:41] [PASSED] drm_gem_shmem_test_obj_create
[02:18:41] [PASSED] drm_gem_shmem_test_obj_create_private
[02:18:41] [PASSED] drm_gem_shmem_test_pin_pages
[02:18:41] [PASSED] drm_gem_shmem_test_vmap
[02:18:41] [PASSED] drm_gem_shmem_test_get_pages_sgt
[02:18:41] [PASSED] drm_gem_shmem_test_get_sg_table
[02:18:41] [PASSED] drm_gem_shmem_test_madvise
[02:18:41] [PASSED] drm_gem_shmem_test_purge
[02:18:41] ================== [PASSED] drm_gem_shmem ==================
[02:18:41] === drm_atomic_helper_connector_hdmi_check (22 subtests) ===
[02:18:41] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode
[02:18:41] [PASSED] drm_test_check_broadcast_rgb_auto_cea_mode_vic_1
[02:18:41] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode
[02:18:41] [PASSED] drm_test_check_broadcast_rgb_full_cea_mode_vic_1
[02:18:41] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode
[02:18:41] [PASSED] drm_test_check_broadcast_rgb_limited_cea_mode_vic_1
[02:18:41] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_changed
[02:18:41] [PASSED] drm_test_check_broadcast_rgb_crtc_mode_not_changed
[02:18:41] [PASSED] drm_test_check_hdmi_funcs_reject_rate
[02:18:41] [PASSED] drm_test_check_max_tmds_rate_bpc_fallback
[02:18:41] [PASSED] drm_test_check_max_tmds_rate_format_fallback
[02:18:41] [PASSED] drm_test_check_output_bpc_crtc_mode_changed
[02:18:41] [PASSED] drm_test_check_output_bpc_crtc_mode_not_changed
[02:18:41] [PASSED] drm_test_check_output_bpc_dvi
[02:18:41] [PASSED] drm_test_check_output_bpc_format_vic_1
[02:18:41] [PASSED] drm_test_check_output_bpc_format_display_8bpc_only
[02:18:41] [PASSED] drm_test_check_output_bpc_format_display_rgb_only
[02:18:41] [PASSED] drm_test_check_output_bpc_format_driver_8bpc_only
[02:18:41] [PASSED] drm_test_check_output_bpc_format_driver_rgb_only
[02:18:41] [PASSED] drm_test_check_tmds_char_rate_rgb_8bpc
[02:18:41] [PASSED] drm_test_check_tmds_char_rate_rgb_10bpc
[02:18:41] [PASSED] drm_test_check_tmds_char_rate_rgb_12bpc
[02:18:41] ===== [PASSED] drm_atomic_helper_connector_hdmi_check ======
[02:18:41] === drm_atomic_helper_connector_hdmi_reset (6 subtests) ====
[02:18:41] [PASSED] drm_test_check_broadcast_rgb_value
[02:18:41] [PASSED] drm_test_check_bpc_8_value
[02:18:41] [PASSED] drm_test_check_bpc_10_value
[02:18:41] [PASSED] drm_test_check_bpc_12_value
[02:18:41] [PASSED] drm_test_check_format_value
[02:18:41] [PASSED] drm_test_check_tmds_char_value
[02:18:41] ===== [PASSED] drm_atomic_helper_connector_hdmi_reset ======
[02:18:41] ================= drm_managed (2 subtests) =================
[02:18:41] [PASSED] drm_test_managed_release_action
[02:18:41] [PASSED] drm_test_managed_run_action
[02:18:41] =================== [PASSED] drm_managed ===================
[02:18:41] =================== drm_mm (6 subtests) ====================
[02:18:41] [PASSED] drm_test_mm_init
[02:18:41] [PASSED] drm_test_mm_debug
[02:18:41] [PASSED] drm_test_mm_align32
[02:18:41] [PASSED] drm_test_mm_align64
[02:18:41] [PASSED] drm_test_mm_lowest
[02:18:41] [PASSED] drm_test_mm_highest
[02:18:41] ===================== [PASSED] drm_mm ======================
[02:18:41] ============= drm_modes_analog_tv (5 subtests) =============
[02:18:41] [PASSED] drm_test_modes_analog_tv_mono_576i
[02:18:41] [PASSED] drm_test_modes_analog_tv_ntsc_480i
[02:18:41] [PASSED] drm_test_modes_analog_tv_ntsc_480i_inlined
[02:18:41] [PASSED] drm_test_modes_analog_tv_pal_576i
[02:18:41] [PASSED] drm_test_modes_analog_tv_pal_576i_inlined
[02:18:41] =============== [PASSED] drm_modes_analog_tv ===============
stty: 'standard input': Inappropriate ioctl for device
[02:18:41] ============== drm_plane_helper (2 subtests) ===============
[02:18:41] =============== drm_test_check_plane_state ================
[02:18:41] [PASSED] clipping_simple
[02:18:41] [PASSED] clipping_rotate_reflect
[02:18:41] [PASSED] positioning_simple
[02:18:41] [PASSED] upscaling
[02:18:41] [PASSED] downscaling
[02:18:41] [PASSED] rounding1
[02:18:41] [PASSED] rounding2
[02:18:41] [PASSED] rounding3
[02:18:41] [PASSED] rounding4
[02:18:41] =========== [PASSED] drm_test_check_plane_state ============
[02:18:41] =========== drm_test_check_invalid_plane_state ============
[02:18:41] [PASSED] positioning_invalid
[02:18:41] [PASSED] upscaling_invalid
[02:18:41] [PASSED] downscaling_invalid
[02:18:41] ======= [PASSED] drm_test_check_invalid_plane_state ========
[02:18:41] ================ [PASSED] drm_plane_helper =================
[02:18:41] ====== drm_connector_helper_tv_get_modes (1 subtest) =======
[02:18:41] ====== drm_test_connector_helper_tv_get_modes_check =======
[02:18:41] [PASSED] None
[02:18:41] [PASSED] PAL
[02:18:41] [PASSED] NTSC
[02:18:41] [PASSED] Both, NTSC Default
[02:18:41] [PASSED] Both, PAL Default
[02:18:41] [PASSED] Both, NTSC Default, with PAL on command-line
[02:18:41] [PASSED] Both, PAL Default, with NTSC on command-line
[02:18:41] == [PASSED] drm_test_connector_helper_tv_get_modes_check ===
[02:18:41] ======== [PASSED] drm_connector_helper_tv_get_modes ========
[02:18:41] ================== drm_rect (9 subtests) ===================
[02:18:41] [PASSED] drm_test_rect_clip_scaled_div_by_zero
[02:18:41] [PASSED] drm_test_rect_clip_scaled_not_clipped
[02:18:41] [PASSED] drm_test_rect_clip_scaled_clipped
[02:18:41] [PASSED] drm_test_rect_clip_scaled_signed_vs_unsigned
[02:18:41] ================= drm_test_rect_intersect =================
[02:18:41] [PASSED] top-left x bottom-right: 2x2+1+1 x 2x2+0+0
[02:18:41] [PASSED] top-right x bottom-left: 2x2+0+0 x 2x2+1-1
[02:18:41] [PASSED] bottom-left x top-right: 2x2+1-1 x 2x2+0+0
[02:18:41] [PASSED] bottom-right x top-left: 2x2+0+0 x 2x2+1+1
[02:18:41] [PASSED] right x left: 2x1+0+0 x 3x1+1+0
[02:18:41] [PASSED] left x right: 3x1+1+0 x 2x1+0+0
[02:18:41] [PASSED] up x bottom: 1x2+0+0 x 1x3+0-1
[02:18:41] [PASSED] bottom x up: 1x3+0-1 x 1x2+0+0
[02:18:41] [PASSED] touching corner: 1x1+0+0 x 2x2+1+1
[02:18:41] [PASSED] touching side: 1x1+0+0 x 1x1+1+0
[02:18:41] [PASSED] equal rects: 2x2+0+0 x 2x2+0+0
[02:18:41] [PASSED] inside another: 2x2+0+0 x 1x1+1+1
[02:18:41] [PASSED] far away: 1x1+0+0 x 1x1+3+6
[02:18:41] [PASSED] points intersecting: 0x0+5+10 x 0x0+5+10
[02:18:41] [PASSED] points not intersecting: 0x0+0+0 x 0x0+5+10
[02:18:41] ============= [PASSED] drm_test_rect_intersect =============
[02:18:41] ================ drm_test_rect_calc_hscale ================
[02:18:41] [PASSED] normal use
[02:18:41] [PASSED] out of max range
[02:18:41] [PASSED] out of min range
[02:18:41] [PASSED] zero dst
[02:18:41] [PASSED] negative src
[02:18:41] [PASSED] negative dst
[02:18:41] ============ [PASSED] drm_test_rect_calc_hscale ============
[02:18:41] ================ drm_test_rect_calc_vscale ================
[02:18:41] [PASSED] normal use
[02:18:41] [PASSED] out of max range
[02:18:41] [PASSED] out of min range
[02:18:41] [PASSED] zero dst
[02:18:41] [PASSED] negative src
[02:18:41] [PASSED] negative dst
[02:18:41] ============ [PASSED] drm_test_rect_calc_vscale ============
[02:18:41] ================== drm_test_rect_rotate ===================
[02:18:41] [PASSED] reflect-x
[02:18:41] [PASSED] reflect-y
[02:18:41] [PASSED] rotate-0
[02:18:41] [PASSED] rotate-90
[02:18:41] [PASSED] rotate-180
[02:18:41] [PASSED] rotate-270
[02:18:41] ============== [PASSED] drm_test_rect_rotate ===============
[02:18:41] ================ drm_test_rect_rotate_inv =================
[02:18:41] [PASSED] reflect-x
[02:18:41] [PASSED] reflect-y
[02:18:41] [PASSED] rotate-0
[02:18:41] [PASSED] rotate-90
[02:18:41] [PASSED] rotate-180
[02:18:41] [PASSED] rotate-270
[02:18:41] ============ [PASSED] drm_test_rect_rotate_inv =============
[02:18:41] ==================== [PASSED] drm_rect =====================
[02:18:41] ============================================================
[02:18:41] Testing complete. Ran 526 tests: passed: 526
[02:18:41] Elapsed time: 24.250s total, 1.616s configuring, 22.465s building, 0.168s running
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/ttm/tests/.kunitconfig
[02:18:41] Configuring KUnit Kernel ...
Regenerating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[02:18:43] 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
[02:18:51] Starting KUnit Kernel (1/1)...
[02:18:51] ============================================================
Running tests with:
$ .kunit/linux kunit.enable=1 mem=1G console=tty kunit_shutdown=halt
[02:18:51] ================= ttm_device (5 subtests) ==================
[02:18:51] [PASSED] ttm_device_init_basic
[02:18:51] [PASSED] ttm_device_init_multiple
[02:18:51] [PASSED] ttm_device_fini_basic
[02:18:51] [PASSED] ttm_device_init_no_vma_man
[02:18:51] ================== ttm_device_init_pools ==================
[02:18:51] [PASSED] No DMA allocations, no DMA32 required
[02:18:51] [PASSED] DMA allocations, DMA32 required
[02:18:51] [PASSED] No DMA allocations, DMA32 required
[02:18:51] [PASSED] DMA allocations, no DMA32 required
[02:18:51] ============== [PASSED] ttm_device_init_pools ==============
[02:18:51] =================== [PASSED] ttm_device ====================
[02:18:51] ================== ttm_pool (8 subtests) ===================
[02:18:51] ================== ttm_pool_alloc_basic ===================
[02:18:51] [PASSED] One page
[02:18:51] [PASSED] More than one page
[02:18:51] [PASSED] Above the allocation limit
[02:18:51] [PASSED] One page, with coherent DMA mappings enabled
[02:18:51] [PASSED] Above the allocation limit, with coherent DMA mappings enabled
[02:18:51] ============== [PASSED] ttm_pool_alloc_basic ===============
[02:18:51] ============== ttm_pool_alloc_basic_dma_addr ==============
[02:18:51] [PASSED] One page
[02:18:51] [PASSED] More than one page
[02:18:51] [PASSED] Above the allocation limit
[02:18:51] [PASSED] One page, with coherent DMA mappings enabled
[02:18:51] [PASSED] Above the allocation limit, with coherent DMA mappings enabled
[02:18:51] ========== [PASSED] ttm_pool_alloc_basic_dma_addr ==========
[02:18:51] [PASSED] ttm_pool_alloc_order_caching_match
[02:18:51] [PASSED] ttm_pool_alloc_caching_mismatch
[02:18:51] [PASSED] ttm_pool_alloc_order_mismatch
[02:18:51] [PASSED] ttm_pool_free_dma_alloc
[02:18:51] [PASSED] ttm_pool_free_no_dma_alloc
[02:18:51] [PASSED] ttm_pool_fini_basic
[02:18:51] ==================== [PASSED] ttm_pool =====================
[02:18:51] ================ ttm_resource (8 subtests) =================
[02:18:51] ================= ttm_resource_init_basic =================
[02:18:51] [PASSED] Init resource in TTM_PL_SYSTEM
[02:18:51] [PASSED] Init resource in TTM_PL_VRAM
[02:18:51] [PASSED] Init resource in a private placement
[02:18:51] [PASSED] Init resource in TTM_PL_SYSTEM, set placement flags
[02:18:51] ============= [PASSED] ttm_resource_init_basic =============
[02:18:51] [PASSED] ttm_resource_init_pinned
[02:18:51] [PASSED] ttm_resource_fini_basic
[02:18:51] [PASSED] ttm_resource_manager_init_basic
[02:18:51] [PASSED] ttm_resource_manager_usage_basic
[02:18:51] [PASSED] ttm_resource_manager_set_used_basic
[02:18:51] [PASSED] ttm_sys_man_alloc_basic
[02:18:51] [PASSED] ttm_sys_man_free_basic
[02:18:51] ================== [PASSED] ttm_resource ===================
[02:18:51] =================== ttm_tt (15 subtests) ===================
[02:18:51] ==================== ttm_tt_init_basic ====================
[02:18:51] [PASSED] Page-aligned size
[02:18:51] [PASSED] Extra pages requested
[02:18:51] ================ [PASSED] ttm_tt_init_basic ================
[02:18:51] [PASSED] ttm_tt_init_misaligned
[02:18:51] [PASSED] ttm_tt_fini_basic
[02:18:51] [PASSED] ttm_tt_fini_sg
[02:18:51] [PASSED] ttm_tt_fini_shmem
[02:18:51] [PASSED] ttm_tt_create_basic
[02:18:51] [PASSED] ttm_tt_create_invalid_bo_type
[02:18:51] [PASSED] ttm_tt_create_ttm_exists
[02:18:51] [PASSED] ttm_tt_create_failed
[02:18:51] [PASSED] ttm_tt_destroy_basic
[02:18:51] [PASSED] ttm_tt_populate_null_ttm
[02:18:51] [PASSED] ttm_tt_populate_populated_ttm
[02:18:51] [PASSED] ttm_tt_unpopulate_basic
[02:18:51] [PASSED] ttm_tt_unpopulate_empty_ttm
[02:18:51] [PASSED] ttm_tt_swapin_basic
[02:18:51] ===================== [PASSED] ttm_tt ======================
[02:18:51] =================== ttm_bo (14 subtests) ===================
[02:18:51] =========== ttm_bo_reserve_optimistic_no_ticket ===========
[02:18:51] [PASSED] Cannot be interrupted and sleeps
[02:18:51] [PASSED] Cannot be interrupted, locks straight away
[02:18:51] [PASSED] Can be interrupted, sleeps
[02:18:51] ======= [PASSED] ttm_bo_reserve_optimistic_no_ticket =======
[02:18:51] [PASSED] ttm_bo_reserve_locked_no_sleep
[02:18:51] [PASSED] ttm_bo_reserve_no_wait_ticket
[02:18:51] [PASSED] ttm_bo_reserve_double_resv
[02:18:51] [PASSED] ttm_bo_reserve_interrupted
[02:18:51] [PASSED] ttm_bo_reserve_deadlock
[02:18:51] [PASSED] ttm_bo_unreserve_basic
[02:18:51] [PASSED] ttm_bo_unreserve_pinned
[02:18:51] [PASSED] ttm_bo_unreserve_bulk
[02:18:51] [PASSED] ttm_bo_put_basic
[02:18:51] [PASSED] ttm_bo_put_shared_resv
[02:18:51] [PASSED] ttm_bo_pin_basic
[02:18:51] [PASSED] ttm_bo_pin_unpin_resource
[02:18:51] [PASSED] ttm_bo_multiple_pin_one_unpin
[02:18:51] ===================== [PASSED] ttm_bo ======================
[02:18:51] ============== ttm_bo_validate (22 subtests) ===============
[02:18:51] ============== ttm_bo_init_reserved_sys_man ===============
[02:18:51] [PASSED] Buffer object for userspace
[02:18:51] [PASSED] Kernel buffer object
[02:18:51] [PASSED] Shared buffer object
[02:18:51] ========== [PASSED] ttm_bo_init_reserved_sys_man ===========
[02:18:51] ============== ttm_bo_init_reserved_mock_man ==============
[02:18:51] [PASSED] Buffer object for userspace
[02:18:51] [PASSED] Kernel buffer object
[02:18:51] [PASSED] Shared buffer object
[02:18:51] ========== [PASSED] ttm_bo_init_reserved_mock_man ==========
[02:18:51] [PASSED] ttm_bo_init_reserved_resv
[02:18:51] ================== ttm_bo_validate_basic ==================
[02:18:51] [PASSED] Buffer object for userspace
[02:18:51] [PASSED] Kernel buffer object
[02:18:51] [PASSED] Shared buffer object
[02:18:51] ============== [PASSED] ttm_bo_validate_basic ==============
[02:18:51] [PASSED] ttm_bo_validate_invalid_placement
[02:18:51] ============= ttm_bo_validate_same_placement ==============
[02:18:51] [PASSED] System manager
[02:18:51] [PASSED] VRAM manager
[02:18:51] ========= [PASSED] ttm_bo_validate_same_placement ==========
[02:18:51] [PASSED] ttm_bo_validate_failed_alloc
[02:18:51] [PASSED] ttm_bo_validate_pinned
[02:18:51] [PASSED] ttm_bo_validate_busy_placement
[02:18:51] ================ ttm_bo_validate_multihop =================
[02:18:51] [PASSED] Buffer object for userspace
[02:18:51] [PASSED] Kernel buffer object
[02:18:51] [PASSED] Shared buffer object
[02:18:51] ============ [PASSED] ttm_bo_validate_multihop =============
[02:18:51] ========== ttm_bo_validate_no_placement_signaled ==========
[02:18:51] [PASSED] Buffer object in system domain, no page vector
[02:18:51] [PASSED] Buffer object in system domain with an existing page vector
[02:18:51] ====== [PASSED] ttm_bo_validate_no_placement_signaled ======
[02:18:51] ======== ttm_bo_validate_no_placement_not_signaled ========
[02:18:51] [PASSED] Buffer object for userspace
[02:18:51] [PASSED] Kernel buffer object
[02:18:51] [PASSED] Shared buffer object
[02:18:51] ==== [PASSED] ttm_bo_validate_no_placement_not_signaled ====
[02:18:51] [PASSED] ttm_bo_validate_move_fence_signaled
[02:18:51] ========= ttm_bo_validate_move_fence_not_signaled =========
[02:18:51] [PASSED] Waits for GPU
[02:18:51] [PASSED] Tries to lock straight away
[02:18:51] ===== [PASSED] ttm_bo_validate_move_fence_not_signaled =====
[02:18:51] [PASSED] ttm_bo_validate_swapout
[02:18:51] [PASSED] ttm_bo_validate_happy_evict
[02:18:51] [PASSED] ttm_bo_validate_all_pinned_evict
[02:18:51] [PASSED] ttm_bo_validate_allowed_only_evict
[02:18:51] [PASSED] ttm_bo_validate_deleted_evict
[02:18:51] [PASSED] ttm_bo_validate_busy_domain_evict
[02:18:51] [PASSED] ttm_bo_validate_evict_gutting
[02:18:51] [PASSED] ttm_bo_validate_recrusive_evict
stty: 'standard input': Inappropriate ioctl for device
[02:18:51] ================= [PASSED] ttm_bo_validate =================
[02:18:51] ============================================================
[02:18:51] Testing complete. Ran 102 tests: passed: 102
[02:18:51] Elapsed time: 9.973s total, 1.612s configuring, 7.744s building, 0.535s running
+ cleanup
++ stat -c %u:%g /kernel
+ chown -R 1003:1003 /kernel
^ permalink raw reply [flat|nested] 16+ messages in thread
* ✓ CI.Build: success for drm/xe/vf: Post-migration recovery of GGTT nodes and CTB (rev2)
2024-11-16 2:12 [PATCH v2 0/3] drm/xe/vf: Post-migration recovery of GGTT nodes and CTB Tomasz Lis
` (5 preceding siblings ...)
2024-11-16 2:18 ` ✓ CI.KUnit: success " Patchwork
@ 2024-11-16 2:36 ` Patchwork
2024-11-16 2:36 ` ✗ CI.Hooks: failure " Patchwork
` (2 subsequent siblings)
9 siblings, 0 replies; 16+ messages in thread
From: Patchwork @ 2024-11-16 2:36 UTC (permalink / raw)
To: Tomasz Lis; +Cc: intel-xe
== Series Details ==
Series: drm/xe/vf: Post-migration recovery of GGTT nodes and CTB (rev2)
URL : https://patchwork.freedesktop.org/series/141439/
State : success
== Summary ==
lib/modules/6.12.0-rc7-xe/kernel/arch/x86/events/rapl.ko
lib/modules/6.12.0-rc7-xe/kernel/arch/x86/kvm/
lib/modules/6.12.0-rc7-xe/kernel/arch/x86/kvm/kvm.ko
lib/modules/6.12.0-rc7-xe/kernel/arch/x86/kvm/kvm-intel.ko
lib/modules/6.12.0-rc7-xe/kernel/arch/x86/kvm/kvm-amd.ko
lib/modules/6.12.0-rc7-xe/kernel/kernel/
lib/modules/6.12.0-rc7-xe/kernel/kernel/kheaders.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/
lib/modules/6.12.0-rc7-xe/kernel/crypto/ecrdsa_generic.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/xcbc.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/serpent_generic.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/aria_generic.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/crypto_simd.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/adiantum.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/tcrypt.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/crypto_engine.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/zstd.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/asymmetric_keys/
lib/modules/6.12.0-rc7-xe/kernel/crypto/asymmetric_keys/pkcs7_test_key.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/asymmetric_keys/pkcs8_key_parser.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/des_generic.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/xctr.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/authenc.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/sm4_generic.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/keywrap.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/camellia_generic.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/sm3.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/pcrypt.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/aegis128.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/af_alg.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/algif_aead.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/cmac.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/sm3_generic.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/aes_ti.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/chacha_generic.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/poly1305_generic.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/nhpoly1305.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/crc32_generic.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/essiv.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/ccm.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/wp512.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/streebog_generic.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/authencesn.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/echainiv.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/lrw.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/cryptd.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/crypto_user.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/algif_hash.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/vmac.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/polyval-generic.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/hctr2.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/842.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/pcbc.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/ansi_cprng.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/cast6_generic.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/twofish_common.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/twofish_generic.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/lz4hc.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/blowfish_generic.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/md4.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/chacha20poly1305.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/curve25519-generic.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/lz4.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/rmd160.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/algif_skcipher.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/cast5_generic.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/fcrypt.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/ecdsa_generic.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/sm4.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/cast_common.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/blowfish_common.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/michael_mic.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/async_tx/
lib/modules/6.12.0-rc7-xe/kernel/crypto/async_tx/async_xor.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/async_tx/async_tx.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/async_tx/async_memcpy.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/async_tx/async_pq.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/async_tx/async_raid6_recov.ko
lib/modules/6.12.0-rc7-xe/kernel/crypto/algif_rng.ko
lib/modules/6.12.0-rc7-xe/kernel/block/
lib/modules/6.12.0-rc7-xe/kernel/block/bfq.ko
lib/modules/6.12.0-rc7-xe/kernel/block/kyber-iosched.ko
lib/modules/6.12.0-rc7-xe/build
lib/modules/6.12.0-rc7-xe/modules.alias.bin
lib/modules/6.12.0-rc7-xe/modules.builtin
lib/modules/6.12.0-rc7-xe/modules.softdep
lib/modules/6.12.0-rc7-xe/modules.alias
lib/modules/6.12.0-rc7-xe/modules.order
lib/modules/6.12.0-rc7-xe/modules.symbols
lib/modules/6.12.0-rc7-xe/modules.dep.bin
+ mv kernel-nodebug.tar.gz ..
+ cd ..
+ rm -rf archive
++ date +%s
+ echo -e '\e[0Ksection_end:1731724592:package_x86_64_nodebug\r\e[0K'
+ sync
^[[0Ksection_end:1731724592:package_x86_64_nodebug
^[[0K
+ cleanup
++ stat -c %u:%g /kernel
+ chown -R 1003:1003 /kernel
^ permalink raw reply [flat|nested] 16+ messages in thread
* ✗ CI.Hooks: failure for drm/xe/vf: Post-migration recovery of GGTT nodes and CTB (rev2)
2024-11-16 2:12 [PATCH v2 0/3] drm/xe/vf: Post-migration recovery of GGTT nodes and CTB Tomasz Lis
` (6 preceding siblings ...)
2024-11-16 2:36 ` ✓ CI.Build: " Patchwork
@ 2024-11-16 2:36 ` Patchwork
2024-11-16 2:38 ` ✗ CI.checksparse: warning " Patchwork
2024-11-16 2:57 ` ✓ CI.BAT: success " Patchwork
9 siblings, 0 replies; 16+ messages in thread
From: Patchwork @ 2024-11-16 2:36 UTC (permalink / raw)
To: Tomasz Lis; +Cc: intel-xe
== Series Details ==
Series: drm/xe/vf: Post-migration recovery of GGTT nodes and CTB (rev2)
URL : https://patchwork.freedesktop.org/series/141439/
State : failure
== 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
UPD include/config/kernel.release
UPD include/generated/utsrelease.h
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/arch/x86/special.o
CC /workspace/kernel/build64-default/tools/objtool/libstring.o
CC /workspace/kernel/build64-default/tools/objtool/libctype.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
HOSTCC scripts/kconfig/expr.o
LEX scripts/kconfig/lexer.lex.c
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/10-xe.fragment
Using .config as base
Merging /workspace/ci/kernel/10-xe.fragment
The merge file '/workspace/ci/kernel/10-xe.fragment' does not exist. Exit.
run-parts: /workspace/ci/hooks/11-build-32b exited with return code 1
^ permalink raw reply [flat|nested] 16+ messages in thread
* ✗ CI.checksparse: warning for drm/xe/vf: Post-migration recovery of GGTT nodes and CTB (rev2)
2024-11-16 2:12 [PATCH v2 0/3] drm/xe/vf: Post-migration recovery of GGTT nodes and CTB Tomasz Lis
` (7 preceding siblings ...)
2024-11-16 2:36 ` ✗ CI.Hooks: failure " Patchwork
@ 2024-11-16 2:38 ` Patchwork
2024-11-16 2:57 ` ✓ CI.BAT: success " Patchwork
9 siblings, 0 replies; 16+ messages in thread
From: Patchwork @ 2024-11-16 2:38 UTC (permalink / raw)
To: Tomasz Lis; +Cc: intel-xe
== Series Details ==
Series: drm/xe/vf: Post-migration recovery of GGTT nodes and CTB (rev2)
URL : https://patchwork.freedesktop.org/series/141439/
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 9a7388467f79fb74c67a2444c5b1add91652f89e
/root/linux/maintainer-tools/dim: line 2068: sparse: command not found
Sparse version:
Fast mode used, each commit won't be checked separately.
+ cleanup
++ stat -c %u:%g /kernel
+ chown -R 1003:1003 /kernel
^ permalink raw reply [flat|nested] 16+ messages in thread
* ✓ CI.BAT: success for drm/xe/vf: Post-migration recovery of GGTT nodes and CTB (rev2)
2024-11-16 2:12 [PATCH v2 0/3] drm/xe/vf: Post-migration recovery of GGTT nodes and CTB Tomasz Lis
` (8 preceding siblings ...)
2024-11-16 2:38 ` ✗ CI.checksparse: warning " Patchwork
@ 2024-11-16 2:57 ` Patchwork
9 siblings, 0 replies; 16+ messages in thread
From: Patchwork @ 2024-11-16 2:57 UTC (permalink / raw)
To: Tomasz Lis; +Cc: intel-xe
[-- Attachment #1: Type: text/plain, Size: 1461 bytes --]
== Series Details ==
Series: drm/xe/vf: Post-migration recovery of GGTT nodes and CTB (rev2)
URL : https://patchwork.freedesktop.org/series/141439/
State : success
== Summary ==
CI Bug Log - changes from xe-2242-9a7388467f79fb74c67a2444c5b1add91652f89e_BAT -> xe-pw-141439v2_BAT
====================================================
Summary
-------
**SUCCESS**
No regressions found.
Participating hosts (9 -> 9)
------------------------------
No changes in participating hosts
Known issues
------------
Here are the changes found in xe-pw-141439v2_BAT that come from known issues:
### IGT changes ###
#### Possible fixes ####
* igt@kms_frontbuffer_tracking@basic:
- bat-adlp-7: [DMESG-FAIL][1] ([Intel XE#1033]) -> [PASS][2]
[1]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-2242-9a7388467f79fb74c67a2444c5b1add91652f89e/bat-adlp-7/igt@kms_frontbuffer_tracking@basic.html
[2]: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-141439v2/bat-adlp-7/igt@kms_frontbuffer_tracking@basic.html
[Intel XE#1033]: https://gitlab.freedesktop.org/drm/xe/kernel/issues/1033
Build changes
-------------
* Linux: xe-2242-9a7388467f79fb74c67a2444c5b1add91652f89e -> xe-pw-141439v2
IGT_8114: 8114
xe-2242-9a7388467f79fb74c67a2444c5b1add91652f89e: 9a7388467f79fb74c67a2444c5b1add91652f89e
xe-pw-141439v2: 141439v2
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/intel-xe/xe-pw-141439v2/index.html
[-- Attachment #2: Type: text/html, Size: 2026 bytes --]
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v2 1/3] drm/drm_mm: Safe macro for iterating through nodes in range
2024-11-16 2:12 ` [PATCH v2 1/3] drm/drm_mm: Safe macro for iterating through nodes in range Tomasz Lis
@ 2024-11-16 18:29 ` Michal Wajdeczko
0 siblings, 0 replies; 16+ messages in thread
From: Michal Wajdeczko @ 2024-11-16 18:29 UTC (permalink / raw)
To: Tomasz Lis, intel-xe, dri-devel
Cc: Michał Winiarski, Piotr Piórkowski
+ dri-devel
On 16.11.2024 03:12, Tomasz Lis wrote:
> Benefits of drm_mm_for_each_node_safe and drm_mm_for_each_node_in_range
> squished together into one macro.
>
> Signed-off-by: Tomasz Lis <tomasz.lis@intel.com>
> ---
> include/drm/drm_mm.h | 19 +++++++++++++++++++
> 1 file changed, 19 insertions(+)
>
> diff --git a/include/drm/drm_mm.h b/include/drm/drm_mm.h
> index f654874c4ce6..43e99441f6ba 100644
> --- a/include/drm/drm_mm.h
> +++ b/include/drm/drm_mm.h
> @@ -504,6 +504,25 @@ __drm_mm_interval_first(const struct drm_mm *mm, u64 start, u64 last);
> node__->start < (end__); \
> node__ = list_next_entry(node__, node_list))
>
> +/**
> + * drm_mm_for_each_node_in_range_safe - iterator to walk over a range of
> + * allocated nodes
> + * @node__: drm_mm_node structure to assign to in each iteration step
> + * @next__: &struct drm_mm_node to store the next step
> + * @mm__: drm_mm allocator to walk
> + * @start__: starting offset, the first node will overlap this
> + * @end__: ending offset, the last node will start before this (but may overlap)
> + *
> + * This iterator walks over all nodes in the range allocator that lie
> + * between @start and @end. It is implemented similarly to list_for_each_safe(),
> + * so safe against removal of elements.
> + */
> +#define drm_mm_for_each_node_in_range_safe(node__, next__, mm__, start__, end__) \
> + for (node__ = __drm_mm_interval_first((mm__), (start__), (end__)-1), \
> + next__ = list_next_entry(node__, node_list); \
> + node__->start < (end__); \
> + node__ = next__, next__ = list_next_entry(next__, node_list))
> +
> void drm_mm_scan_init_with_range(struct drm_mm_scan *scan,
> struct drm_mm *mm,
> u64 size, u64 alignment, unsigned long color,
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v2 2/3] drm/xe/sriov: Shifting GGTT area post migration
2024-11-16 2:12 ` [PATCH v2 2/3] drm/xe/sriov: Shifting GGTT area post migration Tomasz Lis
@ 2024-11-16 19:29 ` Michal Wajdeczko
2024-11-23 2:38 ` Lis, Tomasz
0 siblings, 1 reply; 16+ messages in thread
From: Michal Wajdeczko @ 2024-11-16 19:29 UTC (permalink / raw)
To: Tomasz Lis, intel-xe, Rodrigo Vivi
Cc: Michał Winiarski, Piotr Piórkowski
On 16.11.2024 03:12, Tomasz Lis wrote:
> We have only one GGTT for all IOV functions, with each VF having assigned
> a range of addresses for its use. After migration, a VF can receive a
> different range of addresses than it had initially.
>
> This implements shifting GGTT addresses within drm_mm nodes, so that
> VMAs stay valid after migration. This will make the driver use new
> addresses when accessing GGTT from the moment the shifting ends.
>
> By taking the ggtt->lock for the period of VMA fixups, this change
> also adds constaint on that mutex. Any locks used during the recovery
> cannot ever wait for hardware response - because after migration,
> the hardware will not do anything until fixups are finished.
>
> Signed-off-by: Tomasz Lis <tomasz.lis@intel.com>
> ---
> drivers/gpu/drm/xe/xe_gt_sriov_vf.c | 175 ++++++++++++++++++++++++++++
> drivers/gpu/drm/xe/xe_gt_sriov_vf.h | 1 +
> drivers/gpu/drm/xe/xe_sriov_vf.c | 15 +++
> 3 files changed, 191 insertions(+)
>
> diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_vf.c b/drivers/gpu/drm/xe/xe_gt_sriov_vf.c
> index cca5d5732802..ae24c47ed8f8 100644
> --- a/drivers/gpu/drm/xe/xe_gt_sriov_vf.c
> +++ b/drivers/gpu/drm/xe/xe_gt_sriov_vf.c
> @@ -912,6 +912,181 @@ int xe_gt_sriov_vf_query_runtime(struct xe_gt *gt)
> return err;
> }
>
> +static u64 drm_mm_node_end(struct drm_mm_node *node)
> +{
> + return node->start + node->size;
> +}
> +
> +static s64 vf_get_post_migration_ggtt_shift(struct xe_gt *gt)
> +{
> + struct xe_gt_sriov_vf_selfconfig *config = >->sriov.vf.self_config;
I'm wondering whether it would be possible to set/remember any GGTT
shift when VF was querying it's new config?
> + struct xe_tile *tile = gt_to_tile(gt);
> + u64 old_base;
> + s64 ggtt_shift;
> +
> + old_base = drm_mm_node_end(&tile->sriov.vf.ggtt_balloon[0]->base);
> + ggtt_shift = config->ggtt_base - (s64)old_base;
> +
> + xe_gt_sriov_info(gt, "GGTT base shifted from %#llx to %#llx\n",
> + old_base, old_base + ggtt_shift);
> +
> + return ggtt_shift;
> +}
> +
> +static void xe_ggtt_mm_shift_nodes(struct xe_ggtt *ggtt, struct drm_mm_node *balloon_beg,
> + struct drm_mm_node *balloon_fin, s64 shift)
there is way too much internals that should be just known to the xe_ggtt
maybe better to move most of this function to xe_ggtt.c ?
> +{
> + struct drm_mm_node *node, *tmpn;
> + int err;
> + LIST_HEAD(temp_list_head);
nit: I think our Xe maintainers prefer declarations in Reverse Christmas
Tree Format
> +
> + lockdep_assert_held(&ggtt->lock);
> +
> + /*
> + * Move nodes, from range previously assigned to this VF, into temp list.
> + *
> + * The balloon_beg and balloon_fin nodes are there to eliminate unavailable
> + * ranges from use: first reserves the GGTT area below the range for current VF,
> + * and second reserves area above. There may also exist extra nodes at the bottom
> + * or top of GGTT range, as long as there are no free spaces inbetween. Such
> + * extra nodes will be left unchanged.
> + *
> + * Below is a GGTT layout of example VF, with a certain address range assigned to
> + * said VF, and inaccessible areas above and below:
> + *
> + * 0 ggtt->size
> + * |<--------------------------- Total GGTT size ----------------------------->|
> + *
> + * +-----------+-------------------------+----------+--------------+-----------+
> + * |\\\\\\\\\\\|/////////////////////////| VF mem |//////////////|\\\\\\\\\\\|
> + * +-----------+-------------------------+----------+--------------+-----------+
> + *
> + * Hardware enforced access rules before migration:
> + *
> + * |<------- inaccessible for VF ------->|<VF owned>|<-- inaccessible for VF ->|
> + *
> + * drm_mm nodes used for tracking allocations:
> + *
> + * |<- extra ->|<------- balloon ------->|<- nodes->|<-- balloon ->|<- extra ->|
in Xe we don't have 'extra' regions since xe_ggtt already covers only
GuC accessible GGTT region, so it's like:
0 4GiB
|<----------------- Total GGTT size ------------------------>|
WOPCM GUC_TOP
+-------+-------------------+-----------+------------+-------+
|\\\\\\\|///////////////////| VF mem |////////////|\\\\\\\|
+-------+-------------------+-----------+------------+-------+
0 ggtt->size
|<--balloon-------->|<--nodes-->|<-balloon->|
> + *
> + * After the migration, GGTT area assigned to the VF might have shifted, either
> + * to lower or to higher address. But we expect the total size and extra areas to
> + * be identical, as migration can only happen between matching platforms.
> + * Below is an example of GGTT layout of the VF after migration. Content of the
> + * GGTT for VF has been moved to a new area, and we receive its address from GuC:
> + *
> + * +-----------+--------------+----------+-------------------------+-----------+
> + * |\\\\\\\\\\\|//////////////| VF mem |/////////////////////////|\\\\\\\\\\\|
> + * +-----------+--------------+----------+-------------------------+-----------+
> + *
> + * Hardware enforced access rules after migration:
> + *
> + * |<- inaccessible for VF -->|<VF owned>|<------- inaccessible for VF ------->|
> + *
> + * So the VF has a new slice of GGTT assigned, and during migration process, the
> + * memory content was copied to that new area. But the drm_mm nodes within i915
i915 ?
> + * are still tracking allocations using the old addresses. The nodes within VF
> + * owned area have to be shifted, and balloon nodes need to be resized to
> + * properly mask out areas not owned by the VF.
> + *
> + * Fixed drm_mm nodes used for tracking allocations:
drm_mm nodes are implementation details of the xe_ggtt_nodes
> + *
> + * |<- extra ->|<- balloon ->|<-- VF -->|<-------- balloon ------>|<- extra ->|
> + *
> + * Due to use of GPU profiles, we do not expect the old and new GGTT ares to
> + * overlap; but our node shifting will fix addresses properly regardless.
> + *
> + */
> + drm_mm_for_each_node_in_range_safe(node, tmpn, &ggtt->mm,
> + drm_mm_node_end(balloon_beg),
> + balloon_fin->start) {
> + drm_mm_remove_node(node);
> + list_add(&node->node_list, &temp_list_head);
> + }
> +
> + /* shift and re-add ballooning nodes */
> + if (drm_mm_node_allocated(balloon_beg))
> + drm_mm_remove_node(balloon_beg);
> + if (drm_mm_node_allocated(balloon_fin))
> + drm_mm_remove_node(balloon_fin);
> + balloon_beg->size += shift;
> + balloon_fin->start += shift;
> + balloon_fin->size -= shift;
> + if (balloon_beg->size != 0) {
> + err = drm_mm_reserve_node(&ggtt->mm, balloon_beg);
> + XE_WARN_ON(err);
> + }
> + if (balloon_fin->size != 0) {
> + err = drm_mm_reserve_node(&ggtt->mm, balloon_fin);
> + XE_WARN_ON(err);
maybe xe_tile_assert() will work here?
> + }
> +
> + /*
> + * Now the GGTT VM contains only nodes outside of area assigned to this VF.
> + * We can re-add all VF nodes with shifted offsets.
> + */
> + list_for_each_entry_safe(node, tmpn, &temp_list_head, node_list) {
> + list_del(&node->node_list);
> + node->start += shift;
> + err = drm_mm_reserve_node(&ggtt->mm, node);
> + XE_WARN_ON(err);
ditto
> + }
> +}
> +
> +static void xe_ggtt_node_shift_nodes(struct xe_ggtt *ggtt, struct xe_ggtt_node *balloon_beg,
> + struct xe_ggtt_node *balloon_fin, s64 shift)
> +{
> + struct drm_mm_node *balloon_mm_beg, *balloon_mm_end;
> + struct drm_mm_node loc_beg, loc_end;
> +
> + if (balloon_beg && balloon_beg->ggtt)
> + balloon_mm_beg = &balloon_beg->base;
> + else {
> + loc_beg.color = 0;
> + loc_beg.flags = 0;
> + loc_beg.start = xe_wopcm_size(ggtt->tile->xe);
> + loc_beg.size = 0;
> + balloon_mm_beg = &loc_beg;
> + }
> +
> + if (balloon_fin && balloon_fin->ggtt)
> + balloon_mm_end = &balloon_fin->base;
> + else {
> + loc_end.color = 0;
> + loc_end.flags = 0;
> + loc_end.start = GUC_GGTT_TOP;
> + loc_end.size = 0;
> + balloon_mm_end = &loc_end;
> + }
> +
> + drm_dbg(&ggtt->tile->xe->drm, "tli: node shift start beg %llx %llx end %llx %llx\n",
> + balloon_mm_beg->start, balloon_mm_beg->size,
> + balloon_mm_end->start, balloon_mm_end->size);
> + xe_ggtt_mm_shift_nodes(ggtt, balloon_mm_beg, balloon_mm_end, shift);
> + drm_dbg(&ggtt->tile->xe->drm, "tli: node shift end\n");
tli ? looks like your private debug logs
> +}
> +
> +/**
> + * xe_gt_sriov_vf_fixup_ggtt_nodes - Shift GGTT allocations to match assigned range.
> + * @gt: the &xe_gt struct instance
> + *
> + * Since Global GTT is not virtualized, each VF has an assigned range
> + * within the global space. This range might have changed during migration,
> + * which requires all memory addresses pointing to GGTT to be shifted.
> + */
> +void xe_gt_sriov_vf_fixup_ggtt_nodes(struct xe_gt *gt)
> +{
> + struct xe_tile *tile = gt_to_tile(gt);
> + struct xe_ggtt *ggtt = tile->mem.ggtt;
> + s64 ggtt_shift;
> +
> + mutex_lock(&ggtt->lock);
> + ggtt_shift = vf_get_post_migration_ggtt_shift(gt);
do we still need to do anything if shift is 0?
> + xe_ggtt_node_shift_nodes(ggtt, tile->sriov.vf.ggtt_balloon[0],
> + tile->sriov.vf.ggtt_balloon[1], ggtt_shift);
> + mutex_unlock(&ggtt->lock);
> +}
> +
> static int vf_runtime_reg_cmp(const void *a, const void *b)
> {
> const struct vf_runtime_reg *ra = a;
> diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_vf.h b/drivers/gpu/drm/xe/xe_gt_sriov_vf.h
> index 912d20814261..a8745ec23380 100644
> --- a/drivers/gpu/drm/xe/xe_gt_sriov_vf.h
> +++ b/drivers/gpu/drm/xe/xe_gt_sriov_vf.h
> @@ -17,6 +17,7 @@ int xe_gt_sriov_vf_query_config(struct xe_gt *gt);
> int xe_gt_sriov_vf_connect(struct xe_gt *gt);
> int xe_gt_sriov_vf_query_runtime(struct xe_gt *gt);
> int xe_gt_sriov_vf_prepare_ggtt(struct xe_gt *gt);
> +void xe_gt_sriov_vf_fixup_ggtt_nodes(struct xe_gt *gt);
> int xe_gt_sriov_vf_notify_resfix_done(struct xe_gt *gt);
> void xe_gt_sriov_vf_migrated_event_handler(struct xe_gt *gt);
>
> diff --git a/drivers/gpu/drm/xe/xe_sriov_vf.c b/drivers/gpu/drm/xe/xe_sriov_vf.c
> index c1275e64aa9c..5bcd55999e0e 100644
> --- a/drivers/gpu/drm/xe/xe_sriov_vf.c
> +++ b/drivers/gpu/drm/xe/xe_sriov_vf.c
> @@ -7,6 +7,7 @@
>
> #include "xe_assert.h"
> #include "xe_device.h"
> +#include "xe_gt.h"
> #include "xe_gt_sriov_printk.h"
> #include "xe_gt_sriov_vf.h"
> #include "xe_pm.h"
> @@ -170,6 +171,19 @@ static bool vf_post_migration_imminent(struct xe_device *xe)
> work_pending(&xe->sriov.vf.migration.worker);
> }
>
> +static void vf_post_migration_fixup_ggtt_nodes(struct xe_device *xe)
> +{
> + struct xe_gt *gt;
> + unsigned int id;
> +
> + for_each_gt(gt, xe, id) {
maybe for_each_tile() would be a better fit here?
> + /* media doesn't have its own ggtt */
> + if (xe_gt_is_media_type(gt))
> + continue;
> + xe_gt_sriov_vf_fixup_ggtt_nodes(gt);
> + }
> +}
> +
> /*
> * Notify all GuCs about resource fixups apply finished.
> */
> @@ -201,6 +215,7 @@ static void vf_post_migration_recovery(struct xe_device *xe)
> if (unlikely(err))
> goto fail;
>
> + vf_post_migration_fixup_ggtt_nodes(xe);
> /* FIXME: add the recovery steps */
> vf_post_migration_notify_resfix_done(xe);
> xe_pm_runtime_put(xe);
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v2 3/3] drm/xe/vf: Fixup CTB send buffer messages after migration
2024-11-16 2:12 ` [PATCH v2 3/3] drm/xe/vf: Fixup CTB send buffer messages after migration Tomasz Lis
@ 2024-11-16 20:01 ` Michal Wajdeczko
2024-11-23 2:49 ` Lis, Tomasz
0 siblings, 1 reply; 16+ messages in thread
From: Michal Wajdeczko @ 2024-11-16 20:01 UTC (permalink / raw)
To: Tomasz Lis, intel-xe; +Cc: Michał Winiarski, Piotr Piórkowski
On 16.11.2024 03:12, Tomasz Lis wrote:
> During post-migration recovery of a VF, it in necessary to update
> GGTT references included in messages which are going to be sent
> to GuC. GuC will start consuming messages after VF KMD will inform
> it about fixups being done; before that, the VF KMD is expected
> to update any H2G messages which are already in send buffer but
> were not consumed by GuC.
>
> Only a small subset of messages allowed for VFs have GGTT references
> in them. This patch adds the functionality to parse the CTB send
> ring buffer and shift addresses contained within.
>
> While fixing the CTB content, ct->lock is not taken. This means
> the only barier taken remains GGTT address lock - which is ok,
typo barrier
> because only requests with GGTT addresses matter, but it also means
> tail changes can happen during the CTB fixups execution (which may
> be ignored as any new messages will not have anything to fix).
>
> The GGTT address locking will be introduced in a future series.
>
> Signed-off-by: Tomasz Lis <tomasz.lis@intel.com>
> ---
> drivers/gpu/drm/xe/xe_gt_sriov_vf.c | 2 +
> drivers/gpu/drm/xe/xe_gt_sriov_vf_types.h | 2 +
> drivers/gpu/drm/xe/xe_guc_ct.c | 146 ++++++++++++++++++++++
> drivers/gpu/drm/xe/xe_guc_ct.h | 2 +
> drivers/gpu/drm/xe/xe_sriov_vf.c | 12 ++
> 5 files changed, 164 insertions(+)
>
> diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_vf.c b/drivers/gpu/drm/xe/xe_gt_sriov_vf.c
> index ae24c47ed8f8..604cbbf55d4f 100644
> --- a/drivers/gpu/drm/xe/xe_gt_sriov_vf.c
> +++ b/drivers/gpu/drm/xe/xe_gt_sriov_vf.c
> @@ -920,12 +920,14 @@ static u64 drm_mm_node_end(struct drm_mm_node *node)
> static s64 vf_get_post_migration_ggtt_shift(struct xe_gt *gt)
> {
> struct xe_gt_sriov_vf_selfconfig *config = >->sriov.vf.self_config;
> + struct xe_gt_sriov_vf_runtime *runtime = >->sriov.vf.runtime;
> struct xe_tile *tile = gt_to_tile(gt);
> u64 old_base;
> s64 ggtt_shift;
>
> old_base = drm_mm_node_end(&tile->sriov.vf.ggtt_balloon[0]->base);
> ggtt_shift = config->ggtt_base - (s64)old_base;
> + runtime->ggtt_shift = ggtt_shift;
can't we store that when reading new config?
>
> xe_gt_sriov_info(gt, "GGTT base shifted from %#llx to %#llx\n",
> old_base, old_base + ggtt_shift);
> diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_vf_types.h b/drivers/gpu/drm/xe/xe_gt_sriov_vf_types.h
> index a57f13b5afcd..6af219b0eb1e 100644
> --- a/drivers/gpu/drm/xe/xe_gt_sriov_vf_types.h
> +++ b/drivers/gpu/drm/xe/xe_gt_sriov_vf_types.h
> @@ -65,6 +65,8 @@ struct xe_gt_sriov_vf_runtime {
> /** @regs.value: register value. */
> u32 value;
> } *regs;
> + /** @ggtt_shift: difference in ggtt_base on last migration */
> + s64 ggtt_shift;
by 'VF runtime data' we meant here the missing HW data obtained at
_runtime_ from the GuC/PF (see "runtime-regs")
this 'shift' is more like a migration specific data and doesn't really
fit here, so better define a separate struct for it
> };
>
> /**
> diff --git a/drivers/gpu/drm/xe/xe_guc_ct.c b/drivers/gpu/drm/xe/xe_guc_ct.c
> index 7eb175a0b874..119f4627a6d5 100644
> --- a/drivers/gpu/drm/xe/xe_guc_ct.c
> +++ b/drivers/gpu/drm/xe/xe_guc_ct.c
> @@ -84,6 +84,8 @@ struct g2h_fence {
> bool done;
> };
>
> +#define make_u64(hi, lo) ((u64)((u64)(u32)(hi) << 32 | (u32)(lo)))
> +
> static void g2h_fence_init(struct g2h_fence *g2h_fence, u32 *response_buffer)
> {
> g2h_fence->response_buffer = response_buffer;
> @@ -1620,6 +1622,150 @@ static void g2h_worker_func(struct work_struct *w)
> receive_g2h(ct);
> }
>
> +/*
> + * ct_update_addresses_in_message - Shift any GGTT addresses within
> + * a single message left within CTB from before post-migration recovery.
> + * @ct: pointer to CT struct of the target GuC
> + * @cmds: iomap buffer containing CT messages
> + * @head: start of the target message within the buffer
> + * @len: length of the target message
> + * @size: size of the commands buffer
> + * @shift: the address shift to be added to each GGTT reference
> + */
> +static void ct_update_addresses_in_message(struct xe_guc_ct *ct,
> + struct iosys_map *cmds, u32 head,
> + u32 len, u32 size, s64 shift)
> +{
> + struct xe_device *xe = ct_to_xe(ct);
> + u32 action, i, n;
> + u32 msg[2];
> + u64 offset;
> +
> +#define read32(o, p) \
> +do { \
> + xe_map_memcpy_from(xe, msg, cmds, (head + p) * sizeof(u32), \
> + 1 * sizeof(u32)); \
> + o = msg[0]; \
> +} while (0)
> +#define fixup64(p) \
> +do { \
> + xe_map_memcpy_from(xe, msg, cmds, (head + p) * sizeof(u32), \
> + 2 * sizeof(u32)); \
what about buffer wrap?
> + offset = make_u64(msg[1], msg[0]); \
> + offset += shift; \
> + msg[0] = lower_32_bits(offset); \
> + msg[1] = upper_32_bits(offset); \
> + xe_map_memcpy_to(xe, cmds, (head + p) * sizeof(u32), msg, 2 * sizeof(u32)); \
> +} while (0)
those macros are quite ugly and violating many rules
maybe they should be converted into inlines?
> +
> + xe_map_memcpy_from(xe, msg, cmds, head * sizeof(u32),
> + 1 * sizeof(u32));
> + action = FIELD_GET(GUC_HXG_REQUEST_MSG_0_ACTION, msg[0]);
> + switch (action) {
> + case XE_GUC_ACTION_REGISTER_CONTEXT:
> + case XE_GUC_ACTION_REGISTER_CONTEXT_MULTI_LRC:
> + /* field wq_desc */
> + fixup64(5);
> + /* field wq_base */
> + fixup64(7);
> + if (action == XE_GUC_ACTION_REGISTER_CONTEXT_MULTI_LRC) {
> + /* field number_children */
> + read32(n, 10);
> + /* field hwlrca and child lrcas */
> + for (i = 0; i < n; i++)
> + fixup64(11 + 2 * i);
> + } else {
> + /* field hwlrca */
> + fixup64(10);
> + }
> + break;
> + default:
> + break;
> + }
> +#undef fixup64
> +#undef read32
> +}
> +
> +static int ct_update_addresses_in_buffer(struct xe_guc_ct *ct,
> + struct guc_ctb *h2g,
> + s64 shift, u32 *mhead, s32 avail)
> +{
> + struct xe_device *xe = ct_to_xe(ct);
> + u32 head = *mhead;
> + u32 size = h2g->info.size;
> + u32 msg[1];
> + u32 len;
> +
> + /* Read header */
> + xe_map_memcpy_from(xe, msg, &h2g->cmds, sizeof(u32) * head,
> + sizeof(u32));
> + len = FIELD_GET(GUC_CTB_MSG_0_NUM_DWORDS, msg[0]) + GUC_CTB_MSG_MIN_LEN;
is it ok to access here all this CTB data without any lock?
> +
> + if (unlikely(len > (u32)avail)) {
> + struct xe_gt *gt = ct_to_gt(ct);
> +
> + xe_gt_err(gt, "H2G channel broken on read, avail=%d, len=%d, fixups skipped\n",
> + avail, len);
> + return 0;
shouldn't we return some -errno to correctly report failure to the caller?
> + }
> +
> + head = (head + 1) % size;
> + ct_update_addresses_in_message(ct, &h2g->cmds, head, len - 1, size, shift);
> + *mhead = (head + len - 1) % size;
> +
> + return avail - len;
> +}
> +
> +/**
> + * xe_guc_ct_update_addresses - Shifts any GGTT addresses left
> + * within CTB from before post-migration recovery.
"Fixup any pending H2G CTB messages by updating GGTT offsets in their
payloads" ?
> + * @ct: pointer to CT struct of the target GuC
> + */
> +int xe_guc_ct_update_addresses(struct xe_guc_ct *ct)
> +{
> + struct xe_guc *guc = ct_to_guc(ct);
> + struct xe_gt *gt = guc_to_gt(guc);
> + struct xe_gt_sriov_vf_runtime *runtime = >->sriov.vf.runtime;
please provide ggtt-shift explicitly to avoid direct access to the VF
data from the CT code
> + struct guc_ctb *h2g = &ct->ctbs.h2g;
> + u32 head = h2g->info.head;
> + u32 tail = READ_ONCE(h2g->info.tail);
> + u32 size = h2g->info.size;
> + s32 avail;
> + s64 ggtt_shift;
> +
> + if (unlikely(h2g->info.broken))
> + return -EPIPE;
> +
> + XE_WARN_ON(head > size);
use xe_gt_WARN() or xe_gt_assert() instead - depends on what exactly do
you want to check here
> +
> + if (unlikely(tail >= size)) {
> + xe_gt_err(gt, "H2G channel has Invalid tail offset (%u >= %u)\n",
s/Invalid/invalid
> + tail, size);
> + goto corrupted;
> + }
> +
> + avail = tail - head;
> +
> + /* beware of buffer wrap case */
> + if (unlikely(avail < 0))
> + avail += size;
> + xe_gt_dbg(gt, "available %d (%u:%u:%u)\n", avail, head, tail, size);
> + XE_WARN_ON(avail < 0);
> +
> + ggtt_shift = runtime->ggtt_shift;
> +
> + while (avail > 0)
> + avail = ct_update_addresses_in_buffer(ct, h2g, ggtt_shift, &head, avail);
> +
> + return 0;
> +
> +corrupted:
> + xe_gt_err(gt, "Corrupted descriptor head=%u tail=%u\n",
> + head, tail);
> + h2g->info.broken = true;
> + return -EPIPE;
> +}
> +
> static struct xe_guc_ct_snapshot *guc_ct_snapshot_alloc(struct xe_guc_ct *ct, bool atomic,
> bool want_ctb)
> {
> diff --git a/drivers/gpu/drm/xe/xe_guc_ct.h b/drivers/gpu/drm/xe/xe_guc_ct.h
> index 82c4ae458dda..6b04fd4b1e03 100644
> --- a/drivers/gpu/drm/xe/xe_guc_ct.h
> +++ b/drivers/gpu/drm/xe/xe_guc_ct.h
> @@ -22,6 +22,8 @@ void xe_guc_ct_snapshot_print(struct xe_guc_ct_snapshot *snapshot, struct drm_pr
> void xe_guc_ct_snapshot_free(struct xe_guc_ct_snapshot *snapshot);
> void xe_guc_ct_print(struct xe_guc_ct *ct, struct drm_printer *p, bool want_ctb);
>
> +int xe_guc_ct_update_addresses(struct xe_guc_ct *ct);
> +
> static inline bool xe_guc_ct_enabled(struct xe_guc_ct *ct)
> {
> return ct->state == XE_GUC_CT_STATE_ENABLED;
> diff --git a/drivers/gpu/drm/xe/xe_sriov_vf.c b/drivers/gpu/drm/xe/xe_sriov_vf.c
> index 5bcd55999e0e..08c789ebfa18 100644
> --- a/drivers/gpu/drm/xe/xe_sriov_vf.c
> +++ b/drivers/gpu/drm/xe/xe_sriov_vf.c
> @@ -10,6 +10,7 @@
> #include "xe_gt.h"
> #include "xe_gt_sriov_printk.h"
> #include "xe_gt_sriov_vf.h"
> +#include "xe_guc_ct.h"
> #include "xe_pm.h"
> #include "xe_sriov.h"
> #include "xe_sriov_printk.h"
> @@ -158,6 +159,15 @@ static int vf_post_migration_requery_guc(struct xe_device *xe)
> return ret;
> }
>
> +static void vf_post_migration_fixup_ctb(struct xe_device *xe)
> +{
> + struct xe_gt *gt;
> + unsigned int id;
> +
> + for_each_gt(gt, xe, id)
> + xe_guc_ct_update_addresses(>->uc.guc.ct);
> +}
> +
> /*
> * vf_post_migration_imminent - Check if post-restore recovery is coming.
> * @xe: the &xe_device struct instance
> @@ -217,6 +227,8 @@ static void vf_post_migration_recovery(struct xe_device *xe)
>
> vf_post_migration_fixup_ggtt_nodes(xe);
> /* FIXME: add the recovery steps */
> + vf_post_migration_fixup_ctb(xe);
> +
why this extra separation line?
> vf_post_migration_notify_resfix_done(xe);
> xe_pm_runtime_put(xe);
> drm_notice(&xe->drm, "migration recovery ended\n");
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v2 2/3] drm/xe/sriov: Shifting GGTT area post migration
2024-11-16 19:29 ` Michal Wajdeczko
@ 2024-11-23 2:38 ` Lis, Tomasz
0 siblings, 0 replies; 16+ messages in thread
From: Lis, Tomasz @ 2024-11-23 2:38 UTC (permalink / raw)
To: Michal Wajdeczko, intel-xe, Rodrigo Vivi
Cc: Michał Winiarski, Piotr Piórkowski
On 16.11.2024 20:29, Michal Wajdeczko wrote:
> On 16.11.2024 03:12, Tomasz Lis wrote:
>> We have only one GGTT for all IOV functions, with each VF having assigned
>> a range of addresses for its use. After migration, a VF can receive a
>> different range of addresses than it had initially.
>>
>> This implements shifting GGTT addresses within drm_mm nodes, so that
>> VMAs stay valid after migration. This will make the driver use new
>> addresses when accessing GGTT from the moment the shifting ends.
>>
>> By taking the ggtt->lock for the period of VMA fixups, this change
>> also adds constaint on that mutex. Any locks used during the recovery
>> cannot ever wait for hardware response - because after migration,
>> the hardware will not do anything until fixups are finished.
>>
>> Signed-off-by: Tomasz Lis<tomasz.lis@intel.com>
>> ---
>> drivers/gpu/drm/xe/xe_gt_sriov_vf.c | 175 ++++++++++++++++++++++++++++
>> drivers/gpu/drm/xe/xe_gt_sriov_vf.h | 1 +
>> drivers/gpu/drm/xe/xe_sriov_vf.c | 15 +++
>> 3 files changed, 191 insertions(+)
>>
>> diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_vf.c b/drivers/gpu/drm/xe/xe_gt_sriov_vf.c
>> index cca5d5732802..ae24c47ed8f8 100644
>> --- a/drivers/gpu/drm/xe/xe_gt_sriov_vf.c
>> +++ b/drivers/gpu/drm/xe/xe_gt_sriov_vf.c
>> @@ -912,6 +912,181 @@ int xe_gt_sriov_vf_query_runtime(struct xe_gt *gt)
>> return err;
>> }
>>
>> +static u64 drm_mm_node_end(struct drm_mm_node *node)
>> +{
>> + return node->start + node->size;
>> +}
>> +
>> +static s64 vf_get_post_migration_ggtt_shift(struct xe_gt *gt)
>> +{
>> + struct xe_gt_sriov_vf_selfconfig *config = >->sriov.vf.self_config;
> I'm wondering whether it would be possible to set/remember any GGTT
> shift when VF was querying it's new config?
The querying happens within post-migration recovery worker, after the
upcoming lock is taken.
So subtracting old from new just after the GuC config query would be doable.
Yeah, will do that.
>> + struct xe_tile *tile = gt_to_tile(gt);
>> + u64 old_base;
>> + s64 ggtt_shift;
>> +
>> + old_base = drm_mm_node_end(&tile->sriov.vf.ggtt_balloon[0]->base);
>> + ggtt_shift = config->ggtt_base - (s64)old_base;
>> +
>> + xe_gt_sriov_info(gt, "GGTT base shifted from %#llx to %#llx\n",
>> + old_base, old_base + ggtt_shift);
>> +
>> + return ggtt_shift;
>> +}
>> +
>> +static void xe_ggtt_mm_shift_nodes(struct xe_ggtt *ggtt, struct drm_mm_node *balloon_beg,
>> + struct drm_mm_node *balloon_fin, s64 shift)
> there is way too much internals that should be just known to the xe_ggtt
> maybe better to move most of this function to xe_ggtt.c ?
Sure, I can move them. Will do.
>> +{
>> + struct drm_mm_node *node, *tmpn;
>> + int err;
>> + LIST_HEAD(temp_list_head);
> nit: I think our Xe maintainers prefer declarations in Reverse Christmas
> Tree Format
I though the rule is - uninitialized, then initialized. But I see all
possible conventions within the existing sources, so there just seem to
be no rule.
>> +
>> + lockdep_assert_held(&ggtt->lock);
>> +
>> + /*
>> + * Move nodes, from range previously assigned to this VF, into temp list.
>> + *
>> + * The balloon_beg and balloon_fin nodes are there to eliminate unavailable
>> + * ranges from use: first reserves the GGTT area below the range for current VF,
>> + * and second reserves area above. There may also exist extra nodes at the bottom
>> + * or top of GGTT range, as long as there are no free spaces inbetween. Such
>> + * extra nodes will be left unchanged.
>> + *
>> + * Below is a GGTT layout of example VF, with a certain address range assigned to
>> + * said VF, and inaccessible areas above and below:
>> + *
>> + * 0 ggtt->size
>> + * |<--------------------------- Total GGTT size ----------------------------->|
>> + *
>> + * +-----------+-------------------------+----------+--------------+-----------+
>> + * |\\\\\\\\\\\|/////////////////////////| VF mem |//////////////|\\\\\\\\\\\|
>> + * +-----------+-------------------------+----------+--------------+-----------+
>> + *
>> + * Hardware enforced access rules before migration:
>> + *
>> + * |<------- inaccessible for VF ------->|<VF owned>|<-- inaccessible for VF ->|
>> + *
>> + * drm_mm nodes used for tracking allocations:
>> + *
>> + * |<- extra ->|<------- balloon ------->|<- nodes->|<-- balloon ->|<- extra ->|
> in Xe we don't have 'extra' regions since xe_ggtt already covers only
> GuC accessible GGTT region, so it's like:
>
> 0 4GiB
> |<----------------- Total GGTT size ------------------------>|
>
> WOPCM GUC_TOP
> +-------+-------------------+-----------+------------+-------+
> |\\\\\\\|///////////////////| VF mem |////////////|\\\\\\\|
> +-------+-------------------+-----------+------------+-------+
>
> 0 ggtt->size
> |<--balloon-------->|<--nodes-->|<-balloon->|
will update.
>> + *
>> + * After the migration, GGTT area assigned to the VF might have shifted, either
>> + * to lower or to higher address. But we expect the total size and extra areas to
>> + * be identical, as migration can only happen between matching platforms.
>> + * Below is an example of GGTT layout of the VF after migration. Content of the
>> + * GGTT for VF has been moved to a new area, and we receive its address from GuC:
>> + *
>> + * +-----------+--------------+----------+-------------------------+-----------+
>> + * |\\\\\\\\\\\|//////////////| VF mem |/////////////////////////|\\\\\\\\\\\|
>> + * +-----------+--------------+----------+-------------------------+-----------+
>> + *
>> + * Hardware enforced access rules after migration:
>> + *
>> + * |<- inaccessible for VF -->|<VF owned>|<------- inaccessible for VF ------->|
>> + *
>> + * So the VF has a new slice of GGTT assigned, and during migration process, the
>> + * memory content was copied to that new area. But the drm_mm nodes within i915
> i915 ?
ack
>> + * are still tracking allocations using the old addresses. The nodes within VF
>> + * owned area have to be shifted, and balloon nodes need to be resized to
>> + * properly mask out areas not owned by the VF.
>> + *
>> + * Fixed drm_mm nodes used for tracking allocations:
> drm_mm nodes are implementation details of the xe_ggtt_nodes
You could equally say xe_ggtt_nodes are wrappers for drm_mm nodes.
Neither of these is going anywhere
for the lifetime of the driver within the kernel. And even calling these
approaches equal is a stretch.
It is easier to explain how something works using generic terms, and I'm
sure you agree drm_mm nodes are
more generic than the xe-specific wrappers.
The function is not fixing anything beyond the drm_mm - there are no
modifications to the xe decorator.
And note, vast majority of people reading the code will see the xe nodes
as just that - drm_mm node decorators.
>> + *
>> + * |<- extra ->|<- balloon ->|<-- VF -->|<-------- balloon ------>|<- extra ->|
>> + *
>> + * Due to use of GPU profiles, we do not expect the old and new GGTT ares to
>> + * overlap; but our node shifting will fix addresses properly regardless.
>> + *
>> + */
>> + drm_mm_for_each_node_in_range_safe(node, tmpn, &ggtt->mm,
>> + drm_mm_node_end(balloon_beg),
>> + balloon_fin->start) {
>> + drm_mm_remove_node(node);
>> + list_add(&node->node_list, &temp_list_head);
>> + }
>> +
>> + /* shift and re-add ballooning nodes */
>> + if (drm_mm_node_allocated(balloon_beg))
>> + drm_mm_remove_node(balloon_beg);
>> + if (drm_mm_node_allocated(balloon_fin))
>> + drm_mm_remove_node(balloon_fin);
>> + balloon_beg->size += shift;
>> + balloon_fin->start += shift;
>> + balloon_fin->size -= shift;
>> + if (balloon_beg->size != 0) {
>> + err = drm_mm_reserve_node(&ggtt->mm, balloon_beg);
>> + XE_WARN_ON(err);
>> + }
>> + if (balloon_fin->size != 0) {
>> + err = drm_mm_reserve_node(&ggtt->mm, balloon_fin);
>> + XE_WARN_ON(err);
> maybe xe_tile_assert() will work here?
sound good.
>> + }
>> +
>> + /*
>> + * Now the GGTT VM contains only nodes outside of area assigned to this VF.
>> + * We can re-add all VF nodes with shifted offsets.
>> + */
>> + list_for_each_entry_safe(node, tmpn, &temp_list_head, node_list) {
>> + list_del(&node->node_list);
>> + node->start += shift;
>> + err = drm_mm_reserve_node(&ggtt->mm, node);
>> + XE_WARN_ON(err);
> ditto
>
>> + }
>> +}
>> +
>> +static void xe_ggtt_node_shift_nodes(struct xe_ggtt *ggtt, struct xe_ggtt_node *balloon_beg,
>> + struct xe_ggtt_node *balloon_fin, s64 shift)
>> +{
>> + struct drm_mm_node *balloon_mm_beg, *balloon_mm_end;
>> + struct drm_mm_node loc_beg, loc_end;
>> +
>> + if (balloon_beg && balloon_beg->ggtt)
>> + balloon_mm_beg = &balloon_beg->base;
>> + else {
>> + loc_beg.color = 0;
>> + loc_beg.flags = 0;
>> + loc_beg.start = xe_wopcm_size(ggtt->tile->xe);
>> + loc_beg.size = 0;
>> + balloon_mm_beg = &loc_beg;
>> + }
>> +
>> + if (balloon_fin && balloon_fin->ggtt)
>> + balloon_mm_end = &balloon_fin->base;
>> + else {
>> + loc_end.color = 0;
>> + loc_end.flags = 0;
>> + loc_end.start = GUC_GGTT_TOP;
>> + loc_end.size = 0;
>> + balloon_mm_end = &loc_end;
>> + }
>> +
>> + drm_dbg(&ggtt->tile->xe->drm, "tli: node shift start beg %llx %llx end %llx %llx\n",
>> + balloon_mm_beg->start, balloon_mm_beg->size,
>> + balloon_mm_end->start, balloon_mm_end->size);
>> + xe_ggtt_mm_shift_nodes(ggtt, balloon_mm_beg, balloon_mm_end, shift);
>> + drm_dbg(&ggtt->tile->xe->drm, "tli: node shift end\n");
> tli ? looks like your private debug logs
yeah, forgot about these.
>> +}
>> +
>> +/**
>> + * xe_gt_sriov_vf_fixup_ggtt_nodes - Shift GGTT allocations to match assigned range.
>> + * @gt: the &xe_gt struct instance
>> + *
>> + * Since Global GTT is not virtualized, each VF has an assigned range
>> + * within the global space. This range might have changed during migration,
>> + * which requires all memory addresses pointing to GGTT to be shifted.
>> + */
>> +void xe_gt_sriov_vf_fixup_ggtt_nodes(struct xe_gt *gt)
>> +{
>> + struct xe_tile *tile = gt_to_tile(gt);
>> + struct xe_ggtt *ggtt = tile->mem.ggtt;
>> + s64 ggtt_shift;
>> +
>> + mutex_lock(&ggtt->lock);
>> + ggtt_shift = vf_get_post_migration_ggtt_shift(gt);
> do we still need to do anything if shift is 0?
Decreasing recovery time when possible does make sense. Will add a
condition.
>> + xe_ggtt_node_shift_nodes(ggtt, tile->sriov.vf.ggtt_balloon[0],
>> + tile->sriov.vf.ggtt_balloon[1], ggtt_shift);
>> + mutex_unlock(&ggtt->lock);
>> +}
>> +
>> static int vf_runtime_reg_cmp(const void *a, const void *b)
>> {
>> const struct vf_runtime_reg *ra = a;
>> diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_vf.h b/drivers/gpu/drm/xe/xe_gt_sriov_vf.h
>> index 912d20814261..a8745ec23380 100644
>> --- a/drivers/gpu/drm/xe/xe_gt_sriov_vf.h
>> +++ b/drivers/gpu/drm/xe/xe_gt_sriov_vf.h
>> @@ -17,6 +17,7 @@ int xe_gt_sriov_vf_query_config(struct xe_gt *gt);
>> int xe_gt_sriov_vf_connect(struct xe_gt *gt);
>> int xe_gt_sriov_vf_query_runtime(struct xe_gt *gt);
>> int xe_gt_sriov_vf_prepare_ggtt(struct xe_gt *gt);
>> +void xe_gt_sriov_vf_fixup_ggtt_nodes(struct xe_gt *gt);
>> int xe_gt_sriov_vf_notify_resfix_done(struct xe_gt *gt);
>> void xe_gt_sriov_vf_migrated_event_handler(struct xe_gt *gt);
>>
>> diff --git a/drivers/gpu/drm/xe/xe_sriov_vf.c b/drivers/gpu/drm/xe/xe_sriov_vf.c
>> index c1275e64aa9c..5bcd55999e0e 100644
>> --- a/drivers/gpu/drm/xe/xe_sriov_vf.c
>> +++ b/drivers/gpu/drm/xe/xe_sriov_vf.c
>> @@ -7,6 +7,7 @@
>>
>> #include "xe_assert.h"
>> #include "xe_device.h"
>> +#include "xe_gt.h"
>> #include "xe_gt_sriov_printk.h"
>> #include "xe_gt_sriov_vf.h"
>> #include "xe_pm.h"
>> @@ -170,6 +171,19 @@ static bool vf_post_migration_imminent(struct xe_device *xe)
>> work_pending(&xe->sriov.vf.migration.worker);
>> }
>>
>> +static void vf_post_migration_fixup_ggtt_nodes(struct xe_device *xe)
>> +{
>> + struct xe_gt *gt;
>> + unsigned int id;
>> +
>> + for_each_gt(gt, xe, id) {
> maybe for_each_tile() would be a better fit here?
Since current platforms have ggtt per-tile rather than per-gt, it does
makes sense. Will change.
-Tomasz
>> + /* media doesn't have its own ggtt */
>> + if (xe_gt_is_media_type(gt))
>> + continue;
>> + xe_gt_sriov_vf_fixup_ggtt_nodes(gt);
>> + }
>> +}
>> +
>> /*
>> * Notify all GuCs about resource fixups apply finished.
>> */
>> @@ -201,6 +215,7 @@ static void vf_post_migration_recovery(struct xe_device *xe)
>> if (unlikely(err))
>> goto fail;
>>
>> + vf_post_migration_fixup_ggtt_nodes(xe);
>> /* FIXME: add the recovery steps */
>> vf_post_migration_notify_resfix_done(xe);
>> xe_pm_runtime_put(xe);
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v2 3/3] drm/xe/vf: Fixup CTB send buffer messages after migration
2024-11-16 20:01 ` Michal Wajdeczko
@ 2024-11-23 2:49 ` Lis, Tomasz
0 siblings, 0 replies; 16+ messages in thread
From: Lis, Tomasz @ 2024-11-23 2:49 UTC (permalink / raw)
To: Michal Wajdeczko, intel-xe; +Cc: Michał Winiarski, Piotr Piórkowski
On 16.11.2024 21:01, Michal Wajdeczko wrote:
> On 16.11.2024 03:12, Tomasz Lis wrote:
>> During post-migration recovery of a VF, it in necessary to update
>> GGTT references included in messages which are going to be sent
>> to GuC. GuC will start consuming messages after VF KMD will inform
>> it about fixups being done; before that, the VF KMD is expected
>> to update any H2G messages which are already in send buffer but
>> were not consumed by GuC.
>>
>> Only a small subset of messages allowed for VFs have GGTT references
>> in them. This patch adds the functionality to parse the CTB send
>> ring buffer and shift addresses contained within.
>>
>> While fixing the CTB content, ct->lock is not taken. This means
>> the only barier taken remains GGTT address lock - which is ok,
> typo barrier
ack
>> because only requests with GGTT addresses matter, but it also means
>> tail changes can happen during the CTB fixups execution (which may
>> be ignored as any new messages will not have anything to fix).
>>
>> The GGTT address locking will be introduced in a future series.
>>
>> Signed-off-by: Tomasz Lis<tomasz.lis@intel.com>
>> ---
>> drivers/gpu/drm/xe/xe_gt_sriov_vf.c | 2 +
>> drivers/gpu/drm/xe/xe_gt_sriov_vf_types.h | 2 +
>> drivers/gpu/drm/xe/xe_guc_ct.c | 146 ++++++++++++++++++++++
>> drivers/gpu/drm/xe/xe_guc_ct.h | 2 +
>> drivers/gpu/drm/xe/xe_sriov_vf.c | 12 ++
>> 5 files changed, 164 insertions(+)
>>
>> diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_vf.c b/drivers/gpu/drm/xe/xe_gt_sriov_vf.c
>> index ae24c47ed8f8..604cbbf55d4f 100644
>> --- a/drivers/gpu/drm/xe/xe_gt_sriov_vf.c
>> +++ b/drivers/gpu/drm/xe/xe_gt_sriov_vf.c
>> @@ -920,12 +920,14 @@ static u64 drm_mm_node_end(struct drm_mm_node *node)
>> static s64 vf_get_post_migration_ggtt_shift(struct xe_gt *gt)
>> {
>> struct xe_gt_sriov_vf_selfconfig *config = >->sriov.vf.self_config;
>> + struct xe_gt_sriov_vf_runtime *runtime = >->sriov.vf.runtime;
>> struct xe_tile *tile = gt_to_tile(gt);
>> u64 old_base;
>> s64 ggtt_shift;
>>
>> old_base = drm_mm_node_end(&tile->sriov.vf.ggtt_balloon[0]->base);
>> ggtt_shift = config->ggtt_base - (s64)old_base;
>> + runtime->ggtt_shift = ggtt_shift;
> can't we store that when reading new config?
will do.
>
>>
>> xe_gt_sriov_info(gt, "GGTT base shifted from %#llx to %#llx\n",
>> old_base, old_base + ggtt_shift);
>> diff --git a/drivers/gpu/drm/xe/xe_gt_sriov_vf_types.h b/drivers/gpu/drm/xe/xe_gt_sriov_vf_types.h
>> index a57f13b5afcd..6af219b0eb1e 100644
>> --- a/drivers/gpu/drm/xe/xe_gt_sriov_vf_types.h
>> +++ b/drivers/gpu/drm/xe/xe_gt_sriov_vf_types.h
>> @@ -65,6 +65,8 @@ struct xe_gt_sriov_vf_runtime {
>> /** @regs.value: register value. */
>> u32 value;
>> } *regs;
>> + /** @ggtt_shift: difference in ggtt_base on last migration */
>> + s64 ggtt_shift;
> by 'VF runtime data' we meant here the missing HW data obtained at
> _runtime_ from the GuC/PF (see "runtime-regs")
>
> this 'shift' is more like a migration specific data and doesn't really
> fit here, so better define a separate struct for it
since it's now part of getting config, will add it there.
>
>> };
>>
>> /**
>> diff --git a/drivers/gpu/drm/xe/xe_guc_ct.c b/drivers/gpu/drm/xe/xe_guc_ct.c
>> index 7eb175a0b874..119f4627a6d5 100644
>> --- a/drivers/gpu/drm/xe/xe_guc_ct.c
>> +++ b/drivers/gpu/drm/xe/xe_guc_ct.c
>> @@ -84,6 +84,8 @@ struct g2h_fence {
>> bool done;
>> };
>>
>> +#define make_u64(hi, lo) ((u64)((u64)(u32)(hi) << 32 | (u32)(lo)))
>> +
>> static void g2h_fence_init(struct g2h_fence *g2h_fence, u32 *response_buffer)
>> {
>> g2h_fence->response_buffer = response_buffer;
>> @@ -1620,6 +1622,150 @@ static void g2h_worker_func(struct work_struct *w)
>> receive_g2h(ct);
>> }
>>
>> +/*
>> + * ct_update_addresses_in_message - Shift any GGTT addresses within
>> + * a single message left within CTB from before post-migration recovery.
>> + * @ct: pointer to CT struct of the target GuC
>> + * @cmds: iomap buffer containing CT messages
>> + * @head: start of the target message within the buffer
>> + * @len: length of the target message
>> + * @size: size of the commands buffer
>> + * @shift: the address shift to be added to each GGTT reference
>> + */
>> +static void ct_update_addresses_in_message(struct xe_guc_ct *ct,
>> + struct iosys_map *cmds, u32 head,
>> + u32 len, u32 size, s64 shift)
>> +{
>> + struct xe_device *xe = ct_to_xe(ct);
>> + u32 action, i, n;
>> + u32 msg[2];
>> + u64 offset;
>> +
>> +#define read32(o, p) \
>> +do { \
>> + xe_map_memcpy_from(xe, msg, cmds, (head + p) * sizeof(u32), \
>> + 1 * sizeof(u32)); \
>> + o = msg[0]; \
>> +} while (0)
>> +#define fixup64(p) \
>> +do { \
>> + xe_map_memcpy_from(xe, msg, cmds, (head + p) * sizeof(u32), \
>> + 2 * sizeof(u32)); \
> what about buffer wrap?
I don't see any implementation of ability to wrap with cutting a message
in half. Rather, h2g_write() fills remaining area with null messages.
No special support is needed.
>
>> + offset = make_u64(msg[1], msg[0]); \
>> + offset += shift; \
>> + msg[0] = lower_32_bits(offset); \
>> + msg[1] = upper_32_bits(offset); \
>> + xe_map_memcpy_to(xe, cmds, (head + p) * sizeof(u32), msg, 2 * sizeof(u32)); \
>> +} while (0)
> those macros are quite ugly and violating many rules
> maybe they should be converted into inlines?
will do.
>
>> +
>> + xe_map_memcpy_from(xe, msg, cmds, head * sizeof(u32),
>> + 1 * sizeof(u32));
>> + action = FIELD_GET(GUC_HXG_REQUEST_MSG_0_ACTION, msg[0]);
>> + switch (action) {
>> + case XE_GUC_ACTION_REGISTER_CONTEXT:
>> + case XE_GUC_ACTION_REGISTER_CONTEXT_MULTI_LRC:
>> + /* field wq_desc */
>> + fixup64(5);
>> + /* field wq_base */
>> + fixup64(7);
>> + if (action == XE_GUC_ACTION_REGISTER_CONTEXT_MULTI_LRC) {
>> + /* field number_children */
>> + read32(n, 10);
>> + /* field hwlrca and child lrcas */
>> + for (i = 0; i < n; i++)
>> + fixup64(11 + 2 * i);
>> + } else {
>> + /* field hwlrca */
>> + fixup64(10);
>> + }
>> + break;
>> + default:
>> + break;
>> + }
>> +#undef fixup64
>> +#undef read32
>> +}
>> +
>> +static int ct_update_addresses_in_buffer(struct xe_guc_ct *ct,
>> + struct guc_ctb *h2g,
>> + s64 shift, u32 *mhead, s32 avail)
>> +{
>> + struct xe_device *xe = ct_to_xe(ct);
>> + u32 head = *mhead;
>> + u32 size = h2g->info.size;
>> + u32 msg[1];
>> + u32 len;
>> +
>> + /* Read header */
>> + xe_map_memcpy_from(xe, msg, &h2g->cmds, sizeof(u32) * head,
>> + sizeof(u32));
>> + len = FIELD_GET(GUC_CTB_MSG_0_NUM_DWORDS, msg[0]) + GUC_CTB_MSG_MIN_LEN;
> is it ok to access here all this CTB data without any lock?
Yes, it is ok. The lack of lock is explained in patch comment.
>> +
>> + if (unlikely(len > (u32)avail)) {
>> + struct xe_gt *gt = ct_to_gt(ct);
>> +
>> + xe_gt_err(gt, "H2G channel broken on read, avail=%d, len=%d, fixups skipped\n",
>> + avail, len);
>> + return 0;
> shouldn't we return some -errno to correctly report failure to the caller?
Why would we do this? What error handling would we do?
We are within a delicate, unusual situation during the recovery. The
goal of migration recovery is clearly stated, and it is not verification
of the state of buffers.
If that condition was reached, then:
* Maybe we've got double migration at a very specific time and we're
operating on a living GuC. In that case, we should just back off and not
touch it. (low probability of hitting that precise timings)
* Maybe the CTB was broken before migration, or got broken while
restoring - the post-migration recovery is not a place to react on that.
(low probability, as we check the head and tail before)
* Maybe our CTB parser is imperfect, or our locking will be imperfect
(or more likely, it will regress due to unrelated changes) - in that
case we also should back off.
In general, if we've failed with CTB fixups, it doesn't mean the GFX is
unusable. There is actually much greater chance that no outgoing message
required fixups - most workloads are not registering contexts every
second. There is no point in propagating errors which do not break the
recovery. And if something is broken, then we should have mechanisms
within driver to deal with that. Post-migration recovery is not for that.
>
>> + }
>> +
>> + head = (head + 1) % size;
>> + ct_update_addresses_in_message(ct, &h2g->cmds, head, len - 1, size, shift);
>> + *mhead = (head + len - 1) % size;
>> +
>> + return avail - len;
>> +}
>> +
>> +/**
>> + * xe_guc_ct_update_addresses - Shifts any GGTT addresses left
>> + * within CTB from before post-migration recovery.
> "Fixup any pending H2G CTB messages by updating GGTT offsets in their
> payloads" ?
ok, will switch to this.
>
>> + * @ct: pointer to CT struct of the target GuC
>> + */
>> +int xe_guc_ct_update_addresses(struct xe_guc_ct *ct)
>> +{
>> + struct xe_guc *guc = ct_to_guc(ct);
>> + struct xe_gt *gt = guc_to_gt(guc);
>> + struct xe_gt_sriov_vf_runtime *runtime = >->sriov.vf.runtime;
> please provide ggtt-shift explicitly to avoid direct access to the VF
> data from the CT code
will do.
>
>> + struct guc_ctb *h2g = &ct->ctbs.h2g;
>> + u32 head = h2g->info.head;
>> + u32 tail = READ_ONCE(h2g->info.tail);
>> + u32 size = h2g->info.size;
>> + s32 avail;
>> + s64 ggtt_shift;
>> +
>> + if (unlikely(h2g->info.broken))
>> + return -EPIPE;
>> +
>> + XE_WARN_ON(head > size);
> use xe_gt_WARN() or xe_gt_assert() instead - depends on what exactly do
> you want to check here
ack
>
>> +
>> + if (unlikely(tail >= size)) {
>> + xe_gt_err(gt, "H2G channel has Invalid tail offset (%u >= %u)\n",
> s/Invalid/invalid
ok
>> + tail, size);
>> + goto corrupted;
>> + }
>> +
>> + avail = tail - head;
>> +
>> + /* beware of buffer wrap case */
>> + if (unlikely(avail < 0))
>> + avail += size;
>> + xe_gt_dbg(gt, "available %d (%u:%u:%u)\n", avail, head, tail, size);
>> + XE_WARN_ON(avail < 0);
>> +
>> + ggtt_shift = runtime->ggtt_shift;
>> +
>> + while (avail > 0)
>> + avail = ct_update_addresses_in_buffer(ct, h2g, ggtt_shift, &head, avail);
>> +
>> + return 0;
>> +
>> +corrupted:
>> + xe_gt_err(gt, "Corrupted descriptor head=%u tail=%u\n",
>> + head, tail);
>> + h2g->info.broken = true;
>> + return -EPIPE;
>> +}
>> +
>> static struct xe_guc_ct_snapshot *guc_ct_snapshot_alloc(struct xe_guc_ct *ct, bool atomic,
>> bool want_ctb)
>> {
>> diff --git a/drivers/gpu/drm/xe/xe_guc_ct.h b/drivers/gpu/drm/xe/xe_guc_ct.h
>> index 82c4ae458dda..6b04fd4b1e03 100644
>> --- a/drivers/gpu/drm/xe/xe_guc_ct.h
>> +++ b/drivers/gpu/drm/xe/xe_guc_ct.h
>> @@ -22,6 +22,8 @@ void xe_guc_ct_snapshot_print(struct xe_guc_ct_snapshot *snapshot, struct drm_pr
>> void xe_guc_ct_snapshot_free(struct xe_guc_ct_snapshot *snapshot);
>> void xe_guc_ct_print(struct xe_guc_ct *ct, struct drm_printer *p, bool want_ctb);
>>
>> +int xe_guc_ct_update_addresses(struct xe_guc_ct *ct);
>> +
>> static inline bool xe_guc_ct_enabled(struct xe_guc_ct *ct)
>> {
>> return ct->state == XE_GUC_CT_STATE_ENABLED;
>> diff --git a/drivers/gpu/drm/xe/xe_sriov_vf.c b/drivers/gpu/drm/xe/xe_sriov_vf.c
>> index 5bcd55999e0e..08c789ebfa18 100644
>> --- a/drivers/gpu/drm/xe/xe_sriov_vf.c
>> +++ b/drivers/gpu/drm/xe/xe_sriov_vf.c
>> @@ -10,6 +10,7 @@
>> #include "xe_gt.h"
>> #include "xe_gt_sriov_printk.h"
>> #include "xe_gt_sriov_vf.h"
>> +#include "xe_guc_ct.h"
>> #include "xe_pm.h"
>> #include "xe_sriov.h"
>> #include "xe_sriov_printk.h"
>> @@ -158,6 +159,15 @@ static int vf_post_migration_requery_guc(struct xe_device *xe)
>> return ret;
>> }
>>
>> +static void vf_post_migration_fixup_ctb(struct xe_device *xe)
>> +{
>> + struct xe_gt *gt;
>> + unsigned int id;
>> +
>> + for_each_gt(gt, xe, id)
>> + xe_guc_ct_update_addresses(>->uc.guc.ct);
>> +}
>> +
>> /*
>> * vf_post_migration_imminent - Check if post-restore recovery is coming.
>> * @xe: the &xe_device struct instance
>> @@ -217,6 +227,8 @@ static void vf_post_migration_recovery(struct xe_device *xe)
>>
>> vf_post_migration_fixup_ggtt_nodes(xe);
>> /* FIXME: add the recovery steps */
>> + vf_post_migration_fixup_ctb(xe);
>> +
> why this extra separation line?
it separates fixups from finalization. Similarly, there's a line at
start of fixups.
-Tomasz
>> vf_post_migration_notify_resfix_done(xe);
>> xe_pm_runtime_put(xe);
>> drm_notice(&xe->drm, "migration recovery ended\n");
^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2024-11-23 2:49 UTC | newest]
Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-11-16 2:12 [PATCH v2 0/3] drm/xe/vf: Post-migration recovery of GGTT nodes and CTB Tomasz Lis
2024-11-16 2:12 ` [PATCH v2 1/3] drm/drm_mm: Safe macro for iterating through nodes in range Tomasz Lis
2024-11-16 18:29 ` Michal Wajdeczko
2024-11-16 2:12 ` [PATCH v2 2/3] drm/xe/sriov: Shifting GGTT area post migration Tomasz Lis
2024-11-16 19:29 ` Michal Wajdeczko
2024-11-23 2:38 ` Lis, Tomasz
2024-11-16 2:12 ` [PATCH v2 3/3] drm/xe/vf: Fixup CTB send buffer messages after migration Tomasz Lis
2024-11-16 20:01 ` Michal Wajdeczko
2024-11-23 2:49 ` Lis, Tomasz
2024-11-16 2:17 ` ✓ CI.Patch_applied: success for drm/xe/vf: Post-migration recovery of GGTT nodes and CTB (rev2) Patchwork
2024-11-16 2:17 ` ✗ CI.checkpatch: warning " Patchwork
2024-11-16 2:18 ` ✓ CI.KUnit: success " Patchwork
2024-11-16 2:36 ` ✓ CI.Build: " Patchwork
2024-11-16 2:36 ` ✗ CI.Hooks: failure " Patchwork
2024-11-16 2:38 ` ✗ CI.checksparse: warning " Patchwork
2024-11-16 2:57 ` ✓ CI.BAT: success " Patchwork
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox