Skip to content

Commit 7391c28

Browse files
committed
drm/msm: Remove vma use tracking
This was not strictly necessary, as page unpinning (ie. shrinker) only cares about the resv. It did give us some extra sanity checking for userspace controlled iova, and was useful to catch issues on kernel and userspace side when enabling userspace iova. But if userspace screws this up, it just corrupts it's own gpu buffers and/or gets iova faults. So we can just let userspace shoot it's own foot and drop the extra per- buffer SUBMIT overhead. Signed-off-by: Rob Clark <robdclark@chromium.org> Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch> Patchwork: https://patchwork.freedesktop.org/patch/551023/
1 parent fc896cf commit 7391c28

File tree

5 files changed

+9
-96
lines changed

5 files changed

+9
-96
lines changed

drivers/gpu/drm/msm/msm_gem.c

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -607,9 +607,6 @@ static int clear_iova(struct drm_gem_object *obj,
607607
if (!vma)
608608
return 0;
609609

610-
if (msm_gem_vma_inuse(vma))
611-
return -EBUSY;
612-
613610
msm_gem_vma_purge(vma);
614611
msm_gem_vma_close(vma);
615612
del_vma(vma);
@@ -660,7 +657,6 @@ void msm_gem_unpin_iova(struct drm_gem_object *obj,
660657
msm_gem_lock(obj);
661658
vma = lookup_vma(obj, aspace);
662659
if (!GEM_WARN_ON(!vma)) {
663-
msm_gem_vma_unpin(vma);
664660
msm_gem_unpin_locked(obj);
665661
}
666662
msm_gem_unlock(obj);
@@ -991,11 +987,10 @@ void msm_gem_describe(struct drm_gem_object *obj, struct seq_file *m,
991987
} else {
992988
name = comm = NULL;
993989
}
994-
seq_printf(m, " [%s%s%s: aspace=%p, %08llx,%s,inuse=%d]",
990+
seq_printf(m, " [%s%s%s: aspace=%p, %08llx,%s]",
995991
name, comm ? ":" : "", comm ? comm : "",
996992
vma->aspace, vma->iova,
997-
vma->mapped ? "mapped" : "unmapped",
998-
msm_gem_vma_inuse(vma));
993+
vma->mapped ? "mapped" : "unmapped");
999994
kfree(comm);
1000995
}
1001996

drivers/gpu/drm/msm/msm_gem.h

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -59,24 +59,16 @@ struct msm_fence_context;
5959

6060
struct msm_gem_vma {
6161
struct drm_mm_node node;
62-
spinlock_t lock;
6362
uint64_t iova;
6463
struct msm_gem_address_space *aspace;
6564
struct list_head list; /* node in msm_gem_object::vmas */
6665
bool mapped;
67-
int inuse;
68-
uint32_t fence_mask;
69-
uint32_t fence[MSM_GPU_MAX_RINGS];
70-
struct msm_fence_context *fctx[MSM_GPU_MAX_RINGS];
7166
};
7267

7368
struct msm_gem_vma *msm_gem_vma_new(struct msm_gem_address_space *aspace);
7469
int msm_gem_vma_init(struct msm_gem_vma *vma, int size,
7570
u64 range_start, u64 range_end);
76-
bool msm_gem_vma_inuse(struct msm_gem_vma *vma);
7771
void msm_gem_vma_purge(struct msm_gem_vma *vma);
78-
void msm_gem_vma_unpin(struct msm_gem_vma *vma);
79-
void msm_gem_vma_unpin_fenced(struct msm_gem_vma *vma, struct msm_fence_context *fctx);
8072
int msm_gem_vma_map(struct msm_gem_vma *vma, int prot, struct sg_table *sgt, int size);
8173
void msm_gem_vma_close(struct msm_gem_vma *vma);
8274

@@ -298,15 +290,13 @@ struct msm_gem_submit {
298290
/* make sure these don't conflict w/ MSM_SUBMIT_BO_x */
299291
#define BO_VALID 0x8000 /* is current addr in cmdstream correct/valid? */
300292
#define BO_LOCKED 0x4000 /* obj lock is held */
301-
#define BO_OBJ_PINNED 0x2000 /* obj (pages) is pinned and on active list */
302-
#define BO_VMA_PINNED 0x1000 /* vma (virtual address) is pinned */
293+
#define BO_PINNED 0x2000 /* obj (pages) is pinned and on active list */
303294
uint32_t flags;
304295
union {
305296
struct drm_gem_object *obj;
306297
uint32_t handle;
307298
};
308299
uint64_t iova;
309-
struct msm_gem_vma *vma;
310300
} bos[];
311301
};
312302

