diff mbox

[08/10] drm: Forbid legacy MAP functions for DRIVER_MODESET

Message ID 1459331120-27864-9-git-send-email-daniel.vetter@ffwll.ch (mailing list archive)
State New, archived
Headers show

Commit Message

Daniel Vetter March 30, 2016, 9:45 a.m. UTC
Like in

commit 0e975980d435d58df2d430d688b8c18778b42218
Author: Peter Antoine <peter.antoine@intel.com>
Date:   Tue Jun 23 08:18:49 2015 +0100

    drm: Turn off Legacy Context Functions

we need to again make an exception for nouveau, but everyone else
really doesn't need this.

Cc: Peter Antoine <peter.antoine@intel.com>
Cc: Ben Skeggs <bskeggs@redhat.com>
Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
---
 drivers/gpu/drm/drm_bufs.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

Comments

Emil Velikov March 30, 2016, 10:39 a.m. UTC | #1
On 30 March 2016 at 10:45, Daniel Vetter <daniel.vetter@ffwll.ch> wrote:
> Like in
>
> commit 0e975980d435d58df2d430d688b8c18778b42218
> Author: Peter Antoine <peter.antoine@intel.com>
> Date:   Tue Jun 23 08:18:49 2015 +0100
>
>     drm: Turn off Legacy Context Functions
>
> we need to again make an exception for nouveau, but everyone else
> really doesn't need this.
>
> Cc: Peter Antoine <peter.antoine@intel.com>
> Cc: Ben Skeggs <bskeggs@redhat.com>
> Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
> ---
>  drivers/gpu/drm/drm_bufs.c | 12 ++++++++++++
>  1 file changed, 12 insertions(+)
>
> diff --git a/drivers/gpu/drm/drm_bufs.c b/drivers/gpu/drm/drm_bufs.c
> index d92db7007f62..e8a12a4fd400 100644
> --- a/drivers/gpu/drm/drm_bufs.c
> +++ b/drivers/gpu/drm/drm_bufs.c
> @@ -396,6 +396,10 @@ int drm_legacy_addmap_ioctl(struct drm_device *dev, void *data,
>         if (!(capable(CAP_SYS_ADMIN) || map->type == _DRM_AGP || map->type == _DRM_SHM))
>                 return -EPERM;
>
> +       if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) &&
> +           drm_core_check_feature(dev, DRIVER_MODESET))
> +               return -EINVAL;
> +
Wondering if making this the first check in the function won't be
better ? We have a handful of places which preemptively check
DRIVER_MODESET prior to calling drm_legacy functions and similarly
some (last time I've looked) drm_legacy functions check for
DRIVER_MODESET. Perhaps we can move all the checking into the
drm_legacy API alone ?

-Emil
Daniel Vetter April 14, 2016, 10:06 a.m. UTC | #2
On Wed, Mar 30, 2016 at 11:39:01AM +0100, Emil Velikov wrote:
> On 30 March 2016 at 10:45, Daniel Vetter <daniel.vetter@ffwll.ch> wrote:
> > Like in
> >
> > commit 0e975980d435d58df2d430d688b8c18778b42218
> > Author: Peter Antoine <peter.antoine@intel.com>
> > Date:   Tue Jun 23 08:18:49 2015 +0100
> >
> >     drm: Turn off Legacy Context Functions
> >
> > we need to again make an exception for nouveau, but everyone else
> > really doesn't need this.
> >
> > Cc: Peter Antoine <peter.antoine@intel.com>
> > Cc: Ben Skeggs <bskeggs@redhat.com>
> > Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
> > ---
> >  drivers/gpu/drm/drm_bufs.c | 12 ++++++++++++
> >  1 file changed, 12 insertions(+)
> >
> > diff --git a/drivers/gpu/drm/drm_bufs.c b/drivers/gpu/drm/drm_bufs.c
> > index d92db7007f62..e8a12a4fd400 100644
> > --- a/drivers/gpu/drm/drm_bufs.c
> > +++ b/drivers/gpu/drm/drm_bufs.c
> > @@ -396,6 +396,10 @@ int drm_legacy_addmap_ioctl(struct drm_device *dev, void *data,
> >         if (!(capable(CAP_SYS_ADMIN) || map->type == _DRM_AGP || map->type == _DRM_SHM))
> >                 return -EPERM;
> >
> > +       if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) &&
> > +           drm_core_check_feature(dev, DRIVER_MODESET))
> > +               return -EINVAL;
> > +
> Wondering if making this the first check in the function won't be
> better ? We have a handful of places which preemptively check
> DRIVER_MODESET prior to calling drm_legacy functions and similarly
> some (last time I've looked) drm_legacy functions check for
> DRIVER_MODESET. Perhaps we can move all the checking into the
> drm_legacy API alone ?

This is an ioctl handler, so there's not really any caller we can move
this to. In general I'm split, and I just put checks like these wherever
it makes sense, pulling them out into callers if there's an entire pile of
them who all want the same checks.

In the end I don't think it matters, as long as we dutifully combine
drm_legacy_* with such checks, so that it's _really_ all dead code for
modern drives.
-Daniel
Emil Velikov April 14, 2016, 1:57 p.m. UTC | #3
On 14 April 2016 at 11:06, Daniel Vetter <daniel@ffwll.ch> wrote:
> On Wed, Mar 30, 2016 at 11:39:01AM +0100, Emil Velikov wrote:
>> On 30 March 2016 at 10:45, Daniel Vetter <daniel.vetter@ffwll.ch> wrote:
>> > Like in
>> >
>> > commit 0e975980d435d58df2d430d688b8c18778b42218
>> > Author: Peter Antoine <peter.antoine@intel.com>
>> > Date:   Tue Jun 23 08:18:49 2015 +0100
>> >
>> >     drm: Turn off Legacy Context Functions
>> >
>> > we need to again make an exception for nouveau, but everyone else
>> > really doesn't need this.
>> >
>> > Cc: Peter Antoine <peter.antoine@intel.com>
>> > Cc: Ben Skeggs <bskeggs@redhat.com>
>> > Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
>> > ---
>> >  drivers/gpu/drm/drm_bufs.c | 12 ++++++++++++
>> >  1 file changed, 12 insertions(+)
>> >
>> > diff --git a/drivers/gpu/drm/drm_bufs.c b/drivers/gpu/drm/drm_bufs.c
>> > index d92db7007f62..e8a12a4fd400 100644
>> > --- a/drivers/gpu/drm/drm_bufs.c
>> > +++ b/drivers/gpu/drm/drm_bufs.c
>> > @@ -396,6 +396,10 @@ int drm_legacy_addmap_ioctl(struct drm_device *dev, void *data,
>> >         if (!(capable(CAP_SYS_ADMIN) || map->type == _DRM_AGP || map->type == _DRM_SHM))
>> >                 return -EPERM;
>> >
>> > +       if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) &&
>> > +           drm_core_check_feature(dev, DRIVER_MODESET))
>> > +               return -EINVAL;
>> > +
>> Wondering if making this the first check in the function won't be
>> better ? We have a handful of places which preemptively check
>> DRIVER_MODESET prior to calling drm_legacy functions and similarly
>> some (last time I've looked) drm_legacy functions check for
>> DRIVER_MODESET. Perhaps we can move all the checking into the
>> drm_legacy API alone ?
>
> This is an ioctl handler, so there's not really any caller we can move
> this to.
Indeed. One could extract the legacy ioctls into separate table and/or
use a function alike drm_ioctl_permit() to generalise things. It will
allow clear and obvious separation of things, although the particular
above will make things a bit annoying.

> In general I'm split, and I just put checks like these wherever
> it makes sense, pulling them out into callers if there's an entire pile of
> them who all want the same checks.
>
> In the end I don't think it matters, as long as we dutifully combine
> drm_legacy_* with such checks, so that it's _really_ all dead code for
> modern drives.
I'd suspect that there's a few bits that are missing the check, plus
going through might be a bit time consuming. Thus thinking of a
'generic' way to handle things.

Just thinking out loud :-)

