PERFORCE change 142562 for review

John Birrell jb at FreeBSD.org
Fri May 30 04:17:22 UTC 2008


http://perforce.freebsd.org/chv.cgi?CH=142562

Change 142562 by jb at freebsd3 on 2008/05/30 04:16:46

	IFdtrace

Affected files ...

.. //depot/projects/dtrace7/src/sys/kern/init_sysent.c#3 edit
.. //depot/projects/dtrace7/src/sys/kern/kern_ctf.c#2 edit
.. //depot/projects/dtrace7/src/sys/kern/kern_dtrace.c#7 edit
.. //depot/projects/dtrace7/src/sys/kern/kern_malloc.c#2 edit
.. //depot/projects/dtrace7/src/sys/kern/kern_proc.c#8 edit
.. //depot/projects/dtrace7/src/sys/kern/link_elf.c#4 edit
.. //depot/projects/dtrace7/src/sys/kern/link_elf_obj.c#4 edit

Differences ...

==== //depot/projects/dtrace7/src/sys/kern/init_sysent.c#3 (text+ko) ====

@@ -2,13 +2,12 @@
  * System call switch table.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * $FreeBSD: src/sys/kern/init_sysent.c,v 1.230.2.1 2008/04/10 09:40:06 dfr Exp $
+ * $FreeBSD$
  * created from FreeBSD: src/sys/kern/syscalls.master,v 1.233.2.1 2008/04/10 09:39:24 dfr Exp 
  */
 
 #include "opt_compat.h"
 
-#include <bsm/audit_kevents.h>
 #include <sys/param.h>
 #include <sys/sysent.h>
 #include <sys/sysproto.h>

==== //depot/projects/dtrace7/src/sys/kern/kern_ctf.c#2 (text+ko) ====

@@ -303,7 +303,7 @@
 	lc->typlenp = &ef->typlen;
 
 out:
-	VOP_UNLOCK(nd.ni_vp, 0);
+	VOP_UNLOCK(nd.ni_vp, 0, td);
 	vn_close(nd.ni_vp, FREAD, td->td_ucred, td);
 	VFS_UNLOCK_GIANT(vfslocked);
 

==== //depot/projects/dtrace7/src/sys/kern/kern_dtrace.c#7 (text+ko) ====

@@ -106,15 +106,3 @@
 }
 
 SYSINIT(kdtrace, SI_SUB_KDTRACE, SI_ORDER_FIRST, init_dtrace, NULL);
-
-#ifndef KDB
-/*
- * This is a stub for the kernel debugger for the DTrace actions to call
- * when the kernel has been built without KDB.
- */
-void
-kdb_enter(const char *why, const char *msg)
-{
-	printf("Cannot enter kernel debugger - No KDB in kernel.\n%s - %s\n", why, msg);
-}
-#endif

==== //depot/projects/dtrace7/src/sys/kern/kern_malloc.c#2 (text+ko) ====

@@ -43,9 +43,10 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/kern_malloc.c,v 1.162 2007/06/27 13:39:38 rwatson Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/kern_malloc.c,v 1.165 2008/05/23 00:43:36 jb Exp $");
 
 #include "opt_ddb.h"
+#include "opt_kdtrace.h"
 #include "opt_vm.h"
 
 #include <sys/param.h>
@@ -86,6 +87,12 @@
 
 #include <ddb/ddb.h>
 
