Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ea487835 authored by Daniel Vetter's avatar Daniel Vetter
Browse files

drm: Enforce unlocked ioctl operation for kms driver ioctls



With the prep patches for i915 all kms drivers either have
DRM_UNLOCKED on all their ioctls. Or the ioctl always directly returns
with an invariant return value when in modeset mode. But that's only
the case for i915 and radeon. The drm core ioctls are unfortunately
too much a mess still to dare this.

Follow-up patches will remove DRM_UNLOCKED from all kms drivers to
prove that this is indeed the case.

Also update the documentation.

v2: Really only do this for driver ioctls, spotted by David Herrmann.
And drop spurious whitespace change.

Cc: David Herrmann <dh.herrmann@gmail.com>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@intel.com>
Reviewed-by: default avatarDavid Herrmann <dh.herrmann@gmail.com>
Reviewed-by: default avatarChristian König <christian.koenig@amd.com>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent 1c806a6e
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -3684,7 +3684,9 @@ int num_ioctls;</synopsis>
	    </para></listitem>
            <listitem><para>
	      DRM_UNLOCKED - The ioctl handler will be called without locking
	      the DRM global mutex
	      the DRM global mutex. This is the enforced default for kms drivers
	      (i.e. using the DRIVER_MODESET flag) and hence shouldn't be used
	      any more for new drivers.
	    </para></listitem>
	  </itemizedlist>
	</para>
+8 −2
Original line number Diff line number Diff line
@@ -691,13 +691,16 @@ long drm_ioctl(struct file *filp,
	char stack_kdata[128];
	char *kdata = NULL;
	unsigned int usize, asize, drv_size;
	bool is_driver_ioctl;

	dev = file_priv->minor->dev;

	if (drm_device_is_unplugged(dev))
		return -ENODEV;

	if (nr >= DRM_COMMAND_BASE && nr < DRM_COMMAND_END) {
	is_driver_ioctl = nr >= DRM_COMMAND_BASE && nr < DRM_COMMAND_END;

	if (is_driver_ioctl) {
		/* driver ioctl */
		if (nr - DRM_COMMAND_BASE >= dev->driver->num_ioctls)
			goto err_i1;
@@ -756,7 +759,10 @@ long drm_ioctl(struct file *filp,
		memset(kdata, 0, usize);
	}

	if (ioctl->flags & DRM_UNLOCKED)
	/* Enforce sane locking for kms driver ioctls. Core ioctls are
	 * too messy still. */
	if ((drm_core_check_feature(dev, DRIVER_MODESET) && is_driver_ioctl) ||
	    (ioctl->flags & DRM_UNLOCKED))
		retcode = func(dev, kdata, file_priv);
	else {
		mutex_lock(&drm_global_mutex);