-Emil
diff mbox

Patch

diff --git a/drivers/gpu/drm/drm_bufs.c b/drivers/gpu/drm/drm_bufs.c
index d92db7007f62..e8a12a4fd400 100644
--- a/drivers/gpu/drm/drm_bufs.c
+++ b/drivers/gpu/drm/drm_bufs.c
@@ -396,6 +396,10 @@  int drm_legacy_addmap_ioctl(struct drm_device *dev, void *data,
 	if (!(capable(CAP_SYS_ADMIN) || map->type == _DRM_AGP || map->type == _DRM_SHM))
 		return -EPERM;
 
+	if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) &&
+	    drm_core_check_feature(dev, DRIVER_MODESET))
+		return -EINVAL;
+
 	err = drm_addmap_core(dev, map->offset, map->size, map->type,
 			      map->flags, &maplist);
 
@@ -438,6 +442,10 @@  int drm_legacy_getmap_ioctl(struct drm_device *dev, void *data,
 	int idx;
 	int i;
 
+	if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) &&
+	    drm_core_check_feature(dev, DRIVER_MODESET))
+		return -EINVAL;
+
 	idx = map->offset;
 	if (idx < 0)
 		return -EINVAL;
@@ -569,6 +577,10 @@  int drm_legacy_rmmap_ioctl(struct drm_device *dev, void *data,
 	struct drm_map_list *r_list;
 	int ret;
 
+	if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) &&
+	    drm_core_check_feature(dev, DRIVER_MODESET))
+		return -EINVAL;
+
 	mutex_lock(&dev->struct_mutex);
 	list_for_each_entry(r_list, &dev->maplist, head) {
 		if (r_list->map &&