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