From owner-p4-projects@FreeBSD.ORG Fri May 30 04:17:21 2008 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 996391065730; Fri, 30 May 2008 04:17:20 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 907AA10656AC for ; Fri, 30 May 2008 04:17:20 +0000 (UTC) (envelope-from jb@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 66F498FC3F for ; Fri, 30 May 2008 04:17:19 +0000 (UTC) (envelope-from jb@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id m4U4HJNp056934 for ; Fri, 30 May 2008 04:17:19 GMT (envelope-from jb@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id m4U4HJ6J056932 for perforce@freebsd.org; Fri, 30 May 2008 04:17:19 GMT (envelope-from jb@freebsd.org) Date: Fri, 30 May 2008 04:17:19 GMT Message-Id: <200805300417.m4U4HJ6J056932@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to jb@freebsd.org using -f From: John Birrell To: Perforce Change Reviews Cc: Subject: PERFORCE change 142562 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 30 May 2008 04:17:22 -0000 http://perforce.freebsd.org/chv.cgi?CH=142562 Change 142562 by jb@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 #include #include #include ==== //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 -__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 @@ -86,6 +87,12 @@ #include +#ifdef KDTRACE_HOOKS +#include + +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 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 -__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 +#ifdef DDB_CTF +#include +#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 + 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 -__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 +#ifdef DDB_CTF +#include +#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 + 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); }