Skip to content

Commit 13daf53

Browse files
committed
Merge tag 'drm-misc-next-fixes-2023-02-21' of git://anongit.freedesktop.org/drm/drm-misc into drm-next
Short summary of fixes pull: Fixes GEM SHMEM locking and generic fbdev hotplugging. Constifies dma_buf kobj type. Signed-off-by: Dave Airlie <[email protected]> From: Thomas Zimmermann <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/Y/S6tu3gdQ0VizR+@linux-uq9g
2 parents 5582f3c + 3fb1f62 commit 13daf53

File tree

12 files changed

+52
-24
lines changed

12 files changed

+52
-24
lines changed

drivers/dma-buf/dma-buf-sysfs-stats.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ static void dma_buf_sysfs_release(struct kobject *kobj)
112112
kfree(sysfs_entry);
113113
}
114114

115-
static struct kobj_type dma_buf_ktype = {
115+
static const struct kobj_type dma_buf_ktype = {
116116
.sysfs_ops = &dma_buf_stats_sysfs_ops,
117117
.release = dma_buf_sysfs_release,
118118
.default_groups = dma_buf_stats_default_groups,

drivers/gpu/drm/armada/armada_fbdev.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ int armada_fbdev_init(struct drm_device *dev)
147147
err_fb_setup:
148148
drm_fb_helper_fini(fbh);
149149
err_fb_helper:
150+
drm_fb_helper_unprepare(fbh);
150151
priv->fbdev = NULL;
151152
return ret;
152153
}
@@ -164,6 +165,8 @@ void armada_fbdev_fini(struct drm_device *dev)
164165
if (fbh->fb)
165166
fbh->fb->funcs->destroy(fbh->fb);
166167

168+
drm_fb_helper_unprepare(fbh);
169+
167170
priv->fbdev = NULL;
168171
}
169172
}

drivers/gpu/drm/drm_fb_helper.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -590,8 +590,6 @@ void drm_fb_helper_fini(struct drm_fb_helper *fb_helper)
590590
}
591591
mutex_unlock(&kernel_fb_helper_lock);
592592

593-
drm_fb_helper_unprepare(fb_helper);
594-
595593
if (!fb_helper->client.funcs)
596594
drm_client_release(&fb_helper->client);
597595
}

drivers/gpu/drm/drm_fbdev_generic.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@ static void drm_fbdev_fb_destroy(struct fb_info *info)
6565

6666
drm_client_framebuffer_delete(fb_helper->buffer);
6767
drm_client_release(&fb_helper->client);
68+
69+
drm_fb_helper_unprepare(fb_helper);
6870
kfree(fb_helper);
6971
}
7072

drivers/gpu/drm/drm_gem_shmem_helper.c

Lines changed: 34 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -678,23 +678,7 @@ struct sg_table *drm_gem_shmem_get_sg_table(struct drm_gem_shmem_object *shmem)
678678
}
679679
EXPORT_SYMBOL_GPL(drm_gem_shmem_get_sg_table);
680680

681-
/**
682-
* drm_gem_shmem_get_pages_sgt - Pin pages, dma map them, and return a
683-
* scatter/gather table for a shmem GEM object.
684-
* @shmem: shmem GEM object
685-
*
686-
* This function returns a scatter/gather table suitable for driver usage. If
687-
* the sg table doesn't exist, the pages are pinned, dma-mapped, and a sg
688-
* table created.
689-
*
690-
* This is the main function for drivers to get at backing storage, and it hides
691-
* and difference between dma-buf imported and natively allocated objects.
692-
* drm_gem_shmem_get_sg_table() should not be directly called by drivers.
693-
*
694-
* Returns:
695-
* A pointer to the scatter/gather table of pinned pages or errno on failure.
696-
*/
697-
struct sg_table *drm_gem_shmem_get_pages_sgt(struct drm_gem_shmem_object *shmem)
681+
static struct sg_table *drm_gem_shmem_get_pages_sgt_locked(struct drm_gem_shmem_object *shmem)
698682
{
699683
struct drm_gem_object *obj = &shmem->base;
700684
int ret;
@@ -705,7 +689,7 @@ struct sg_table *drm_gem_shmem_get_pages_sgt(struct drm_gem_shmem_object *shmem)
705689

706690
WARN_ON(obj->import_attach);
707691

708-
ret = drm_gem_shmem_get_pages(shmem);
692+
ret = drm_gem_shmem_get_pages_locked(shmem);
709693
if (ret)
710694
return ERR_PTR(ret);
711695

@@ -727,10 +711,40 @@ struct sg_table *drm_gem_shmem_get_pages_sgt(struct drm_gem_shmem_object *shmem)
727711
sg_free_table(sgt);
728712
kfree(sgt);
729713
err_put_pages:
730-
drm_gem_shmem_put_pages(shmem);
714+
drm_gem_shmem_put_pages_locked(shmem);
731715
return ERR_PTR(ret);
732716
}
733-
EXPORT_SYMBOL_GPL(drm_gem_shmem_get_pages_sgt);
717+
718+
/**
719+
* drm_gem_shmem_get_pages_sgt - Pin pages, dma map them, and return a
720+
* scatter/gather table for a shmem GEM object.
721+
* @shmem: shmem GEM object
722+
*
723+
* This function returns a scatter/gather table suitable for driver usage. If
724+
* the sg table doesn't exist, the pages are pinned, dma-mapped, and a sg
725+
* table created.
726+
*
727+
* This is the main function for drivers to get at backing storage, and it hides
728+
* and difference between dma-buf imported and natively allocated objects.
729+
* drm_gem_shmem_get_sg_table() should not be directly called by drivers.
730+
*
731+
* Returns:
732+
* A pointer to the scatter/gather table of pinned pages or errno on failure.
733+
*/
734+
struct sg_table *drm_gem_shmem_get_pages_sgt(struct drm_gem_shmem_object *shmem)
735+
{
736+
int ret;
737+
struct sg_table *sgt;
738+
739+
ret = mutex_lock_interruptible(&shmem->pages_lock);
740+
if (ret)
741+
return ERR_PTR(ret);
742+
sgt = drm_gem_shmem_get_pages_sgt_locked(shmem);
743+
mutex_unlock(&shmem->pages_lock);
744+
745+
return sgt;
746+
}
747+
EXPORT_SYMBOL(drm_gem_shmem_get_pages_sgt);
734748

