Skip to content

Commit 71d9e15

Browse files
committed
Merge tag 'drm-misc-fixes-2026-05-21' of https://gitlab.freedesktop.org/drm/misc/kernel into drm-fixes
Short summary of fixes pull: amdxdna: - remove mmap and export for ubuf bridge: - chipone-icn6211: managed bridge cleanup - lt66121: acquire reset GPIO - megachips: fix clean up on failed IRQ requests gem: - clean up LRU locking v3d: - fix UAF in error code paths - release GEM-object ref on free'd jobs virtio: - use uninterruptible resv locking in plane updates Signed-off-by: Dave Airlie <airlied@redhat.com> From: Thomas Zimmermann <tzimmermann@suse.de> Link: https://patch.msgid.link/20260521071456.GA14644@localhost.localdomain
2 parents aee43aa + 9af1b6e commit 71d9e15

22 files changed

Lines changed: 143 additions & 153 deletions

drivers/accel/amdxdna/amdxdna_gem.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -490,6 +490,9 @@ static struct dma_buf *amdxdna_gem_prime_export(struct drm_gem_object *gobj, int
490490
struct amdxdna_gem_obj *abo = to_xdna_obj(gobj);
491491
DEFINE_DMA_BUF_EXPORT_INFO(exp_info);
492492

493+
if (abo->private_buffer)
494+
return ERR_PTR(-EOPNOTSUPP);
495+
493496
if (abo->dma_buf) {
494497
get_dma_buf(abo->dma_buf);
495498
return abo->dma_buf;
@@ -685,6 +688,7 @@ amdxdna_gem_create_ubuf_object(struct drm_device *dev, struct amdxdna_drm_create
685688
{
686689
struct amdxdna_dev *xdna = to_xdna_dev(dev);
687690
struct amdxdna_drm_va_tbl va_tbl;
691+
struct amdxdna_gem_obj *abo;
688692
struct drm_gem_object *gobj;
689693
struct dma_buf *dma_buf;
690694

@@ -711,7 +715,10 @@ amdxdna_gem_create_ubuf_object(struct drm_device *dev, struct amdxdna_drm_create
711715

712716
dma_buf_put(dma_buf);
713717

714-
return to_xdna_obj(gobj);
718+
abo = to_xdna_obj(gobj);
719+
abo->private_buffer = true;
720+
721+
return abo;
715722
}
716723

717724
struct drm_gem_object *

drivers/accel/amdxdna/amdxdna_gem.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ struct amdxdna_gem_obj {
5454

5555
/* True, if BO is managed by XRT, not application */
5656
bool internal;
57+
/* True, if BO is not exportable */
58+
bool private_buffer;
5759
};
5860

5961
#define to_gobj(obj) (&(obj)->base.base)

drivers/accel/amdxdna/amdxdna_ubuf.c

Lines changed: 0 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -69,60 +69,10 @@ static void amdxdna_ubuf_release(struct dma_buf *dbuf)
6969
kfree(ubuf);
7070
}
7171

72-
static vm_fault_t amdxdna_ubuf_vm_fault(struct vm_fault *vmf)
73-
{
74-
struct vm_area_struct *vma = vmf->vma;
75-
struct amdxdna_ubuf_priv *ubuf;
76-
unsigned long pfn;
77-
pgoff_t pgoff;
78-
79-
ubuf = vma->vm_private_data;
80-
pgoff = (vmf->address - vma->vm_start) >> PAGE_SHIFT;
81-
82-
pfn = page_to_pfn(ubuf->pages[pgoff]);
83-
return vmf_insert_pfn(vma, vmf->address, pfn);
84-
}
85-
86-
static const struct vm_operations_struct amdxdna_ubuf_vm_ops = {
87-
.fault = amdxdna_ubuf_vm_fault,
88-
};
89-
90-
static int amdxdna_ubuf_mmap(struct dma_buf *dbuf, struct vm_area_struct *vma)
91-
{
92-
struct amdxdna_ubuf_priv *ubuf = dbuf->priv;
93-
94-
vma->vm_ops = &amdxdna_ubuf_vm_ops;
95-
vma->vm_private_data = ubuf;
96-
vm_flags_set(vma, VM_PFNMAP | VM_DONTEXPAND | VM_DONTDUMP);
97-
98-
return 0;
99-
}
100-
101-
static int amdxdna_ubuf_vmap(struct dma_buf *dbuf, struct iosys_map *map)
102-
{
103-
struct amdxdna_ubuf_priv *ubuf = dbuf->priv;
104-
void *kva;
105-
106-
kva = vmap(ubuf->pages, ubuf->nr_pages, VM_MAP, PAGE_KERNEL);
107-
if (!kva)
108-
return -EINVAL;
109-
110-
iosys_map_set_vaddr(map, kva);
111-
return 0;
112-
}
113-
114-
static void amdxdna_ubuf_vunmap(struct dma_buf *dbuf, struct iosys_map *map)
115-
{
116-
vunmap(map->vaddr);
117-
}
118-
11972
static const struct dma_buf_ops amdxdna_ubuf_dmabuf_ops = {
12073
.map_dma_buf = amdxdna_ubuf_map,
12174
.unmap_dma_buf = amdxdna_ubuf_unmap,
12275
.release = amdxdna_ubuf_release,
123-
.mmap = amdxdna_ubuf_mmap,
124-
.vmap = amdxdna_ubuf_vmap,
125-
.vunmap = amdxdna_ubuf_vunmap,
12676
};
12777

12878
struct dma_buf *amdxdna_get_ubuf(struct drm_device *dev,

drivers/gpu/drm/bridge/chipone-icn6211.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -758,7 +758,9 @@ static int chipone_i2c_probe(struct i2c_client *client)
758758
dev_set_drvdata(dev, icn);
759759
i2c_set_clientdata(client, icn);
760760

761-
drm_bridge_add(&icn->bridge);
761+
ret = devm_drm_bridge_add(dev, &icn->bridge);
762+
if (ret)
763+
return ret;
762764

763765
return chipone_dsi_host_attach(icn);
764766
}

drivers/gpu/drm/bridge/ite-it66121.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1559,6 +1559,11 @@ static int it66121_probe(struct i2c_client *client)
15591559
return ret;
15601560
}
15611561

1562+
ctx->gpio_reset = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
1563+
if (IS_ERR(ctx->gpio_reset))
1564+
return dev_err_probe(dev, PTR_ERR(ctx->gpio_reset),
1565+
"Failed to get reset GPIO\n");
1566+
15621567
it66121_hw_reset(ctx);
15631568

15641569
ctx->regmap = devm_regmap_init_i2c(client, &it66121_regmap_config);

drivers/gpu/drm/bridge/megachips-stdpxxxx-ge-b850v3-fw.c

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,6 @@ static void ge_b850v3_lvds_remove(void)
251251
goto out;
252252

253253
drm_bridge_remove(&ge_b850v3_lvds_ptr->bridge);
254-
255254
ge_b850v3_lvds_ptr = NULL;
256255
out:
257256
mutex_unlock(&ge_b850v3_lvds_dev_mutex);
@@ -261,6 +260,7 @@ static int ge_b850v3_register(void)
261260
{
262261
struct i2c_client *stdp4028_i2c = ge_b850v3_lvds_ptr->stdp4028_i2c;
263262
struct device *dev = &stdp4028_i2c->dev;
263+
int ret;
264264

265265
/* drm bridge initialization */
266266
ge_b850v3_lvds_ptr->bridge.ops = DRM_BRIDGE_OP_DETECT |
@@ -277,11 +277,15 @@ static int ge_b850v3_register(void)
277277
if (!stdp4028_i2c->irq)
278278
return 0;
279279

280-
return devm_request_threaded_irq(&stdp4028_i2c->dev,
281-
stdp4028_i2c->irq, NULL,
282-
ge_b850v3_lvds_irq_handler,
283-
IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
284-
"ge-b850v3-lvds-dp", ge_b850v3_lvds_ptr);
280+
ret = devm_request_threaded_irq(&stdp4028_i2c->dev,
281+
stdp4028_i2c->irq, NULL,
282+
ge_b850v3_lvds_irq_handler,
283+
IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
284+
"ge-b850v3-lvds-dp", ge_b850v3_lvds_ptr);
285+
if (ret)
286+
drm_bridge_remove(&ge_b850v3_lvds_ptr->bridge);
287+
288+
return ret;
285289
}
286290

287291
static int stdp4028_ge_b850v3_fw_probe(struct i2c_client *stdp4028_i2c)

drivers/gpu/drm/drm_drv.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -697,6 +697,7 @@ static void drm_dev_init_release(struct drm_device *dev, void *res)
697697
mutex_destroy(&dev->master_mutex);
698698
mutex_destroy(&dev->clientlist_mutex);
699699
mutex_destroy(&dev->filelist_mutex);
700+
mutex_destroy(&dev->gem_lru_mutex);
700701
}
701702

702703
static int drm_dev_init(struct drm_device *dev,
@@ -738,6 +739,7 @@ static int drm_dev_init(struct drm_device *dev,
738739
INIT_LIST_HEAD(&dev->vblank_event_list);
739740

740741
spin_lock_init(&dev->event_lock);
742+
mutex_init(&dev->gem_lru_mutex);
741743
mutex_init(&dev->filelist_mutex);
742744
mutex_init(&dev->clientlist_mutex);
743745
mutex_init(&dev->master_mutex);

drivers/gpu/drm/drm_gem.c

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1561,12 +1561,10 @@ EXPORT_SYMBOL(drm_gem_unlock_reservations);
15611561
* drm_gem_lru_init - initialize a LRU
15621562
*
15631563
* @lru: The LRU to initialize
1564-
* @lock: The lock protecting the LRU
15651564
*/
15661565
void
1567-
drm_gem_lru_init(struct drm_gem_lru *lru, struct mutex *lock)
1566+
drm_gem_lru_init(struct drm_gem_lru *lru)
15681567
{
1569-
lru->lock = lock;
15701568
lru->count = 0;
15711569
INIT_LIST_HEAD(&lru->list);
15721570
}
@@ -1591,14 +1589,10 @@ drm_gem_lru_remove_locked(struct drm_gem_object *obj)
15911589
void
15921590
drm_gem_lru_remove(struct drm_gem_object *obj)
15931591
{
1594-
struct drm_gem_lru *lru = obj->lru;
1595-
1596-
if (!lru)
1597-
return;
1598-
1599-
mutex_lock(lru->lock);
1600-
drm_gem_lru_remove_locked(obj);
1601-
mutex_unlock(lru->lock);
1592+
mutex_lock(&obj->dev->gem_lru_mutex);
1593+
if (obj->lru)
1594+
drm_gem_lru_remove_locked(obj);
1595+
mutex_unlock(&obj->dev->gem_lru_mutex);
16021596
}
16031597
EXPORT_SYMBOL(drm_gem_lru_remove);
16041598

@@ -1613,7 +1607,7 @@ EXPORT_SYMBOL(drm_gem_lru_remove);
16131607
void
16141608
drm_gem_lru_move_tail_locked(struct drm_gem_lru *lru, struct drm_gem_object *obj)
16151609
{
1616-
lockdep_assert_held_once(lru->lock);
1610+
lockdep_assert_held_once(&obj->dev->gem_lru_mutex);
16171611

16181612
if (obj->lru)
16191613
drm_gem_lru_remove_locked(obj);
@@ -1637,9 +1631,9 @@ EXPORT_SYMBOL(drm_gem_lru_move_tail_locked);
16371631
void
16381632
drm_gem_lru_move_tail(struct drm_gem_lru *lru, struct drm_gem_object *obj)
16391633
{
1640-
mutex_lock(lru->lock);
1634+
mutex_lock(&obj->dev->gem_lru_mutex);
16411635
drm_gem_lru_move_tail_locked(lru, obj);
1642-
mutex_unlock(lru->lock);
1636+
mutex_unlock(&obj->dev->gem_lru_mutex);
16431637
}
16441638
EXPORT_SYMBOL(drm_gem_lru_move_tail);
16451639

@@ -1653,14 +1647,16 @@ EXPORT_SYMBOL(drm_gem_lru_move_tail);
16531647
* of the shrink callback to check for this (ie. dma_resv_test_signaled())
16541648
* or if necessary block until the buffer becomes idle.
16551649
*
1650+
* @dev: DRM device the LRU belongs to
16561651
* @lru: The LRU to scan
16571652
* @nr_to_scan: The number of pages to try to reclaim
16581653
* @remaining: The number of pages left to reclaim, should be initialized by caller
16591654
* @shrink: Callback to try to shrink/reclaim the object.
16601655
* @ticket: Optional ww_acquire_ctx context to use for locking
16611656
*/
16621657
unsigned long
1663-
drm_gem_lru_scan(struct drm_gem_lru *lru,
1658+
drm_gem_lru_scan(struct drm_device *dev,
1659+
struct drm_gem_lru *lru,
16641660
unsigned int nr_to_scan,
16651661
unsigned long *remaining,
16661662
bool (*shrink)(struct drm_gem_object *obj, struct ww_acquire_ctx *ticket),
@@ -1670,9 +1666,9 @@ drm_gem_lru_scan(struct drm_gem_lru *lru,
16701666
struct drm_gem_object *obj;
16711667
unsigned freed = 0;
16721668

1673-
drm_gem_lru_init(&still_in_lru, lru->lock);
1669+
drm_gem_lru_init(&still_in_lru);
16741670

1675-
mutex_lock(lru->lock);
1671+
mutex_lock(&dev->gem_lru_mutex);
16761672

16771673
while (freed < nr_to_scan) {
16781674
obj = list_first_entry_or_null(&lru->list, typeof(*obj), lru_node);
@@ -1695,7 +1691,7 @@ drm_gem_lru_scan(struct drm_gem_lru *lru,
16951691
* rest of the loop body, to reduce contention with other
16961692
* code paths that need the LRU lock
16971693
*/
1698-
mutex_unlock(lru->lock);
1694+
mutex_unlock(&dev->gem_lru_mutex);
16991695

17001696
if (ticket)
17011697
ww_acquire_init(ticket, &reservation_ww_class);
@@ -1729,7 +1725,7 @@ drm_gem_lru_scan(struct drm_gem_lru *lru,
17291725

17301726
tail:
17311727
drm_gem_object_put(obj);
1732-
mutex_lock(lru->lock);
1728+
mutex_lock(&dev->gem_lru_mutex);
17331729
}
17341730

17351731
/*
@@ -1741,7 +1737,7 @@ drm_gem_lru_scan(struct drm_gem_lru *lru,
17411737
list_splice_tail(&still_in_lru.list, &lru->list);
17421738
lru->count += still_in_lru.count;
17431739

1744-
mutex_unlock(lru->lock);
1740+
mutex_unlock(&dev->gem_lru_mutex);
17451741

17461742
return freed;
17471743
}

drivers/gpu/drm/msm/msm_drv.c

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -128,19 +128,18 @@ static int msm_drm_init(struct device *dev, const struct drm_driver *drv,
128128
/*
129129
* Initialize the LRUs:
130130
*/
131-
mutex_init(&priv->lru.lock);
132-
drm_gem_lru_init(&priv->lru.unbacked, &priv->lru.lock);
133-
drm_gem_lru_init(&priv->lru.pinned, &priv->lru.lock);
134-
drm_gem_lru_init(&priv->lru.willneed, &priv->lru.lock);
135-
drm_gem_lru_init(&priv->lru.dontneed, &priv->lru.lock);
131+
drm_gem_lru_init(&priv->lru.unbacked);
132+
drm_gem_lru_init(&priv->lru.pinned);
133+
drm_gem_lru_init(&priv->lru.willneed);
134+
drm_gem_lru_init(&priv->lru.dontneed);
136135

137136
/* Initialize stall-on-fault */
138137
spin_lock_init(&priv->fault_stall_lock);
139138
priv->stall_enabled = true;
140139

141140
/* Teach lockdep about lock ordering wrt. shrinker: */
142141
fs_reclaim_acquire(GFP_KERNEL);
143-
might_lock(&priv->lru.lock);
142+
might_lock(&ddev->gem_lru_mutex);
144143
fs_reclaim_release(GFP_KERNEL);
145144

146145
if (priv->kms_init) {

drivers/gpu/drm/msm/msm_drv.h

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -150,13 +150,6 @@ struct msm_drm_private {
150150
* DONTNEED state (ie. can be purged)
151151
*/
152152
struct drm_gem_lru dontneed;
153-
154-
/**
155-
* lock:
156-
*
157-
* Protects manipulation of all of the LRUs.
158-
*/
159-
struct mutex lock;
160153
} lru;
161154

162155
struct notifier_block vmap_notifier;

0 commit comments

Comments
 (0)