+#ifdef KDTRACE_HOOKS
+#include <sys/dtrace_bsd.h>
+
+dtrace_malloc_probe_func_t	dtrace_malloc_probe;
+#endif
+
 /*
  * When realloc() is called, if the new size is sufficiently smaller than
  * the old size, realloc() will allocate a new, smaller block to avoid
@@ -255,6 +262,17 @@
 	}
 	if (zindx != -1)
 		mtsp->mts_size |= 1 << zindx;
+
+#ifdef KDTRACE_HOOKS
+	if (dtrace_malloc_probe != NULL) {
+		uint32_t probe_id = mtip->mti_probes[DTMALLOC_PROBE_MALLOC];
+		if (probe_id != 0)
+			(dtrace_malloc_probe)(probe_id,
+			    (uintptr_t) mtp, (uintptr_t) mtip,
+			    (uintptr_t) mtsp, size, zindx);
+	}
+#endif
+
 	critical_exit();
 }
 
@@ -283,6 +301,17 @@
 	mtsp = &mtip->mti_stats[curcpu];
 	mtsp->mts_memfreed += size;
 	mtsp->mts_numfrees++;
+
+#ifdef KDTRACE_HOOKS
+	if (dtrace_malloc_probe != NULL) {
+		uint32_t probe_id = mtip->mti_probes[DTMALLOC_PROBE_FREE];
+		if (probe_id != 0)
+			(dtrace_malloc_probe)(probe_id,
+			    (uintptr_t) mtp, (uintptr_t) mtip,
+			    (uintptr_t) mtsp, size, 0);
+	}
+#endif
+
 	critical_exit();
 }
 
@@ -804,6 +833,40 @@
 SYSCTL_INT(_kern, OID_AUTO, malloc_count, CTLFLAG_RD, &kmemcount, 0,
     "Count of kernel malloc types");
 
+void
+malloc_type_list(malloc_type_list_func_t *func, void *arg)
+{
+	struct malloc_type *mtp, **bufmtp;
+	int count, i;
+	size_t buflen;
+
+	mtx_lock(&malloc_mtx);
+restart:
+	mtx_assert(&malloc_mtx, MA_OWNED);
+	count = kmemcount;
+	mtx_unlock(&malloc_mtx);
+
+	buflen = sizeof(struct malloc_type *) * count;
+	bufmtp = malloc(buflen, M_TEMP, M_WAITOK);
+
+	mtx_lock(&malloc_mtx);
+
+	if (count < kmemcount) {
+		free(bufmtp, M_TEMP);
+		goto restart;
+	}
+
+	for (mtp = kmemstatistics, i = 0; mtp != NULL; mtp = mtp->ks_next, i++)
+		bufmtp[i] = mtp;
+
+	mtx_unlock(&malloc_mtx);
+
+	for (i = 0; i < count; i++)
+		(func)(bufmtp[i], arg);
+
+	free(bufmtp, M_TEMP);
+}
+
 #ifdef DDB
 DB_SHOW_COMMAND(malloc, db_show_malloc)
 {

==== //depot/projects/dtrace7/src/sys/kern/kern_proc.c#8 (text+ko) ====

@@ -79,33 +79,33 @@
 #include <vm/uma.h>
 
 SDT_PROVIDER_DEFINE(proc);
-SDT_PROBE_DEFINE(proc, kernel, ctor , entry);
-SDT_PROBE_ARGTYPE(proc, kernel, ctor , entry, 0, "struct proc *");
-SDT_PROBE_ARGTYPE(proc, kernel, ctor , entry, 1, "int");
-SDT_PROBE_ARGTYPE(proc, kernel, ctor , entry, 2, "void *");
-SDT_PROBE_ARGTYPE(proc, kernel, ctor , entry, 3, "int");
-SDT_PROBE_DEFINE(proc, kernel, ctor , return);
-SDT_PROBE_ARGTYPE(proc, kernel, ctor , return, 0, "struct proc *");
-SDT_PROBE_ARGTYPE(proc, kernel, ctor , return, 1, "int");
-SDT_PROBE_ARGTYPE(proc, kernel, ctor , return, 2, "void *");
-SDT_PROBE_ARGTYPE(proc, kernel, ctor , return, 3, "int");
-SDT_PROBE_DEFINE(proc, kernel, dtor , entry);
-SDT_PROBE_ARGTYPE(proc, kernel, dtor , entry, 0, "struct proc *");
-SDT_PROBE_ARGTYPE(proc, kernel, dtor , entry, 1, "int");
-SDT_PROBE_ARGTYPE(proc, kernel, dtor , entry, 2, "void *");
-SDT_PROBE_ARGTYPE(proc, kernel, dtor , entry, 3, "struct thread *");
-SDT_PROBE_DEFINE(proc, kernel, dtor , return);
-SDT_PROBE_ARGTYPE(proc, kernel, dtor , return, 0, "struct proc *");
-SDT_PROBE_ARGTYPE(proc, kernel, dtor , return, 1, "int");
-SDT_PROBE_ARGTYPE(proc, kernel, dtor , return, 2, "void *");
-SDT_PROBE_DEFINE(proc, kernel, init , entry);
-SDT_PROBE_ARGTYPE(proc, kernel, init , entry, 0, "struct proc *");
-SDT_PROBE_ARGTYPE(proc, kernel, init , entry, 1, "int");
-SDT_PROBE_ARGTYPE(proc, kernel, init , entry, 2, "int");
-SDT_PROBE_DEFINE(proc, kernel, init , return);
-SDT_PROBE_ARGTYPE(proc, kernel, init , return, 0, "struct proc *");
-SDT_PROBE_ARGTYPE(proc, kernel, init , return, 1, "int");
-SDT_PROBE_ARGTYPE(proc, kernel, init , return, 2, "int");
+SDT_PROBE_DEFINE(proc, kernel, ctor, entry);
+SDT_PROBE_ARGTYPE(proc, kernel, ctor, entry, 0, "struct proc *");
+SDT_PROBE_ARGTYPE(proc, kernel, ctor, entry, 1, "int");
+SDT_PROBE_ARGTYPE(proc, kernel, ctor, entry, 2, "void *");
+SDT_PROBE_ARGTYPE(proc, kernel, ctor, entry, 3, "int");
+SDT_PROBE_DEFINE(proc, kernel, ctor, return);
+SDT_PROBE_ARGTYPE(proc, kernel, ctor, return, 0, "struct proc *");
+SDT_PROBE_ARGTYPE(proc, kernel, ctor, return, 1, "int");
+SDT_PROBE_ARGTYPE(proc, kernel, ctor, return, 2, "void *");
+SDT_PROBE_ARGTYPE(proc, kernel, ctor, return, 3, "int");
+SDT_PROBE_DEFINE(proc, kernel, dtor, entry);
+SDT_PROBE_ARGTYPE(proc, kernel, dtor, entry, 0, "struct proc *");
+SDT_PROBE_ARGTYPE(proc, kernel, dtor, entry, 1, "int");
+SDT_PROBE_ARGTYPE(proc, kernel, dtor, entry, 2, "void *");
+SDT_PROBE_ARGTYPE(proc, kernel, dtor, entry, 3, "struct thread *");
+SDT_PROBE_DEFINE(proc, kernel, dtor, return);
+SDT_PROBE_ARGTYPE(proc, kernel, dtor, return, 0, "struct proc *");
+SDT_PROBE_ARGTYPE(proc, kernel, dtor, return, 1, "int");
+SDT_PROBE_ARGTYPE(proc, kernel, dtor, return, 2, "void *");
+SDT_PROBE_DEFINE(proc, kernel, init, entry);
+SDT_PROBE_ARGTYPE(proc, kernel, init, entry, 0, "struct proc *");
+SDT_PROBE_ARGTYPE(proc, kernel, init, entry, 1, "int");
+SDT_PROBE_ARGTYPE(proc, kernel, init, entry, 2, "int");
+SDT_PROBE_DEFINE(proc, kernel, init, return);
+SDT_PROBE_ARGTYPE(proc, kernel, init, return, 0, "struct proc *");
+SDT_PROBE_ARGTYPE(proc, kernel, init, return, 1, "int");
+SDT_PROBE_ARGTYPE(proc, kernel, init, return, 2, "int");
 
 MALLOC_DEFINE(M_PGRP, "pgrp", "process group header");
 MALLOC_DEFINE(M_SESSION, "session", "session header");
@@ -173,9 +173,9 @@
 	struct proc *p;
 
 	p = (struct proc *)mem;
-	SDT_PROBE(proc, kernel, ctor , entry, p, size, arg, flags, 0);
+	SDT_PROBE(proc, kernel, ctor, entry, p, size, arg, flags, 0);
 	EVENTHANDLER_INVOKE(process_ctor, p);
-	SDT_PROBE(proc, kernel, ctor , return, p, size, arg, flags, 0);
+	SDT_PROBE(proc, kernel, ctor, return, p, size, arg, flags, 0);
 	return (0);
 }
 
@@ -190,8 +190,8 @@
 
 	/* INVARIANTS checks go here */
 	p = (struct proc *)mem;
