Skip to content

Commit 61502e3

Browse files
committed
Merge tag 'drm-misc-fixes-2021-01-12' of git://anongit.freedesktop.org/drm/drm-misc into drm-fixes
Short summary of fixes pull: * dma-buf: Fix a memory leak in CMAV heap * drm: Fix format check for legacy pageflips * ttm: Pass correct address to dma_mapping_error(); Use mutex in pool shrinker Signed-off-by: Dave Airlie <airlied@redhat.com> From: Thomas Zimmermann <tzimmermann@suse.de> Link: https://patchwork.freedesktop.org/patch/msgid/X/2iXO4ofFSZ39/v@linux-uq9g
2 parents 7c53f6b + bb52cb0 commit 61502e3

3 files changed

Lines changed: 22 additions & 12 deletions

File tree

drivers/dma-buf/heaps/cma_heap.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,9 @@ static void cma_heap_dma_buf_release(struct dma_buf *dmabuf)
251251
buffer->vaddr = NULL;
252252
}
253253

254+
/* free page list */
255+
kfree(buffer->pages);
256+
/* release memory */
254257
cma_release(cma_heap->cma, buffer->cma_pages, buffer->pagecount);
255258
kfree(buffer);
256259
}

drivers/gpu/drm/drm_plane.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1163,7 +1163,14 @@ int drm_mode_page_flip_ioctl(struct drm_device *dev,
11631163
if (ret)
11641164
goto out;
11651165

1166-
if (old_fb->format != fb->format) {
1166+
/*
1167+
* Only check the FOURCC format code, excluding modifiers. This is
1168+
* enough for all legacy drivers. Atomic drivers have their own
1169+
* checks in their ->atomic_check implementation, which will
1170+
* return -EINVAL if any hw or driver constraint is violated due
1171+
* to modifier changes.
1172+
*/
1173+
if (old_fb->format->format != fb->format->format) {
11671174
DRM_DEBUG_KMS("Page flip is not allowed to change frame buffer format.\n");
11681175
ret = -EINVAL;
11691176
goto out;

drivers/gpu/drm/ttm/ttm_pool.c

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ static struct ttm_pool_type global_uncached[MAX_ORDER];
6666
static struct ttm_pool_type global_dma32_write_combined[MAX_ORDER];
6767
static struct ttm_pool_type global_dma32_uncached[MAX_ORDER];
6868

69-
static spinlock_t shrinker_lock;
69+
static struct mutex shrinker_lock;
7070
static struct list_head shrinker_list;
7171
static struct shrinker mm_shrinker;
7272

@@ -190,7 +190,7 @@ static int ttm_pool_map(struct ttm_pool *pool, unsigned int order,
190190
size_t size = (1ULL << order) * PAGE_SIZE;
191191

192192
addr = dma_map_page(pool->dev, p, 0, size, DMA_BIDIRECTIONAL);
193-
if (dma_mapping_error(pool->dev, **dma_addr))
193+
if (dma_mapping_error(pool->dev, addr))
194194
return -EFAULT;
195195
}
196196

@@ -249,19 +249,19 @@ static void ttm_pool_type_init(struct ttm_pool_type *pt, struct ttm_pool *pool,
249249
spin_lock_init(&pt->lock);
250250
INIT_LIST_HEAD(&pt->pages);
251251

252-
spin_lock(&shrinker_lock);
252+
mutex_lock(&shrinker_lock);
253253
list_add_tail(&pt->shrinker_list, &shrinker_list);
254-
spin_unlock(&shrinker_lock);
254+
mutex_unlock(&shrinker_lock);
255255
}
256256

257257
/* Remove a pool_type from the global shrinker list and free all pages */
258258
static void ttm_pool_type_fini(struct ttm_pool_type *pt)
259259
{
260260
struct page *p, *tmp;
261261

262-
spin_lock(&shrinker_lock);
262+
mutex_lock(&shrinker_lock);
263263
list_del(&pt->shrinker_list);
264-
spin_unlock(&shrinker_lock);
264+
mutex_unlock(&shrinker_lock);
265265

266266
list_for_each_entry_safe(p, tmp, &pt->pages, lru)
267267
ttm_pool_free_page(pt->pool, pt->caching, pt->order, p);
@@ -302,7 +302,7 @@ static unsigned int ttm_pool_shrink(void)
302302
unsigned int num_freed;
303303
struct page *p;
304304

305-
spin_lock(&shrinker_lock);
305+
mutex_lock(&shrinker_lock);
306306
pt = list_first_entry(&shrinker_list, typeof(*pt), shrinker_list);
307307

308308
p = ttm_pool_type_take(pt);
@@ -314,7 +314,7 @@ static unsigned int ttm_pool_shrink(void)
314314
}
315315

316316
list_move_tail(&pt->shrinker_list, &shrinker_list);
317-
spin_unlock(&shrinker_lock);
317+
mutex_unlock(&shrinker_lock);
318318

319319
return num_freed;
320320
}
@@ -564,7 +564,7 @@ int ttm_pool_debugfs(struct ttm_pool *pool, struct seq_file *m)
564564
{
565565
unsigned int i;
566566

567-
spin_lock(&shrinker_lock);
567+
mutex_lock(&shrinker_lock);
568568

569569
seq_puts(m, "\t ");
570570
for (i = 0; i < MAX_ORDER; ++i)
@@ -600,7 +600,7 @@ int ttm_pool_debugfs(struct ttm_pool *pool, struct seq_file *m)
600600
seq_printf(m, "\ntotal\t: %8lu of %8lu\n",
601601
atomic_long_read(&allocated_pages), page_pool_size);
602602

603-
spin_unlock(&shrinker_lock);
603+
mutex_unlock(&shrinker_lock);
604604

605605
return 0;
606606
}
@@ -644,7 +644,7 @@ int ttm_pool_mgr_init(unsigned long num_pages)
644644
if (!page_pool_size)
645645
page_pool_size = num_pages;
646646

647-
spin_lock_init(&shrinker_lock);
647+
mutex_init(&shrinker_lock);
648648
INIT_LIST_HEAD(&shrinker_list);
649649

650650
for (i = 0; i < MAX_ORDER; ++i) {

0 commit comments

Comments
 (0)