DF-4533 / static_proof.log
== every drm_minor_acquire / drm_minor_release site ==
sys/dev/drm/drm_drv.c:265: * object with drm_minor_release().
sys/dev/drm/drm_drv.c:271:struct drm_minor *drm_minor_acquire(unsigned int minor_id)
sys/dev/drm/drm_drv.c:292:void drm_minor_release(struct drm_minor *minor)
sys/dev/drm/drm_drv.c:1024: minor = drm_minor_acquire(iminor(inode));
sys/dev/drm/drm_drv.c:1043: drm_minor_release(minor);
sys/dev/drm/drm_file.c:325: minor = drm_minor_acquire(iminor(inode));
sys/dev/drm/drm_file.c:357: drm_minor_release(minor);
sys/dev/drm/drm_file.c:373: struct drm_minor *minor = drm_minor_acquire(iminor(inode));
sys/dev/drm/drm_file.c:445: drm_minor_release(minor);
sys/dev/drm/drm_file.c:623: drm_minor_release(minor);
== drm_open(): acquire at entry, release only under err_undo ==
struct drm_device *dev;
struct drm_minor *minor;
int retcode;
int need_setup = 0;
minor = drm_minor_acquire(iminor(inode));
if (IS_ERR(minor))
return PTR_ERR(minor);
dev = minor->dev;
if (!dev->open_count++)
need_setup = 1;
/* share address_space across all char-devs of a single device */
#if 0
filp->f_mapping = dev->anon_inode->i_mapping;
#endif
#ifdef __DragonFly__
retcode = drm_open_helper(kdev, flags, filp, minor);
#else
retcode = drm_open_helper(filp, minor);
#endif
if (retcode)
goto err_undo;
if (need_setup) {
retcode = drm_setup(dev);
if (retcode)
goto err_undo;
}
#ifdef __DragonFly__
device_busy(dev->dev->bsddev);
#endif
return 0;
err_undo:
dev->open_count--;
drm_minor_release(minor);
return retcode;
}
== drm_release() dead on DragonFly ==
int drm_release(struct inode *inode, struct file *filp)
{
struct drm_file *file_priv = filp->private_data;
struct drm_minor *minor = file_priv->minor;
struct drm_device *dev = minor->dev;
#ifdef __DragonFly__
/* dev is not correctly set yet */
return 0;
#endif
== drm_cdevpriv_dtor never registered (no devfs_set_cdevpriv caller) ==
(none: dtor dead)
PROVEN: open's acquire leaks; per open/close cycle net +1 dev kref.