nouveau: restore check that avoids multiple user bos per kernel bo
Lost in 5ea6f1c326
, 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>
main
parent
b4defea65f
commit
812e8fe6ce
|
@ -480,10 +480,20 @@ nouveau_bo_name_ref(struct nouveau_device *dev, uint32_t name,
|
||||||
struct nouveau_bo **pbo)
|
struct nouveau_bo **pbo)
|
||||||
{
|
{
|
||||||
struct nouveau_device_priv *nvdev = nouveau_device(dev);
|
struct nouveau_device_priv *nvdev = nouveau_device(dev);
|
||||||
|
struct nouveau_bo_priv *nvbo;
|
||||||
struct drm_gem_open req = { .name = name };
|
struct drm_gem_open req = { .name = name };
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
pthread_mutex_lock(&nvdev->lock);
|
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);
|
ret = drmIoctl(dev->fd, DRM_IOCTL_GEM_OPEN, &req);
|
||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
ret = nouveau_bo_wrap_locked(dev, req.handle, pbo, name);
|
ret = nouveau_bo_wrap_locked(dev, req.handle, pbo, name);
|
||||||
|
|
Loading…
Reference in New Issue