-        td = FIRST_THREAD_IN_PROC(p);
-	SDT_PROBE(proc, kernel, dtor , entry, p, size, arg, td, 0);
+	td = FIRST_THREAD_IN_PROC(p);
+	SDT_PROBE(proc, kernel, dtor, entry, p, size, arg, td, 0);
 	if (td != NULL) {
 #ifdef INVARIANTS
 		KASSERT((p->p_numthreads == 1),
@@ -210,7 +210,7 @@
 	EVENTHANDLER_INVOKE(process_dtor, p);
 	if (p->p_ksi != NULL)
 		KASSERT(! KSI_ONQ(p->p_ksi), ("SIGCHLD queue"));
-	SDT_PROBE(proc, kernel, dtor , return, p, size, arg, 0, 0);
+	SDT_PROBE(proc, kernel, dtor, return, p, size, arg, 0, 0);
 }
 
 /*
@@ -222,7 +222,7 @@
 	struct proc *p;
 
 	p = (struct proc *)mem;
-	SDT_PROBE(proc, kernel, init , entry, p, size, flags, 0, 0);
+	SDT_PROBE(proc, kernel, init, entry, p, size, flags, 0, 0);
 	p->p_sched = (struct p_sched *)&p[1];
 	bzero(&p->p_mtx, sizeof(struct mtx));
 	mtx_init(&p->p_mtx, "process lock", NULL, MTX_DEF | MTX_DUPOK);
@@ -230,7 +230,7 @@
 	TAILQ_INIT(&p->p_threads);	     /* all threads in proc */
 	EVENTHANDLER_INVOKE(process_init, p);
 	p->p_stats = pstats_alloc();
-	SDT_PROBE(proc, kernel, init , return, p, size, flags, 0, 0);
+	SDT_PROBE(proc, kernel, init, return, p, size, flags, 0, 0);
 	return (0);
 }
 