735749
/**
736750
* drm_gem_shmem_prime_import_sg_table - Produce a shmem GEM object from

drivers/gpu/drm/exynos/exynos_drm_fbdev.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,8 +183,8 @@ int exynos_drm_fbdev_init(struct drm_device *dev)
183183

184184
err_setup:
185185
drm_fb_helper_fini(helper);
186-
187186
err_init:
187+
drm_fb_helper_unprepare(helper);
188188
private->fb_helper = NULL;
189189
kfree(fbdev);
190190

@@ -219,6 +219,7 @@ void exynos_drm_fbdev_fini(struct drm_device *dev)
219219
fbdev = to_exynos_fbdev(private->fb_helper);
220220

221221
exynos_drm_fbdev_destroy(dev, private->fb_helper);
222+
drm_fb_helper_unprepare(private->fb_helper);
222223
kfree(fbdev);
223224
private->fb_helper = NULL;
224225
}

drivers/gpu/drm/gma500/framebuffer.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -427,6 +427,7 @@ int psb_fbdev_init(struct drm_device *dev)
427427
fini:
428428
drm_fb_helper_fini(fb_helper);
429429
free:
430+
drm_fb_helper_unprepare(fb_helper);
430431
kfree(fb_helper);
431432
return ret;
432433
}
@@ -439,6 +440,7 @@ static void psb_fbdev_fini(struct drm_device *dev)
439440
return;
440441

441442
psb_fbdev_destroy(dev, dev_priv->fb_helper);
443+
drm_fb_helper_unprepare(dev_priv->fb_helper);
442444
kfree(dev_priv->fb_helper);
443445
dev_priv->fb_helper = NULL;
444446
}

drivers/gpu/drm/i915/display/intel_fbdev.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -340,6 +340,7 @@ static void intel_fbdev_destroy(struct intel_fbdev *ifbdev)
340340
if (ifbdev->fb)
341341
drm_framebuffer_remove(&ifbdev->fb->base);
342342

343+
drm_fb_helper_unprepare(&ifbdev->helper);
343344
kfree(ifbdev);
344345
}
345346

drivers/gpu/drm/msm/msm_fbdev.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,7 @@ struct drm_fb_helper *msm_fbdev_init(struct drm_device *dev)
170170
fini:
171171
drm_fb_helper_fini(helper);
172172
fail:
173+
drm_fb_helper_unprepare(helper);
173174
kfree(fbdev);
174175
return NULL;
175176
}
@@ -196,6 +197,7 @@ void msm_fbdev_free(struct drm_device *dev)
196197
drm_framebuffer_remove(fbdev->fb);
197198
}
198199

200+
drm_fb_helper_unprepare(helper);
199201
kfree(fbdev);
200202

201203
priv->fbdev = NULL;

drivers/gpu/drm/omapdrm/omap_fbdev.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,7 @@ void omap_fbdev_init(struct drm_device *dev)
256256
fini:
257257
drm_fb_helper_fini(helper);
258258
fail:
259+
drm_fb_helper_unprepare(helper);
259260
kfree(fbdev);
260261

261262
dev_warn(dev->dev, "omap_fbdev_init failed\n");
@@ -286,6 +287,7 @@ void omap_fbdev_fini(struct drm_device *dev)
286287
if (fbdev->fb)
287288
drm_framebuffer_remove(fbdev->fb);
288289

290+
drm_fb_helper_unprepare(helper);
289291
kfree(fbdev);
290292

291293
priv->fbdev = NULL;

0 commit comments

Comments
 (0)