diff options
author | Ben Skeggs <bskeggs@redhat.com> | 2015-05-06 14:34:22 +1000 |
---|---|---|
committer | Ben Skeggs <bskeggs@redhat.com> | 2015-05-06 14:50:07 +1000 |
commit | 812e8fe6ce46d733c30207ee26c788c61f546294 (patch) | |
tree | 8e31fc01e79dbb167d08da1cb67dd3c23eb177fc /nouveau/nouveau.c | |
parent | b4defea65fac690aefbe5348ff6ac2976e0ee090 (diff) | |
download | libdrm-812e8fe6ce46d733c30207ee26c788c61f546294.tar.gz libdrm-812e8fe6ce46d733c30207ee26c788c61f546294.tar.bz2 libdrm-812e8fe6ce46d733c30207ee26c788c61f546294.zip |
nouveau: restore check that avoids multiple user bos per kernel bo
Lost in 5ea6f1c32628887c9df0c53bc8c199eb12633fec, triggering fdo#89842.
Unlike the PRIME fd->handle interfaces, the GEM_OPEN interface doesn't
do anything at the kernel level to prevent this situation occuring,
and we end up with multiple GEM handles for a single kernel buffer.
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Diffstat (limited to 'nouveau/nouveau.c')
-rw-r--r-- | nouveau/nouveau.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/nouveau/nouveau.c b/nouveau/nouveau.c index 0071249e..7393474d 100644 --- a/nouveau/nouveau.c +++ b/nouveau/nouveau.c @@ -480,10 +480,20 @@ nouveau_bo_name_ref(struct nouveau_device *dev, uint32_t name, struct nouveau_bo **pbo) { struct nouveau_device_priv *nvdev = nouveau_device(dev); + struct nouveau_bo_priv *nvbo; struct drm_gem_open req = { .name = name }; int ret; pthread_mutex_lock(&nvdev->lock); + DRMLISTFOREACHENTRY(nvbo, &nvdev->bo_list, head) { + if (nvbo->name == name) { + ret = nouveau_bo_wrap_locked(dev, nvbo->base.handle, + pbo, name); + pthread_mutex_unlock(&nvdev->lock); + return ret; + } + } + ret = drmIoctl(dev->fd, DRM_IOCTL_GEM_OPEN, &req); if (ret == 0) { ret = nouveau_bo_wrap_locked(dev, req.handle, pbo, name); |