==== //depot/projects/dtrace7/src/sys/kern/link_elf.c#4 (text+ko) ====

@@ -25,8 +25,9 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/link_elf.c,v 1.93.2.1 2008/03/18 11:49:11 ru Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/link_elf.c,v 1.97 2008/05/23 00:49:39 jb Exp $");
 
+#include "opt_ddb.h"
 #include "opt_gdb.h"
 #include "opt_mac.h"
 
@@ -62,6 +63,10 @@
 
 #include <sys/link_elf.h>
 
+#ifdef DDB_CTF
+#include <net/zlib.h>
+#endif
+
 #include "linker_if.h"
 
 #define MAXSEGS 4
@@ -98,11 +103,18 @@
     long		ddbstrcnt;	/* number of bytes in string table */
     caddr_t		symbase;	/* malloc'ed symbold base */
     caddr_t		strbase;	/* malloc'ed string base */
+    caddr_t		ctftab;		/* CTF table */
+    long		ctfcnt;		/* number of bytes in CTF table */
+    caddr_t		ctfoff;		/* CTF offset table */
+    caddr_t		typoff;		/* Type offset table */
+    long		typlen;		/* Number of type entries. */
 #ifdef GDB
     struct link_map	gdb;		/* hooks for gdb */
 #endif
 } *elf_file_t;
 
+#include <kern/kern_ctf.c>
+
 static int	link_elf_link_common_finish(linker_file_t);
 static int	link_elf_link_preload(linker_class_t cls,
 				      const char*, linker_file_t*);
@@ -122,7 +134,7 @@
 				int (*)(const char *, void *),
 				void *);
 static int	link_elf_each_function_nameval(linker_file_t,
-				int (*)(linker_file_t, linker_symval_t*, void *),
+				linker_function_nameval_callback_t,
 				void *);
 static void	link_elf_reloc_local(linker_file_t);
 static Elf_Addr	elf_lookup(linker_file_t lf, Elf_Size symidx, int deps);
@@ -138,6 +150,7 @@
     KOBJMETHOD(linker_lookup_set,	link_elf_lookup_set),
     KOBJMETHOD(linker_each_function_name, link_elf_each_function_name),
     KOBJMETHOD(linker_each_function_nameval, link_elf_each_function_nameval),
+    KOBJMETHOD(linker_ctf_get,          link_elf_ctf_get),
     { 0, 0 }
 };
 
@@ -914,6 +927,12 @@
 	free(ef->symbase, M_LINKER);
     if (ef->strbase)
 	free(ef->strbase, M_LINKER);
+    if (ef->ctftab)
+	free(ef->ctftab, M_LINKER);
+    if (ef->ctfoff)
+	free(ef->ctfoff, M_LINKER);
+    if (ef->typoff)
+	free(ef->typoff, M_LINKER);
 }
 
 static void