drivers/gpu/drm/msm/msm_gem_submit.c

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -261,10 +261,7 @@ static void submit_cleanup_bo(struct msm_gem_submit *submit, int i,
261261
*/
262262
submit->bos[i].flags &= ~cleanup_flags;
263263

264-
if (flags & BO_VMA_PINNED)
265-
msm_gem_vma_unpin(submit->bos[i].vma);
266-
267-
if (flags & BO_OBJ_PINNED)
264+
if (flags & BO_PINNED)
268265
msm_gem_unpin_locked(obj);
269266

270267
if (flags & BO_LOCKED)
@@ -273,7 +270,7 @@ static void submit_cleanup_bo(struct msm_gem_submit *submit, int i,
273270

274271
static void submit_unlock_unpin_bo(struct msm_gem_submit *submit, int i)
275272
{
276-
unsigned cleanup_flags = BO_VMA_PINNED | BO_OBJ_PINNED | BO_LOCKED;
273+
unsigned cleanup_flags = BO_PINNED | BO_LOCKED;
277274
submit_cleanup_bo(submit, i, cleanup_flags);
278275

279276
if (!(submit->bos[i].flags & BO_VALID))
@@ -404,9 +401,6 @@ static int submit_pin_objects(struct msm_gem_submit *submit)
404401
if (ret)
405402
break;
406403

407-
submit->bos[i].flags |= BO_VMA_PINNED;
408-
submit->bos[i].vma = vma;
409-
410404
if (vma->iova == submit->bos[i].iova) {
411405
submit->bos[i].flags |= BO_VALID;
412406
} else {
@@ -427,7 +421,7 @@ static int submit_pin_objects(struct msm_gem_submit *submit)
427421
mutex_lock(&priv->lru.lock);
428422
for (i = 0; i < submit->nr_bos; i++) {
429423
msm_gem_pin_obj_locked(submit->bos[i].obj);
430-
submit->bos[i].flags |= BO_OBJ_PINNED;
424+
submit->bos[i].flags |= BO_PINNED;
431425
}
432426
mutex_unlock(&priv->lru.lock);
433427

@@ -554,7 +548,7 @@ static void submit_cleanup(struct msm_gem_submit *submit, bool error)
554548
unsigned i;
555549

556550
if (error)
557-
cleanup_flags |= BO_VMA_PINNED | BO_OBJ_PINNED;
551+
cleanup_flags |= BO_PINNED;
558552

559553
for (i = 0; i < submit->nr_bos; i++) {
560554
struct drm_gem_object *obj = submit->bos[i].obj;

drivers/gpu/drm/msm/msm_gem_vma.c

Lines changed: 1 addition & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -38,41 +38,12 @@ msm_gem_address_space_get(struct msm_gem_address_space *aspace)
3838
return aspace;
3939
}
4040

41-
bool msm_gem_vma_inuse(struct msm_gem_vma *vma)
42-
{
43-
bool ret = true;
44-
45-
spin_lock(&vma->lock);
46-
47-
if (vma->inuse > 0)
48-
goto out;
49-
50-
while (vma->fence_mask) {
51-
unsigned idx = ffs(vma->fence_mask) - 1;
52-
53-
if (!msm_fence_completed(vma->fctx[idx], vma->fence[idx]))
54-
goto out;
55-
56-
vma->fence_mask &= ~BIT(idx);
57-
}
58-
59-
ret = false;
60-
61-
out:
62-
spin_unlock(&vma->lock);
63-
64-
return ret;
65-
}
66-
6741
/* Actually unmap memory for the vma */
6842
void msm_gem_vma_purge(struct msm_gem_vma *vma)
6943
{
7044
struct msm_gem_address_space *aspace = vma->aspace;
7145
unsigned size = vma->node.size;
7246

73-
/* Print a message if we try to purge a vma in use */
74-
GEM_WARN_ON(msm_gem_vma_inuse(vma));
75-
7647
/* Don't do anything if the memory isn't mapped */
7748
if (!vma->mapped)
7849
return;
@@ -82,33 +53,6 @@ void msm_gem_vma_purge(struct msm_gem_vma *vma)
8253
vma->mapped = false;
8354
}
8455

85-
static void vma_unpin_locked(struct msm_gem_vma *vma)
86-
{
87-
if (GEM_WARN_ON(!vma->inuse))
88-
return;
89-
if (!GEM_WARN_ON(!vma->iova))
90-
vma->inuse--;
91-
}
92-
93-
/* Remove reference counts for the mapping */
94-
void msm_gem_vma_unpin(struct msm_gem_vma *vma)
95-
{
96-
spin_lock(&vma->lock);
97-
vma_unpin_locked(vma);
98-
spin_unlock(&vma->lock);
99-
}
100-
101-
/* Replace pin reference with fence: */
102-
void msm_gem_vma_unpin_fenced(struct msm_gem_vma *vma, struct msm_fence_context *fctx)
103-
{
104-
spin_lock(&vma->lock);
105-
vma->fctx[fctx->index] = fctx;
106-
vma->fence[fctx->index] = fctx->last_fence;
107-
vma->fence_mask |= BIT(fctx->index);
108-
vma_unpin_locked(vma);
109-
spin_unlock(&vma->lock);
110-
}
111-
11256
/* Map and pin vma: */
11357
int
11458
msm_gem_vma_map(struct msm_gem_vma *vma, int prot,
@@ -120,11 +64,6 @@ msm_gem_vma_map(struct msm_gem_vma *vma, int prot,
12064
if (GEM_WARN_ON(!vma->iova))
12165
return -EINVAL;
12266

123-
/* Increase the usage counter */
124-
spin_lock(&vma->lock);
125-
vma->inuse++;
126-
spin_unlock(&vma->lock);
127-
12867
if (vma->mapped)
12968
return 0;
13069

@@ -146,9 +85,6 @@ msm_gem_vma_map(struct msm_gem_vma *vma, int prot,
14685

14786
if (ret) {
14887
vma->mapped = false;
149-
spin_lock(&vma->lock);
150-
vma->inuse--;
151-
spin_unlock(&vma->lock);
15288
}
15389

15490
return ret;
@@ -159,7 +95,7 @@ void msm_gem_vma_close(struct msm_gem_vma *vma)
15995
{
16096
struct msm_gem_address_space *aspace = vma->aspace;
16197

162-
GEM_WARN_ON(msm_gem_vma_inuse(vma) || vma->mapped);
98+
GEM_WARN_ON(vma->mapped);
16399

164100
spin_lock(&aspace->lock);
165101
if (vma->iova)
@@ -179,7 +115,6 @@ struct msm_gem_vma *msm_gem_vma_new(struct msm_gem_address_space *aspace)
179115
if (!vma)
180116
return NULL;
181117

182-
spin_lock_init(&vma->lock);
183118
vma->aspace = aspace;
184119

185120
return vma;

drivers/gpu/drm/msm/msm_ringbuffer.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,8 @@ static struct dma_fence *msm_job_run(struct drm_sched_job *job)
2626
for (i = 0; i < submit->nr_bos; i++) {
2727
struct drm_gem_object *obj = submit->bos[i].obj;
2828

29-
msm_gem_vma_unpin_fenced(submit->bos[i].vma, fctx);
3029
msm_gem_unpin_active(obj);
31-
submit->bos[i].flags &= ~(BO_VMA_PINNED | BO_OBJ_PINNED);
30+
submit->bos[i].flags &= ~BO_PINNED;
3231
}
3332

3433
mutex_unlock(&priv->lru.lock);

0 commit comments

Comments
 (0)