Skip to content

Commit 4dba1fd

Browse files
committed
Merge tag 'drm-xe-fixes-2024-12-12' of https://gitlab.freedesktop.org/drm/xe/kernel into drm-fixes
- Fix a KUNIT test error message (Mirsad Todorovac) - Fix an invalidation fence PM ref leak (Daniele) - Fix a register pool UAF (Lucas) Signed-off-by: Dave Airlie <[email protected]> From: Thomas Hellstrom <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/Z1s5elHXOyeIHnE0@fedora
2 parents c98f9ab + d7b0286 commit 4dba1fd

File tree

6 files changed

+18
-35
lines changed

6 files changed

+18
-35
lines changed

drivers/gpu/drm/xe/tests/xe_migrate.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -224,8 +224,8 @@ static void xe_migrate_sanity_test(struct xe_migrate *m, struct kunit *test)
224224
XE_BO_FLAG_VRAM_IF_DGFX(tile) |
225225
XE_BO_FLAG_PINNED);
226226
if (IS_ERR(tiny)) {
227-
KUNIT_FAIL(test, "Failed to allocate fake pt: %li\n",
228-
PTR_ERR(pt));
227+
KUNIT_FAIL(test, "Failed to allocate tiny fake pt: %li\n",
228+
PTR_ERR(tiny));
229229
goto free_pt;
230230
}
231231

drivers/gpu/drm/xe/xe_gt_tlb_invalidation.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,14 @@ invalidation_fence_signal(struct xe_device *xe, struct xe_gt_tlb_invalidation_fe
6565
__invalidation_fence_signal(xe, fence);
6666
}
6767

68+
void xe_gt_tlb_invalidation_fence_signal(struct xe_gt_tlb_invalidation_fence *fence)
69+
{
70+
if (WARN_ON_ONCE(!fence->gt))
71+
return;
72+
73+
__invalidation_fence_signal(gt_to_xe(fence->gt), fence);
74+
}
75+
6876
static void xe_gt_tlb_fence_timeout(struct work_struct *work)
6977
{
7078
struct xe_gt *gt = container_of(work, struct xe_gt,

drivers/gpu/drm/xe/xe_gt_tlb_invalidation.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ int xe_guc_tlb_invalidation_done_handler(struct xe_guc *guc, u32 *msg, u32 len);
2828
void xe_gt_tlb_invalidation_fence_init(struct xe_gt *gt,
2929
struct xe_gt_tlb_invalidation_fence *fence,
3030
bool stack);
31+
void xe_gt_tlb_invalidation_fence_signal(struct xe_gt_tlb_invalidation_fence *fence);
3132

3233
static inline void
3334
xe_gt_tlb_invalidation_fence_wait(struct xe_gt_tlb_invalidation_fence *fence)

drivers/gpu/drm/xe/xe_pt.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1333,8 +1333,7 @@ static void invalidation_fence_cb(struct dma_fence *fence,
13331333
queue_work(system_wq, &ifence->work);
13341334
} else {
13351335
ifence->base.base.error = ifence->fence->error;
1336-
dma_fence_signal(&ifence->base.base);
1337-
dma_fence_put(&ifence->base.base);
1336+
xe_gt_tlb_invalidation_fence_signal(&ifence->base);
13381337
}
13391338
dma_fence_put(ifence->fence);
13401339
}

drivers/gpu/drm/xe/xe_reg_sr.c

Lines changed: 6 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -27,46 +27,27 @@
2727
#include "xe_reg_whitelist.h"
2828
#include "xe_rtp_types.h"
2929

30-
#define XE_REG_SR_GROW_STEP_DEFAULT 16
31-
3230
static void reg_sr_fini(struct drm_device *drm, void *arg)
3331
{
3432
struct xe_reg_sr *sr = arg;
33+
struct xe_reg_sr_entry *entry;
34+
unsigned long reg;
35+
36+
xa_for_each(&sr->xa, reg, entry)
37+
kfree(entry);
3538

3639
xa_destroy(&sr->xa);
37-
kfree(sr->pool.arr);
38-
memset(&sr->pool, 0, sizeof(sr->pool));
3940
}
4041

4142
int xe_reg_sr_init(struct xe_reg_sr *sr, const char *name, struct xe_device *xe)
4243
{
4344
xa_init(&sr->xa);
44-
memset(&sr->pool, 0, sizeof(sr->pool));
45-
sr->pool.grow_step = XE_REG_SR_GROW_STEP_DEFAULT;
4645
sr->name = name;
4746

4847
return drmm_add_action_or_reset(&xe->drm, reg_sr_fini, sr);
4948
}
5049
EXPORT_SYMBOL_IF_KUNIT(xe_reg_sr_init);
5150

52-
static struct xe_reg_sr_entry *alloc_entry(struct xe_reg_sr *sr)
53-
{
54-
if (sr->pool.used == sr->pool.allocated) {
55-
struct xe_reg_sr_entry *arr;
56-
57-
arr = krealloc_array(sr->pool.arr,
58-
ALIGN(sr->pool.allocated + 1, sr->pool.grow_step),
59-
sizeof(*arr), GFP_KERNEL);
60-
if (!arr)
61-
return NULL;
62-
63-
sr->pool.arr = arr;
64-
sr->pool.allocated += sr->pool.grow_step;
65-
}
66-
67-
return &sr->pool.arr[sr->pool.used++];
68-
}
69-
7051
static bool compatible_entries(const struct xe_reg_sr_entry *e1,
7152
const struct xe_reg_sr_entry *e2)
7253
{
@@ -112,7 +93,7 @@ int xe_reg_sr_add(struct xe_reg_sr *sr,
11293
return 0;
11394
}
11495

115-
pentry = alloc_entry(sr);
96+
pentry = kmalloc(sizeof(*pentry), GFP_KERNEL);
11697
if (!pentry) {
11798
ret = -ENOMEM;
11899
goto fail;

drivers/gpu/drm/xe/xe_reg_sr_types.h

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,6 @@ struct xe_reg_sr_entry {
2020
};
2121

2222
struct xe_reg_sr {
23-
struct {
24-
struct xe_reg_sr_entry *arr;
25-
unsigned int used;
26-
unsigned int allocated;
27-
unsigned int grow_step;
28-
} pool;
2923
struct xarray xa;
3024
const char *name;
3125

0 commit comments

Comments
 (0)