@@ -1233,7 +1252,7 @@
 
 static int
 link_elf_each_function_nameval(linker_file_t file,
-    int (*callback)(linker_file_t, linker_symval_t *, void *), void *opaque)
+    linker_function_nameval_callback_t callback, void *opaque)
 {
 	linker_symval_t symval;
 	elf_file_t ef = (elf_file_t)file;
@@ -1247,7 +1266,7 @@
 			error = link_elf_symbol_values(file, (c_linker_sym_t) symp, &symval);
 			if (error)
 				return (error);
-			error = callback(file, &symval, opaque);
+			error = callback(file, i, &symval, opaque);
 			if (error)
 				return (error);
 		}

==== //depot/projects/dtrace7/src/sys/kern/link_elf_obj.c#4 (text+ko) ====

@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/link_elf_obj.c,v 1.95.2.1 2008/03/18 11:49:11 ru Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/link_elf_obj.c,v 1.99 2008/05/23 00:49:39 jb Exp $");
 
 #include "opt_ddb.h"
 #include "opt_mac.h"
@@ -58,6 +58,10 @@
 
 #include <sys/link_elf.h>
 
+#ifdef DDB_CTF
+#include <net/zlib.h>
+#endif
+
 #include "linker_if.h"
 
 typedef struct {
@@ -106,8 +110,16 @@
 	caddr_t		shstrtab;	/* Section name string table */
 	long		shstrcnt;	/* number of bytes in string table */
 
+	caddr_t		ctftab;		/* CTF table */
+	long		ctfcnt;		/* number of bytes in CTF table */
+	caddr_t		ctfoff;		/* CTF offset table */
+	caddr_t		typoff;		/* Type offset table */
+	long		typlen;		/* Number of type entries. */
+
 } *elf_file_t;
 
+#include <kern/kern_ctf.c>
+
 static int	link_elf_link_preload(linker_class_t cls,
 		    const char *, linker_file_t *);
 static int	link_elf_link_preload_finish(linker_file_t);
@@ -125,7 +137,7 @@
 static int	link_elf_each_function_name(linker_file_t,
 		    int (*)(const char *, void *), void *);
 static int	link_elf_each_function_nameval(linker_file_t,
-				int (*)(linker_file_t, linker_symval_t*, void *),
+				linker_function_nameval_callback_t,
 				void *);
 static void	link_elf_reloc_local(linker_file_t);
 
@@ -142,6 +154,7 @@
 	KOBJMETHOD(linker_lookup_set,		link_elf_lookup_set),
 	KOBJMETHOD(linker_each_function_name,	link_elf_each_function_name),
 	KOBJMETHOD(linker_each_function_nameval, link_elf_each_function_nameval),
+	KOBJMETHOD(linker_ctf_get,		link_elf_ctf_get),
 	{ 0, 0 }
 };
 
@@ -819,6 +832,12 @@
 			free(ef->relatab, M_LINKER);
 		if (ef->progtab)
 			free(ef->progtab, M_LINKER);
+		if (ef->ctftab)
+			free(ef->ctftab, M_LINKER);
+		if (ef->ctfoff)
+			free(ef->ctfoff, M_LINKER);
+		if (ef->typoff)
+			free(ef->typoff, M_LINKER);
 		if (file->filename != NULL)
 			preload_delete_name(file->filename);
 		/* XXX reclaim module memory? */
@@ -851,6 +870,12 @@
 		free(ef->ddbstrtab, M_LINKER);
 	if (ef->shstrtab)
 		free(ef->shstrtab, M_LINKER);
+	if (ef->ctftab)
+		free(ef->ctftab, M_LINKER);
+	if (ef->ctfoff)
+		free(ef->ctfoff, M_LINKER);
+	if (ef->typoff)
+		free(ef->typoff, M_LINKER);
 }
 
 static const char *
@@ -1074,7 +1099,7 @@
 
 static int
 link_elf_each_function_nameval(linker_file_t file,
-    int (*callback)(linker_file_t, linker_symval_t *, void *), void *opaque)
+    linker_function_nameval_callback_t callback, void *opaque)
 {
 	linker_symval_t symval;
 	elf_file_t ef = (elf_file_t)file;
@@ -1088,7 +1113,7 @@
 			error = link_elf_symbol_values(file, (c_linker_sym_t) symp, &symval);
 			if (error)
 				return (error);
-			error = callback(file, &symval, opaque);
+			error = callback(file, i, &symval, opaque);
 			if (error)
 				return (error);
 		}


More information about the p4-projects mailing list