From: "Dmitry V. Levin" <ldv@altlinux.org>
To: strace-devel@lists.sourceforge.net, intel-gfx@lists.freedesktop.org
Subject: Re: [PATCH 2/4] drm: Add dispatcher and driver identification for DRM
Date: Thu, 11 Jun 2015 02:26:59 +0300 [thread overview]
Message-ID: <20150610232659.GA19231@altlinux.org> (raw)
In-Reply-To: <20150610115233.GA18221@rpjakobs-ThinkCentre-E73>
[-- Attachment #1.1: Type: text/plain, Size: 2876 bytes --]
On Wed, Jun 10, 2015 at 01:52:33PM +0200, Patrik Jakobsson wrote:
> On Wed, Jun 10, 2015 at 01:14:20AM +0300, Dmitry V. Levin wrote:
> > On Tue, Jun 09, 2015 at 01:26:42PM +0200, Patrik Jakobsson wrote:
[...]
> > > +#define DRM_MAX_NAME_LEN 128
> > > +
> > > +inline int drm_is_priv(const unsigned int num)
> > > +{
> > > + return (_IOC_NR(num) >= DRM_COMMAND_BASE &&
> > > + _IOC_NR(num) < DRM_COMMAND_END);
> > > +}
> > > +
> > > +static int drm_get_driver_name(struct tcb *tcp, char *name, size_t bufsize)
> > > +{
> > > + char path[PATH_MAX];
> > > + char link[PATH_MAX];
> > > + int ret;
> > > +
> > > + ret = getfdpath(tcp, tcp->u_arg[0], path, PATH_MAX - 1);
> > > + if (!ret)
> > > + return ret;
> > > +
> > > + snprintf(link, PATH_MAX, "/sys/class/drm/%s/device/driver",
> > > + basename(path));
> > > +
> > > + ret = readlink(link, path, PATH_MAX - 1);
> > > + if (ret < 0)
> > > + return ret;
> > > +
> > > + path[ret] = '\0';
> > > + strncpy(name, basename(path), bufsize);
> > > +
> > > + return 0;
> > > +}
> > > +
> > > +int drm_is_driver(struct tcb *tcp, const char *name)
> > > +{
> > > + char drv[DRM_MAX_NAME_LEN];
> > > + int ret;
> > > +
> > > + ret = drm_get_driver_name(tcp, drv, DRM_MAX_NAME_LEN);
> > > + if (ret)
> > > + return 0;
> > > +
> > > + return strcmp(name, drv) == 0;
> > > +}
> >
> > This interface will result to several getfdpath() calls per
> > ioctl_decode(). If the only purpose of drm_is_driver() is to help finding
> > the most appropriate function, let's create a table of pairs
> > {driver name, function} and pass this table to a function that will do a
> > single getfdpath() call, calculate the driver name, and choose the right
> > function from the table.
>
> Yes I was thinking the same thing but it's a bit tricky. What I need is:
> fd -> path -> driver name. And fd -> path could change between ioctls. It is not
> a likely scenario but it's possible. I could get rid of the extra call in
> drm_decode_number() if I put it back in drm_ioctl as in my RFC. I could also
> optimize path -> driver name with a table but I don't know how expensive those
> calls actually are. Not sure what would be the best solution here.
drm_get_driver_name() is quite expensive as it does two readlink syscalls,
so it should be called at most once per ioctl_decode().
Another method to achieve this is to change drm_get_driver_name() to return
basename(path) instead of return code, so that drm_ioctl() would call it
once and pass the result to strcmp calls:
int
drm_ioctl(struct tcb *tcp, const unsigned int code, long arg)
{
if (verbose(tcp) && drm_is_priv(code)) {
const char *driver = drm_get_driver_name(tcp);
if (!driver)
return 0;
if (!strcmp(driver, "i915"))
return drm_i915_ioctl(tcp, code, arg);
}
return 0;
}
--
ldv
[-- Attachment #1.2: Type: application/pgp-signature, Size: 181 bytes --]
[-- Attachment #2: Type: text/plain, Size: 159 bytes --]
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
next prev parent reply other threads:[~2015-06-10 23:27 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-06-09 11:26 [PATCH 0/4] drm: Add decoding for DRM/KMS and i915 ioctls Patrik Jakobsson
2015-06-09 11:26 ` [PATCH 1/4] drm: Add config for detecting libdrm Patrik Jakobsson
2015-06-09 11:26 ` [PATCH 2/4] drm: Add dispatcher and driver identification for DRM Patrik Jakobsson
2015-06-09 13:51 ` Gabriel Laskar
2015-06-09 14:35 ` Patrik Jakobsson
[not found] ` <1433849204-4125-3-git-send-email-patrik.jakobsson-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2015-06-09 22:14 ` Dmitry V. Levin
2015-06-10 11:52 ` Patrik Jakobsson
2015-06-10 23:26 ` Dmitry V. Levin [this message]
2015-06-11 14:11 ` Patrik Jakobsson
2015-06-12 23:41 ` Dmitry V. Levin
2015-06-14 11:12 ` Patrik Jakobsson
2015-06-14 21:56 ` [Intel-gfx] " Dmitry V. Levin
2015-06-09 23:10 ` Dmitry V. Levin
[not found] ` <1433849204-4125-1-git-send-email-patrik.jakobsson-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2015-06-09 11:26 ` [PATCH 3/4] drm: Add decoding of i915 ioctls Patrik Jakobsson
2015-06-09 22:35 ` Dmitry V. Levin
2015-06-10 12:45 ` Patrik Jakobsson
2015-06-10 23:27 ` Dmitry V. Levin
2015-06-11 13:34 ` Patrik Jakobsson
2015-06-12 23:48 ` Dmitry V. Levin
2015-06-14 11:10 ` Patrik Jakobsson
2015-06-09 11:26 ` [PATCH 4/4] drm: Add decoding of DRM and KMS ioctls Patrik Jakobsson
2015-06-09 13:51 ` Gabriel Laskar
2015-06-09 14:29 ` Patrik Jakobsson
2015-06-09 14:38 ` Gabriel Laskar
2015-06-09 22:55 ` Dmitry V. Levin
2015-06-09 22:46 ` Dmitry V. Levin
2015-06-10 14:27 ` Patrik Jakobsson
2015-06-09 13:51 ` [PATCH 0/4] drm: Add decoding for DRM/KMS and i915 ioctls Gabriel Laskar
[not found] ` <20150609155105.77ac6a9a-krIL5v34lyW+8jMViQwUxmazZaUMDOZU@public.gmane.org>
2015-06-09 14:36 ` Patrik Jakobsson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20150610232659.GA19231@altlinux.org \
--to=ldv@altlinux.org \
--cc=intel-gfx@lists.freedesktop.org \
--cc=strace-devel@lists.sourceforge.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.