From: "Dmitry V. Levin" <ldv@altlinux.org>
To: Patrik Jakobsson <patrik.jakobsson@linux.intel.com>
Cc: intel-gfx@lists.freedesktop.org, strace-devel@lists.sourceforge.net
Subject: Re: [PATCH v3 2/5] drm: Add private data field to trace control block
Date: Fri, 3 Jul 2015 03:33:31 +0300 [thread overview]
Message-ID: <20150703003331.GA29080@altlinux.org> (raw)
In-Reply-To: <1435755168-16207-4-git-send-email-patrik.jakobsson@linux.intel.com> <1435755168-16207-3-git-send-email-patrik.jakobsson@linux.intel.com>
[-- Attachment #1.1: Type: text/plain, Size: 5062 bytes --]
On Wed, Jul 01, 2015 at 02:52:45PM +0200, Patrik Jakobsson wrote:
[...]
> --- a/defs.h
> +++ b/defs.h
> @@ -266,6 +266,13 @@ struct tcb {
> int u_error; /* Error code */
> long scno; /* System call number */
> long u_arg[MAX_ARGS]; /* System call arguments */
> +
> + /*
> + * Private data for the decoding functions of the syscall. TCB core does
> + * _not_ handle allocation / deallocation of this data.
> + */
> + void *priv_data;
> +
This will result to memory leaks if droptcb() is called before the
syscall parser that allocated memory had a chance to deallocate it.
As this data is no longer relevant after leaving trace_syscall_exiting(),
I suggest to perform deallocation directly from trace_syscall_exiting.
This API could be made more flexible by adding another pointer -
the function to be called to deallocate memory, e.g.
struct tcb {
...
void *priv_data;
void (*free_priv_data)(void *);
...
};
...
void
free_priv_data(struct tcb *tcp)
{
if (tcp->priv_data) {
if (tcp->free_priv_data) {
tcp->free_priv_data(tcp->priv_data);
tcp->free_priv_data = NULL;
}
tcp->priv_data = NULL;
}
}
...
droptcb(struct tcb *tcp)
{
...
free_priv_data(tcp);
...
}
...
trace_syscall_exiting(struct tcb *tcp)
{
...
ret:
free_priv_data(tcp);
...
}
[...]
On Wed, Jul 01, 2015 at 02:52:46PM +0200, Patrik Jakobsson wrote:
> * Makefile.am: Add compilation of drm.c
> * defs.h: Declarations of drm functions
> * drm.c: Utility functions for drm driver detection
> * io.c: Dispatch drm ioctls
> * ioctl.c: Distpatch generic and driver specific ioctls
This is not quite a GNU style changelog entry. Please have a look at
http://www.gnu.org/prep/standards/html_node/Style-of-Change-Logs.html
and examples in strace.git history.
[...]
> +#include "defs.h"
> +
> +#include <drm.h>
> +#include <linux/limits.h>
Please include <sys/param.h> instead of <linux/limits.h>.
> +#define DRM_MAX_NAME_LEN 128
> +
> +struct drm_ioctl_priv {
> + char name[DRM_MAX_NAME_LEN];
> +};
> +
> +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 < 0)
> + 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;
> +}
I think this is getting too complicated. This function could just return
strdup(basename(path)) or NULL in case of any error:
static char *
drm_get_driver_name(struct tcb *tcp, const char *name)
{
char path[PATH_MAX];
char link[PATH_MAX];
int ret;
if (getfdpath(tcp, tcp->u_arg[0], path, PATH_MAX - 1) < 0)
return NULL;
if (snprintf(link, PATH_MAX, "/sys/class/drm/%s/device/driver",
basename(path)) >= PATH_MAX)
return NULL;
ret = readlink(link, path, PATH_MAX - 1);
if (ret < 0)
return NULL;
path[ret] = '\0';
return strdup(basename(path));
}
> +
> +int drm_is_driver(struct tcb *tcp, const char *name)
> +{
> + struct drm_ioctl_priv *priv;
> + int ret;
> +
> + /*
> + * If no private data is allocated we are detecting the driver name for
> + * the first time and must resolve it.
> + */
> + if (tcp->priv_data == NULL) {
> + tcp->priv_data = xcalloc(1, sizeof(struct drm_ioctl_priv));
xcalloc shouldn't be used if a potential memory allocation error is not
fatal. In a parser that performs verbose syscall decoding no memory
allocation error is fatal.
> + priv = tcp->priv_data;
> +
> + ret = drm_get_driver_name(tcp, priv->name, DRM_MAX_NAME_LEN);
> + if (ret)
> + return 0;
> + }
> +
> + priv = tcp->priv_data;
> +
> + return strncmp(name, priv->name, DRM_MAX_NAME_LEN) == 0;
Then with priv_data+free_priv_data interface this would looks smth like
...
if (!tcp->priv_data) {
tcp->priv_data = drm_get_driver_name(tcp, name);
if (tcp->priv_data) {
tcp->free_priv_data = free;
} else {
tcp->priv_data = (void *) "";
tcp->free_priv_data = NULL;
}
}
return !strcmp(name, (char *) tcp->priv_data);
> +}
> +
> +int drm_decode_number(struct tcb *tcp, unsigned int arg)
This is an ioctl request code, let's consistently call it "code" to
distinguish from its argument.
[...]
> --- a/ioctl.c
> +++ b/ioctl.c
> @@ -182,7 +182,7 @@ hiddev_decode_number(unsigned int arg)
> }
>
> int
> -ioctl_decode_command_number(unsigned int arg)
> +ioctl_decode_command_number(struct tcb *tcp, unsigned int arg)
I've already changed ioctl_decode_command_number's signature:
struct tcb * is already there and "arg" is now called "code".
--
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-07-03 0:33 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-07-01 12:52 [PATCH v3 0/5] drm: Add decoding for DRM/KMS and i915 ioctls Patrik Jakobsson
[not found] ` <1435755168-16207-1-git-send-email-patrik.jakobsson-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2015-07-01 12:52 ` [PATCH v3 1/5] drm: Add config for detecting libdrm Patrik Jakobsson
[not found] ` <1435755168-16207-2-git-send-email-patrik.jakobsson-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2015-07-23 9:48 ` Mike Frysinger
2015-07-23 10:44 ` Dmitry V. Levin
[not found] ` <20150723104417.GA21575-u2l5PoMzF/Vg9hUCZPvPmw@public.gmane.org>
2015-07-23 11:02 ` Mike Frysinger
2015-07-30 13:30 ` Patrik Jakobsson
2015-07-30 14:04 ` Mike Frysinger
2015-07-31 9:09 ` Patrik Jakobsson
2015-08-01 18:22 ` Dmitry V. Levin
2015-08-02 14:03 ` Patrik Jakobsson
2015-07-01 12:52 ` [PATCH v3 2/5] drm: Add private data field to trace control block Patrik Jakobsson
2015-07-03 0:33 ` Dmitry V. Levin [this message]
2015-07-06 8:09 ` Patrik Jakobsson
2015-07-01 12:52 ` [PATCH v3 3/5] drm: Add dispatcher and driver identification for DRM Patrik Jakobsson
2015-07-01 12:52 ` [PATCH v3 4/5] drm: Add decoding of i915 ioctls Patrik Jakobsson
2015-07-03 0:36 ` Dmitry V. Levin
[not found] ` <20150703003609.GB29080-u2l5PoMzF/Vg9hUCZPvPmw@public.gmane.org>
2015-07-06 10:35 ` Patrik Jakobsson
2015-07-06 14:40 ` Gabriel Laskar
2015-07-08 0:11 ` Dmitry V. Levin
2015-07-10 12:36 ` Patrik Jakobsson
2015-07-10 12:57 ` Dmitry V. Levin
2015-07-01 12:52 ` [PATCH v3 5/5] drm: Add decoding of DRM and KMS ioctls 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=20150703003331.GA29080@altlinux.org \
--to=ldv@altlinux.org \
--cc=intel-gfx@lists.freedesktop.org \
--cc=patrik.jakobsson@linux.intel.com \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox