Date: Fri, 28 Nov 2008 14:49:26 +0000 (UTC) From: Alexander Leidinger <netchild@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r185384 - user/netchild/linuxulator-dtrace/src/sys/compat/linux Message-ID: <200811281449.mASEnQI3021670@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: netchild Date: Fri Nov 28 14:49:26 2008 New Revision: 185384 URL: http://svn.freebsd.org/changeset/base/185384 Log: Add dtrace probes to all functions in linux_util.c. This is only compiletested. Add some error probes from linux_util to the error checking dtrace script. Modified: user/netchild/linuxulator-dtrace/src/sys/compat/linux/check_error.d user/netchild/linuxulator-dtrace/src/sys/compat/linux/linux_util.c Modified: user/netchild/linuxulator-dtrace/src/sys/compat/linux/check_error.d ============================================================================== --- user/netchild/linuxulator-dtrace/src/sys/compat/linux/check_error.d Fri Nov 28 14:47:39 2008 (r185383) +++ user/netchild/linuxulator-dtrace/src/sys/compat/linux/check_error.d Fri Nov 28 14:49:26 2008 (r185384) @@ -41,3 +41,18 @@ linuxulator*:emul:linux_schedtail:copyou /* ustack(); */ /* needs to be enabled when PID tracing is available in FreeBSD dtrace */ } +linuxulator*:util:linux_driver_get_name_dev:nullcall, +linuxulator*:util:linux_driver_get_major_minor:nullcall +{ + printf("WARNING: %s:%s:%s:%s in application %s, maybe an application error?\n", probename, probeprov, probemod, probefunc, execname); + stack(); + /* ustack(); */ /* needs to be enabled when PID tracing is available in FreeBSD dtrace */ +} + +linuxulator*:util:linux_driver_get_major_minor:notfound +{ + printf("WARNING: Application %s failed to find %s in %s:%s:%s, this may or may not be a problem.\n", execname, arg0, probename, probeprov, probemod); + stack(); + /* ustack(); */ /* needs to be enabled when PID tracing is available in FreeBSD dtrace */ +} + Modified: user/netchild/linuxulator-dtrace/src/sys/compat/linux/linux_util.c ============================================================================== --- user/netchild/linuxulator-dtrace/src/sys/compat/linux/linux_util.c Fri Nov 28 14:47:39 2008 (r185383) +++ user/netchild/linuxulator-dtrace/src/sys/compat/linux/linux_util.c Fri Nov 28 14:49:26 2008 (r185384) @@ -33,16 +33,19 @@ __FBSDID("$FreeBSD$"); #include "opt_compat.h" +#include "opt_kdtrace.h" #include <sys/param.h> #include <sys/bus.h> #include <sys/fcntl.h> #include <sys/lock.h> #include <sys/malloc.h> +#include <sys/kernel.h> #include <sys/linker_set.h> #include <sys/mutex.h> #include <sys/namei.h> #include <sys/proc.h> +#include <sys/sdt.h> #include <sys/syscallsubr.h> #include <sys/systm.h> #include <sys/vnode.h> @@ -56,8 +59,58 @@ __FBSDID("$FreeBSD$"); #include <machine/../linux/linux.h> #endif +#include <compat/linux/linux_dtrace.h> + const char linux_emul_path[] = "/compat/linux"; +LIN_SDT_PROVIDER_DECLARE(LINUX_DTRACE); +LIN_SDT_PROBE_DEFINE(util, linux_emul_convpath, entry); +LIN_SDT_PROBE_ARGTYPE(util, linux_emul_convpath, entry, 0, "const char *"); +LIN_SDT_PROBE_ARGTYPE(util, linux_emul_convpath, entry, 1, "enum uio_seg"); +LIN_SDT_PROBE_ARGTYPE(util, linux_emul_convpath, entry, 2, "char **"); +LIN_SDT_PROBE_ARGTYPE(util, linux_emul_convpath, entry, 3, "int"); +LIN_SDT_PROBE_ARGTYPE(util, linux_emul_convpath, entry, 4, "int"); +LIN_SDT_PROBE_DEFINE(util, linux_emul_convpath, return); +LIN_SDT_PROBE_ARGTYPE(util, linux_emul_convpath, return, 0, "int"); +LIN_SDT_PROBE_DEFINE(util, linux_msg, entry); +LIN_SDT_PROBE_ARGTYPE(util, linux_msg, entry, 0, "const char *"); +LIN_SDT_PROBE_DEFINE(util, linux_msg, return); +LIN_SDT_PROBE_DEFINE(util, linux_driver_get_name_dev, entry); +LIN_SDT_PROBE_ARGTYPE(util, linux_driver_get_name_dev, entry, 0, "device_t"); +LIN_SDT_PROBE_ARGTYPE(util, linux_driver_get_name_dev, entry, 1, + "const char *"); +LIN_SDT_PROBE_DEFINE(util, linux_driver_get_name_dev, nullcall); +LIN_SDT_PROBE_DEFINE(util, linux_driver_get_name_dev, return); +LIN_SDT_PROBE_ARGTYPE(util, linux_driver_get_name_dev, return, 0, "char *"); +LIN_SDT_PROBE_DEFINE(util, linux_driver_get_major_minor, entry); +LIN_SDT_PROBE_ARGTYPE(util, linux_driver_get_major_minor, entry, 0, "char *"); +LIN_SDT_PROBE_ARGTYPE(util, linux_driver_get_major_minor, entry, 1, "int *"); +LIN_SDT_PROBE_ARGTYPE(util, linux_driver_get_major_minor, entry, 2, "int *"); +LIN_SDT_PROBE_DEFINE(util, linux_driver_get_major_minor, nullcall); +LIN_SDT_PROBE_DEFINE(util, linux_driver_get_major_minor, notfound); +LIN_SDT_PROBE_ARGTYPE(util, linux_driver_get_major_minor, notfound, 0, + "char *"); +LIN_SDT_PROBE_DEFINE(util, linux_driver_get_major_minor, return); +LIN_SDT_PROBE_ARGTYPE(util, linux_driver_get_major_minor, return, 0, "int"); +LIN_SDT_PROBE_ARGTYPE(util, linux_driver_get_major_minor, return, 1, "int"); +LIN_SDT_PROBE_ARGTYPE(util, linux_driver_get_major_minor, return, 2, "int"); +LIN_SDT_PROBE_DEFINE(util, linux_get_char_devices, entry); +LIN_SDT_PROBE_DEFINE(util, linux_get_char_devices, return); +LIN_SDT_PROBE_ARGTYPE(util, linux_get_char_devices, return, 0, "char *"); +LIN_SDT_PROBE_DEFINE(util, linux_free_get_char_devices, entry); +LIN_SDT_PROBE_ARGTYPE(util, linux_free_get_char_devices, entry, 0, "char *"); +LIN_SDT_PROBE_DEFINE(util, linux_free_get_char_devices, return); +LIN_SDT_PROBE_DEFINE(util, linux_device_register_handler, entry); +LIN_SDT_PROBE_ARGTYPE(util, linux_device_register_handler, entry, 0, + "struct linux_device_handler *"); +LIN_SDT_PROBE_DEFINE(util, linux_device_register_handler, return); +LIN_SDT_PROBE_ARGTYPE(util, linux_device_register_handler, return, 0, "int"); +LIN_SDT_PROBE_DEFINE(util, linux_device_unregister_handler, entry); +LIN_SDT_PROBE_ARGTYPE(util, linux_device_unregister_handler, entry, 0, + "struct linux_device_handler *"); +LIN_SDT_PROBE_DEFINE(util, linux_device_unregister_handler, return); +LIN_SDT_PROBE_ARGTYPE(util, linux_device_unregister_handler, return, 0, "int"); + /* * Search an alternate path before passing pathname arguments on to * system calls. Useful for keeping a separate 'emulation tree'. @@ -66,17 +119,20 @@ const char linux_emul_path[] = "/co * named file, i.e. we check if the directory it should be in exists. */ int -linux_emul_convpath(td, path, pathseg, pbuf, cflag, dfd) - struct thread *td; - const char *path; - enum uio_seg pathseg; - char **pbuf; - int cflag; - int dfd; +linux_emul_convpath(struct thread *td, const char *path, enum uio_seg pathseg, + char **pbuf, int cflag, int dfd) { + int retval; + + LIN_SDT_PROBE(util, linux_emul_convpath, entry, path, pathseg, pbuf, + cflag, dfd); - return (kern_alternate_path(td, linux_emul_path, path, pathseg, pbuf, - cflag, dfd)); + retval = kern_alternate_path(td, linux_emul_path, path, pathseg, pbuf, + cflag, dfd); + + LIN_SDT_PROBE(util, linux_emul_convpath, return, retval, 0, 0, 0, 0); + + return (retval); } void @@ -85,12 +141,16 @@ linux_msg(const struct thread *td, const va_list ap; struct proc *p; + LIN_SDT_PROBE(util, linux_msg, entry, fmt, 0, 0, 0, 0); + p = td->td_proc; printf("linux: pid %d (%s): ", (int)p->p_pid, p->p_comm); va_start(ap, fmt); vprintf(fmt, ap); va_end(ap); printf("\n"); + + LIN_SDT_PROBE(util, linux_msg, return, 0, 0, 0, 0, 0); } struct device_element @@ -113,13 +173,26 @@ linux_driver_get_name_dev(device_t dev) struct device_element *de; const char *device_name = device_get_name(dev); - if (device_name == NULL) + LIN_SDT_PROBE(util, linux_driver_get_name_dev, entry, dev, + device_name, 0, 0, 0); + + if (device_name == NULL) { + LIN_SDT_PROBE(util, linux_driver_get_name_dev, nullcall, 0, 0, + 0, 0, 0); + LIN_SDT_PROBE(util, linux_driver_get_name_dev, return, NULL, + 0, 0, 0, 0); return NULL; + } TAILQ_FOREACH(de, &devices, list) { - if (strcmp(device_name, de->entry.bsd_driver_name) == 0) + if (strcmp(device_name, de->entry.bsd_driver_name) == 0) { + LIN_SDT_PROBE(util, linux_driver_get_name_dev, return, + de->entry.linux_driver_name, 0, 0, 0, 0); return (de->entry.linux_driver_name); + } } + LIN_SDT_PROBE(util, linux_driver_get_name_dev, return, NULL, 0, 0, 0, + 0); return NULL; } @@ -128,8 +201,16 @@ linux_driver_get_major_minor(char *node, { struct device_element *de; - if (node == NULL || major == NULL || minor == NULL) + LIN_SDT_PROBE(util, linux_driver_get_major_minor, entry, node, major, + minor, 0, 0); + + if (node == NULL || major == NULL || minor == NULL) { + LIN_SDT_PROBE(util, linux_driver_get_major_minor, nullcall, 0, + 0, 0, 0, 0); + LIN_SDT_PROBE(util, linux_driver_get_major_minor, return, 1, + *major, *minor, 0, 0); return 1; + } if (strlen(node) > strlen("pts/") && strncmp(node, "pts/", strlen("pts/")) == 0) { @@ -143,6 +224,9 @@ linux_driver_get_major_minor(char *node, devno = strtoul(node + strlen("pts/"), NULL, 10); *major = 136 + (devno / 256); *minor = devno % 256; + + LIN_SDT_PROBE(util, linux_driver_get_major_minor, return, 0, + *major, *minor, 0, 0); return 0; } @@ -150,21 +234,30 @@ linux_driver_get_major_minor(char *node, if (strcmp(node, de->entry.bsd_device_name) == 0) { *major = de->entry.linux_major; *minor = de->entry.linux_minor; + + LIN_SDT_PROBE(util, linux_driver_get_major_minor, + return, 0, *major, *minor, 0, 0); return 0; } } + LIN_SDT_PROBE(util, linux_driver_get_major_minor, notfound, node, 0, 0, + 0, 0); + LIN_SDT_PROBE(util, linux_driver_get_major_minor, return, 1, *major, + *minor, 0, 0); return 1; } char * -linux_get_char_devices() +linux_get_char_devices(void) { struct device_element *de; char *temp, *string, *last; char formated[256]; int current_size = 0, string_size = 1024; + LIN_SDT_PROBE(util, linux_get_char_devices, entry, 0, 0, 0, 0, 0); + string = malloc(string_size, M_LINUX, M_WAITOK); string[0] = '\000'; last = ""; @@ -191,13 +284,19 @@ linux_get_char_devices() } } + LIN_SDT_PROBE(util, linux_get_char_devices, return, string, 0, 0, 0, 0); return string; } void linux_free_get_char_devices(char *string) { + + LIN_SDT_PROBE(util, linux_get_char_devices, entry, string, 0, 0, 0, 0); + free(string, M_LINUX); + + LIN_SDT_PROBE(util, linux_get_char_devices, return, 0, 0, 0, 0, 0); } static int linux_major_starting = 200; @@ -207,11 +306,16 @@ linux_device_register_handler(struct lin { struct device_element *de; - if (d == NULL) + LIN_SDT_PROBE(util, linux_device_register_handler, entry, d, 0, 0, 0, + 0); + + if (d == NULL) { + LIN_SDT_PROBE(util, linux_device_register_handler, return, + EINVAL, 0, 0, 0, 0); return (EINVAL); + } - de = malloc(sizeof(*de), - M_LINUX, M_WAITOK); + de = malloc(sizeof(*de), M_LINUX, M_WAITOK); if (d->linux_major < 0) { d->linux_major = linux_major_starting++; } @@ -220,6 +324,8 @@ linux_device_register_handler(struct lin /* Add the element to the list, sorted on span. */ TAILQ_INSERT_TAIL(&devices, de, list); + LIN_SDT_PROBE(util, linux_device_register_handler, return, 0, 0, 0, 0, + 0); return (0); } @@ -228,16 +334,27 @@ linux_device_unregister_handler(struct l { struct device_element *de; - if (d == NULL) + LIN_SDT_PROBE(util, linux_device_unregister_handler, entry, d, 0, 0, 0, + 0); + + if (d == NULL) { + LIN_SDT_PROBE(util, linux_device_unregister_handler, return, + EINVAL, 0, 0, 0, 0); return (EINVAL); + } TAILQ_FOREACH(de, &devices, list) { if (bcmp(d, &de->entry, sizeof(*d)) == 0) { TAILQ_REMOVE(&devices, de, list); free(de, M_LINUX); + + LIN_SDT_PROBE(util, linux_device_unregister_handler, + return, 0, 0, 0, 0, 0); return (0); } } + LIN_SDT_PROBE(util, linux_device_unregister_handler, return, EINVAL, 0, + 0, 0, 0); return (EINVAL); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200811281449.mASEnQI3021670>