? gnu/lib/libstdc++/config.cache ? gnu/lib/libstdc++/config.log ? sbin/pfctl/- ? sbin/pfctl/dump ? sbin/pfctl/parse.c ? sbin/pfctl/pfctl ? sbin/pfctl/pfctl.cat8 ? sbin/pfctl/pfctl.core ? sys/arch/amd64/compile/DEBUG ? sys/arch/amd64/compile/PROFILED ? sys/arch/amd64/conf/DEBUG ? sys/arch/amd64/conf/PROFILED ? sys/dev/gmon.out ? sys/net/bfd.h ? usr.bin/mandoc/mandoc ? usr.bin/mandoc/mandoc.cat1 ? usr.sbin/vi.core ? usr.sbin/dvmrpctl/dvmrpctl ? usr.sbin/dvmrpctl/dvmrpctl.cat8 ? usr.sbin/dvmrpd/dvmrpd ? usr.sbin/dvmrpd/dvmrpd.cat8 ? usr.sbin/dvmrpd/dvmrpd.conf.cat5 ? usr.sbin/dvmrpd/ktrace.out ? usr.sbin/dvmrpd/parse.c ? usr.sbin/ospfctl/ospfctl ? usr.sbin/ospfctl/ospfctl.cat8 ? usr.sbin/ospfd/ospfd ? usr.sbin/ospfd/ospfd.cat8 ? usr.sbin/ospfd/ospfd.conf.cat5 ? usr.sbin/ospfd/parse.c ? usr.sbin/relayd/parse.c ? usr.sbin/relayd/relayd.cat8 ? usr.sbin/relayd/relayd.conf.cat5 ? usr.sbin/relayd/y.tab.h Index: sys/arch/amd64/conf/GENERIC =================================================================== RCS file: /cvs/src/sys/arch/amd64/conf/GENERIC,v retrieving revision 1.302 diff -u -p -r1.302 GENERIC --- sys/arch/amd64/conf/GENERIC 8 Sep 2010 16:04:35 -0000 1.302 +++ sys/arch/amd64/conf/GENERIC 23 Sep 2010 00:38:55 -0000 @@ -26,6 +26,8 @@ option NTFS # NTFS support config bsd swap generic +makeoptions DEBUG="-g" + mainbus0 at root bios0 at mainbus? Index: sys/dev/pci/if_ix.c =================================================================== RCS file: /cvs/src/sys/dev/pci/if_ix.c,v retrieving revision 1.44 diff -u -p -r1.44 if_ix.c --- sys/dev/pci/if_ix.c 27 Aug 2010 08:24:53 -0000 1.44 +++ sys/dev/pci/if_ix.c 23 Sep 2010 00:38:58 -0000 @@ -37,6 +37,8 @@ #include #include +#include + /********************************************************************* * Driver version *********************************************************************/ @@ -2193,6 +2195,7 @@ ixgbe_txeof(struct tx_ring *txr) uint first, last, done, num_avail; struct ixgbe_tx_buf *tx_buffer; struct ixgbe_legacy_tx_desc *tx_desc; + int count = 0; if (txr->tx_avail == sc->num_tx_desc) return FALSE; @@ -2233,6 +2236,7 @@ ixgbe_txeof(struct tx_ring *txr) tx_buffer->map); m_freem(tx_buffer->m_head); tx_buffer->m_head = NULL; + count++; } if (++first == sc->num_tx_desc) @@ -2252,6 +2256,8 @@ ixgbe_txeof(struct tx_ring *txr) break; } + ktrkern_log(NULL, 17, count); + bus_dmamap_sync(txr->txdma.dma_tag, txr->txdma.dma_map, 0, txr->txdma.dma_map->dm_mapsize, BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); @@ -2827,6 +2833,9 @@ ixgbe_rxeof(struct rx_ring *rxr, int cou i = 0; } rxr->next_to_check = i; + + ktrkern_log(NULL, 16, ((0 - count) << 16) | + ifp->if_data.ifi_mclpool[0].mcl_cwm); if (!(staterr & IXGBE_RXD_STAT_DD)) return FALSE; Index: sys/kern/kern_clock.c =================================================================== RCS file: /cvs/src/sys/kern/kern_clock.c,v retrieving revision 1.71 diff -u -p -r1.71 kern_clock.c --- sys/kern/kern_clock.c 20 Aug 2010 22:03:22 -0000 1.71 +++ sys/kern/kern_clock.c 23 Sep 2010 00:38:58 -0000 @@ -297,6 +297,8 @@ hardclock(struct clockframe *frame) BUMPTIME(&time, delta); BUMPTIME(&mono_time, delta); + if (time.tv_sec != time_second) + ktrkern_log(NULL, 18, time.tv_sec); time_second = time.tv_sec; time_uptime = mono_time.tv_sec; #else Index: sys/kern/kern_ktrace.c =================================================================== RCS file: /cvs/src/sys/kern/kern_ktrace.c,v retrieving revision 1.49 diff -u -p -r1.49 kern_ktrace.c --- sys/kern/kern_ktrace.c 26 Jul 2010 01:56:27 -0000 1.49 +++ sys/kern/kern_ktrace.c 23 Sep 2010 00:38:58 -0000 @@ -45,6 +45,7 @@ #include #include #include +#include #include #include @@ -59,6 +60,116 @@ int ktrsetchildren(struct proc *, struct int ktrwrite(struct proc *, struct ktr_header *); int ktrcanset(struct proc *, struct proc *); + +/* + * special fast ring for kernel events + */ +int ktrkern_active; +struct ktrkern_event *ktrkern_buf, *ktrkern_buf_start, *ktrkern_buf_end; +int ktrkern_flushing; +int ktrkern_bufsize = 32768; +struct mutex ktrkern_mtx = MUTEX_INITIALIZER(IPL_HIGH); +struct vnode *ktrkern_vp; +void ktrkern_flush(void); + +void +ktrkern_log(struct proc *p, int event, unsigned long data) +{ + struct ktrkern_event *kev; + + mtx_enter(&ktrkern_mtx); + if (ktrkern_active && ktrkern_buf < ktrkern_buf_end) { + kev = ktrkern_buf++; + ktrinitheader(&kev->ktr_head, p ? p : &proc0, KTR_KERN); + kev->ktr_stamp = rdtsc(); + kev->ktr_event = event; + kev->ktr_data = data; + /* start flushing at half way full */ + if (ktrkern_buf_end - ktrkern_buf < ktrkern_bufsize / 2 && + !ktrkern_flushing) { + workq_add_task(NULL, 0, (workq_fn)ktrkern_flush, + NULL, NULL); + } + } + mtx_leave(&ktrkern_mtx); +} + +void +ktrkern_flush(void) +{ + struct vnode *vp = ktrkern_vp; + struct proc *p = curproc; + struct ktrkern_event *start, *end, *realend; + struct uio auio; + struct iovec aiov[2]; + int error; + int len; + + if (vp == NULL) + return; + + /* first copy out the front half */ + mtx_enter(&ktrkern_mtx); + start = ktrkern_buf_start; + end = ktrkern_buf; + realend = ktrkern_buf_end; + mtx_leave(&ktrkern_mtx); + + len = (char *)end - (char *)start; + auio.uio_iov = &aiov[0]; + auio.uio_offset = 0; + auio.uio_segflg = UIO_SYSSPACE; + auio.uio_rw = UIO_WRITE; + aiov[0].iov_base = start; + aiov[0].iov_len = len; + auio.uio_resid = len; + auio.uio_iovcnt = 1; + auio.uio_procp = p; + vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, p); + error = VOP_WRITE(vp, &auio, IO_UNIT|IO_APPEND, p->p_ucred); + if (error) + printf("error writing %d\n", error); + else { + /* + * now write out what we missed. we swizzle pointers around + * so that the buffer can (almost) always be used, + * without danger of corruption. + * the just written part above can now be reused. + */ + mtx_enter(&ktrkern_mtx); + start = end; + end = ktrkern_buf; + ktrkern_buf = ktrkern_buf_start; + ktrkern_buf_end = start - 1; + mtx_leave(&ktrkern_mtx); + + len = (char *)end - (char *)start; + auio.uio_iov = &aiov[0]; + auio.uio_offset = 0; + auio.uio_segflg = UIO_SYSSPACE; + auio.uio_rw = UIO_WRITE; + aiov[0].iov_base = start; + aiov[0].iov_len = len; + auio.uio_resid = len; + auio.uio_iovcnt = 1; + auio.uio_procp = p; + error = VOP_WRITE(vp, &auio, IO_UNIT|IO_APPEND, p->p_ucred); + } + + /* now make the whole buffer available again */ + mtx_enter(&ktrkern_mtx); + ktrkern_buf_end = realend; + ktrkern_flushing = 0; + mtx_leave(&ktrkern_mtx); + + if (error) { + vrele(vp); + ktrkern_vp = NULL; + } + VOP_UNLOCK(vp, 0, p); +} + + /* * Change the trace vnode in a correct way (to avoid races). */ @@ -297,10 +408,11 @@ sys_ktrace(struct proc *curp, void *v, r int descend = SCARG(uap, ops) & KTRFLAG_DESCEND; int ret = 0; int error = 0; + int flushing; struct nameidata nd; curp->p_traceflag |= KTRFAC_ACTIVE; - if (ops != KTROP_CLEAR) { + if (ops != KTROP_CLEAR && ops != KTROP_KERNCLEAR) { /* * an operation which requires a file argument. */ @@ -333,7 +445,36 @@ sys_ktrace(struct proc *curp, void *v, r } } goto done; + } else if (ops == KTROP_KERNCLEAR) { + if (ktrkern_vp) { + mtx_enter(&ktrkern_mtx); + flushing = ktrkern_flushing++; + ktrkern_active = 0; + mtx_leave(&ktrkern_mtx); + + /* flushing will not happen above if it's not active */ + if (!flushing) + ktrkern_flush(); + vrele(ktrkern_vp); + ktrkern_vp = 0; + } + } else if (ops == KTROP_KERN) { + if (ktrkern_vp) { + error = EBUSY; + goto done; + } + vref(vp); + ktrkern_vp = vp; + if (!ktrkern_buf_start) { + ktrkern_buf_start = malloc(ktrkern_bufsize * sizeof(*ktrkern_buf), + M_TEMP, M_WAITOK); + } + ktrkern_buf = ktrkern_buf_start; + ktrkern_buf_end = ktrkern_buf_start + ktrkern_bufsize - 1; + ktrkern_active = 1; + goto done; } + /* * need something to (un)trace (XXX - why is this here?) */ @@ -521,5 +662,6 @@ ktrcanset(struct proc *callp, struct pro return (0); } + #endif Index: sys/kern/kern_tc.c =================================================================== RCS file: /cvs/src/sys/kern/kern_tc.c,v retrieving revision 1.14 diff -u -p -r1.14 kern_tc.c --- sys/kern/kern_tc.c 20 Apr 2010 22:05:43 -0000 1.14 +++ sys/kern/kern_tc.c 23 Sep 2010 00:38:58 -0000 @@ -6,7 +6,7 @@ * this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp * ---------------------------------------------------------------------------- * - * $OpenBSD: kern_tc.c,v 1.14 2010/04/20 22:05:43 tedu Exp $ + * $OpenBSD: kern_tc.c,v 1.13 2010/01/14 23:12:11 schwarze Exp $ * $FreeBSD: src/sys/kern/kern_tc.c,v 1.148 2003/03/18 08:45:23 phk Exp $ */ @@ -19,6 +19,7 @@ #include #include #include +#include #ifdef __HAVE_TIMECOUNTER /* @@ -428,6 +429,9 @@ tc_windup(void) if (++ogen == 0) ogen = 1; th->th_generation = ogen; + + if (th->th_microtime.tv_sec != time_second) + ktrkern_log(NULL, 18, th->th_microtime.tv_sec); /* Go live with the new struct timehands. */ time_second = th->th_microtime.tv_sec; Index: sys/kern/kern_timeout.c =================================================================== RCS file: /cvs/src/sys/kern/kern_timeout.c,v retrieving revision 1.32 diff -u -p -r1.32 kern_timeout.c --- sys/kern/kern_timeout.c 4 Nov 2009 19:14:10 -0000 1.32 +++ sys/kern/kern_timeout.c 23 Sep 2010 00:38:58 -0000 @@ -33,6 +33,8 @@ #include #include /* _Q_INVALIDATE */ +#include + #ifdef DDB #include #include @@ -308,6 +310,8 @@ softclock(void *arg) { struct timeout *to; void (*fn)(void *); + + ktrkern_log(NULL, 20, 0); mtx_enter(&timeout_mutex); while (!CIRCQ_EMPTY(&timeout_todo)) { Index: sys/kern/uipc_mbuf.c =================================================================== RCS file: /cvs/src/sys/kern/uipc_mbuf.c,v retrieving revision 1.143 diff -u -p -r1.143 uipc_mbuf.c --- sys/kern/uipc_mbuf.c 15 Jul 2010 09:45:09 -0000 1.143 +++ sys/kern/uipc_mbuf.c 23 Sep 2010 00:38:58 -0000 @@ -322,6 +322,7 @@ m_cltick(void *arg) } int m_livelock; +u_int livelocks; int m_cldrop(struct ifnet *ifp, int pi) @@ -331,7 +332,7 @@ m_cldrop(struct ifnet *ifp, int pi) extern int ticks; int i; - if (m_livelock == 0 && ticks - m_clticks > 2) { + if (ticks - m_clticks > 1) { struct ifnet *aifp; /* @@ -341,23 +342,26 @@ m_cldrop(struct ifnet *ifp, int pi) * future. */ m_livelock = 1; - ifp->if_data.ifi_livelocks++; - liveticks = ticks; + livelocks++; + m_clticks = liveticks = ticks; TAILQ_FOREACH(aifp, &ifnet, if_list) { mclp = aifp->if_data.ifi_mclpool; for (i = 0; i < MCLPOOLS; i++) { - mclp[i].mcl_cwm = - max(mclp[i].mcl_cwm / 2, mclp[i].mcl_lwm); + int diff = max(mclp[i].mcl_cwm / 8, 2); + mclp[i].mcl_cwm = max(mclp[i].mcl_lwm, + mclp[i].mcl_cwm - diff); } } - } else if (m_livelock && ticks - liveticks > 5) + } else if (m_livelock && (ticks - liveticks) > 4) m_livelock = 0; /* Let the high water marks grow again */ mclp = &ifp->if_data.ifi_mclpool[pi]; if (m_livelock == 0 && ISSET(ifp->if_flags, IFF_RUNNING) && - mclp->mcl_alive <= 2 && mclp->mcl_cwm < mclp->mcl_hwm) { + mclp->mcl_alive <= 4 && mclp->mcl_cwm < mclp->mcl_hwm && + mclp->mcl_grown < ticks) { /* About to run out, so increase the current watermark */ mclp->mcl_cwm++; + mclp->mcl_grown = ticks; } else if (mclp->mcl_alive >= mclp->mcl_cwm) return (1); /* No more packets given */ Index: sys/net/if.h =================================================================== RCS file: /cvs/src/sys/net/if.h,v retrieving revision 1.118 diff -u -p -r1.118 if.h --- sys/net/if.h 27 Aug 2010 17:08:01 -0000 1.118 +++ sys/net/if.h 23 Sep 2010 00:38:58 -0000 @@ -108,6 +108,7 @@ struct if_clonereq { #define MCLPOOLS 7 /* number of cluster pools */ struct mclpool { + u_int mcl_grown; u_short mcl_alive; u_short mcl_hwm; u_short mcl_cwm; @@ -143,7 +144,6 @@ struct if_data { struct timeval ifi_lastchange; /* last operational state change */ struct mclpool ifi_mclpool[MCLPOOLS]; - u_int64_t ifi_livelocks; /* livelocks migitaged */ }; /* Index: sys/netinet/ip_input.c =================================================================== RCS file: /cvs/src/sys/netinet/ip_input.c,v retrieving revision 1.184 diff -u -p -r1.184 ip_input.c --- sys/netinet/ip_input.c 8 Sep 2010 08:34:42 -0000 1.184 +++ sys/netinet/ip_input.c 23 Sep 2010 00:38:58 -0000 @@ -1419,12 +1419,12 @@ ip_forward(m, srcrt) struct mbuf *m; int srcrt; { + struct mbuf mfake, *mcopy = NULL; struct ip *ip = mtod(m, struct ip *); struct sockaddr_in *sin; struct rtentry *rt; - int error, type = 0, code = 0, destmtu = 0; + int error, type = 0, code = 0, destmtu = 0, fake = 0, len; u_int rtableid = 0; - struct mbuf *mcopy; n_long dest; dest = 0; @@ -1469,11 +1469,16 @@ ip_forward(m, srcrt) /* * Save at most 68 bytes of the packet in case * we need to generate an ICMP message to the src. - * Pullup to avoid sharing mbuf cluster between m and mcopy. */ - mcopy = m_copym(m, 0, min(ntohs(ip->ip_len), 68), M_DONTWAIT); - if (mcopy) - mcopy = m_pullup(mcopy, min(ntohs(ip->ip_len), 68)); + bzero(&mfake.m_hdr, sizeof(mfake.m_hdr)); + mfake.m_type = m->m_type; + if (m_dup_pkthdr(&mfake, m) == 0) { + mfake.m_data = mfake.m_pktdat; + len = min(min(ntohs(ip->ip_len), 68), MHLEN); + m_copydata(m, 0, len, mfake.m_pktdat); + mfake.m_pkthdr.len = mfake.m_len = len; + fake = 1; + } ip->ip_ttl -= IPTTLDEC; @@ -1520,10 +1525,8 @@ ip_forward(m, srcrt) if (type) ipstat.ips_redirectsent++; else - goto freecopy; + goto free; } - if (mcopy == NULL) - goto freert; switch (error) { @@ -1562,7 +1565,7 @@ ip_forward(m, srcrt) * pf(4) blocked the packet. There is no need to send an ICMP * packet back since pf(4) takes care of it. */ - goto freecopy; + goto free; case ENOBUFS: /* * a router should not generate ICMP_SOURCEQUENCH as @@ -1570,16 +1573,18 @@ ip_forward(m, srcrt) * source quench could be a big problem under DoS attacks, * or the underlying interface is rate-limited. */ - goto freecopy; + goto free; } - icmp_error(mcopy, type, code, dest, destmtu); - goto freert; + if (fake) { + mcopy = m_copym(&mfake, 0, len, M_DONTWAIT); + if (mcopy) + icmp_error(mcopy, type, code, dest, destmtu); + } - freecopy: - if (mcopy) - m_free(mcopy); - freert: + free: + if (fake) + m_tag_delete_chain(&mfake); #ifndef SMALL_KERNEL if (ipmultipath && ipforward_rt.ro_rt && (ipforward_rt.ro_rt->rt_flags & RTF_MPATH)) { Index: sys/sys/ktrace.h =================================================================== RCS file: /cvs/src/sys/sys/ktrace.h,v retrieving revision 1.9 diff -u -p -r1.9 ktrace.h --- sys/sys/ktrace.h 17 May 2006 02:11:25 -0000 1.9 +++ sys/sys/ktrace.h 23 Sep 2010 00:38:59 -0000 @@ -1,4 +1,4 @@ -/* $OpenBSD: ktrace.h,v 1.9 2006/05/17 02:11:25 tedu Exp $ */ +/* $OpenBSD: ktrace.h,v 1.8 2003/06/02 23:28:21 millert Exp $ */ /* $NetBSD: ktrace.h,v 1.12 1996/02/04 02:12:29 christos Exp $ */ /* @@ -38,11 +38,13 @@ #define KTROP_SET 0 /* set trace points */ #define KTROP_CLEAR 1 /* clear trace points */ #define KTROP_CLEARFILE 2 /* stop all tracing to file */ -#define KTROP(o) ((o)&3) /* macro to extract operation */ +#define KTROP_KERN 3 +#define KTROP_KERNCLEAR 4 +#define KTROP(o) ((o)&0xff) /* macro to extract operation */ /* * flags (ORed in with operation) */ -#define KTRFLAG_DESCEND 4 /* perform op on all children too */ +#define KTRFLAG_DESCEND 0x100 /* perform op on all children too */ /* * ktrace record header @@ -56,6 +58,15 @@ struct ktr_header { caddr_t ktr_buf; }; +/* builtin header */ +struct ktrkern_event { + struct ktr_header ktr_head; + u_int64_t ktr_stamp; + int ktr_event; + long ktr_data; +}; + + /* * Test for kernel trace point */ @@ -134,6 +145,8 @@ struct ktr_csw { #define KTR_EMUL 7 /* record contains emulation name */ +#define KTR_KERN 8 + /* * kernel trace points (in p_traceflag) @@ -146,6 +159,7 @@ struct ktr_csw { #define KTRFAC_PSIG (1< size) { void *newm; @@ -210,26 +214,29 @@ main(int argc, char *argv[]) continue; switch (ktr_header.ktr_type) { case KTR_SYSCALL: - ktrsyscall((struct ktr_syscall *)m); + ktrsyscall(m); break; case KTR_SYSRET: - ktrsysret((struct ktr_sysret *)m); + ktrsysret(m); break; case KTR_NAMEI: ktrnamei(m, ktrlen); break; case KTR_GENIO: - ktrgenio((struct ktr_genio *)m, ktrlen); + ktrgenio(m, ktrlen); break; case KTR_PSIG: - ktrpsig((struct ktr_psig *)m); + ktrpsig(m); break; case KTR_CSW: - ktrcsw((struct ktr_csw *)m); + ktrcsw(m); break; case KTR_EMUL: ktremul(m, ktrlen); break; + case KTR_KERN: + ktrkern((struct ktrkern_event *)((char *)m - sizeof(struct ktr_header))); + break; } if (tail) (void)fflush(stdout); @@ -278,6 +285,9 @@ dumpheader(struct ktr_header *kth) case KTR_EMUL: type = "EMUL"; break; + case KTR_KERN: + type = "KERN"; + break; default: (void)snprintf(unknown, sizeof unknown, "UNKNOWN(%d)", kth->ktr_type); @@ -417,6 +427,56 @@ ktrsyscall(struct ktr_syscall *ktr) } } (void)printf(")\n"); +} + +static void +ktrkern(struct ktrkern_event *kev) +{ + char *ev = NULL; + + switch (kev->ktr_event) { + case 0: + ev = "sched off"; + case 1: + if (!ev) + ev = "sched on"; + printf(" cpu %d %s", (int)kev->ktr_data, ev); + break; + case 2: + printf(" workq %p", kev->ktr_data); + break; + case 3: + printf(" cpu %d stealing", (int)kev->ktr_data); + break; + case 4: + printf(" cost is %d", (int)kev->ktr_data); + break; + case 16: + printf(" %llu ix cwm %d count %d", kev->ktr_stamp, + (int)(kev->ktr_data & 0xffff), + (int)((kev->ktr_data >> 16) & 0xffff)); + break; + case 17: + printf(" %llu ix tx count %d", kev->ktr_stamp, + (int)kev->ktr_data); + break; + case 18: + printf(" %llu time_second %d", kev->ktr_stamp, + (int)kev->ktr_data); + break; + case 19: + printf(" %llu livelock %d", kev->ktr_stamp, + (int)kev->ktr_data); + break; + case 20: + printf(" %llu softclock", kev->ktr_stamp); + break; + default: + printf(" unknown %d %lx", kev->ktr_event, kev->ktr_data); + break; + } + printf("\n"); + } static void Index: usr.bin/ktrace/ktrace.c =================================================================== RCS file: /cvs/src/usr.bin/ktrace/ktrace.c,v retrieving revision 1.22 diff -u -p -r1.22 ktrace.c --- usr.bin/ktrace/ktrace.c 27 Oct 2009 23:59:39 -0000 1.22 +++ usr.bin/ktrace/ktrace.c 23 Sep 2010 00:38:59 -0000 @@ -55,17 +55,17 @@ int main(int argc, char *argv[]) { enum { NOTSET, CLEAR, CLEARALL } clear; - int append, ch, fd, inherit, ops, pidset, trpoints; + int append, ch, fd, inherit, flags, ops, pidset, trpoints; pid_t pid; char *tracefile; mode_t omask; struct stat sb; clear = NOTSET; - append = ops = pidset = inherit = pid = 0; + append = ops = flags = pidset = inherit = pid = 0; trpoints = DEF_POINTS; tracefile = DEF_TRACEFILE; - while ((ch = getopt(argc,argv,"aCcdf:g:ip:t:")) != -1) + while ((ch = getopt(argc,argv,"aCcdf:g:ikp:t:")) != -1) switch((char)ch) { case 'a': append = 1; @@ -78,7 +78,7 @@ main(int argc, char *argv[]) clear = CLEAR; break; case 'd': - ops |= KTRFLAG_DESCEND; + flags |= KTRFLAG_DESCEND; break; case 'f': tracefile = optarg; @@ -90,6 +90,9 @@ main(int argc, char *argv[]) case 'i': inherit = 1; break; + case 'k': + ops = KTROP_KERN; + break; case 'p': pid = rpid(optarg); pidset = 1; @@ -107,7 +110,8 @@ main(int argc, char *argv[]) argv += optind; argc -= optind; - if ((pidset && *argv) || (!pidset && !*argv && clear != CLEAR)) + if ((pidset && *argv) || (!pidset && !*argv && clear != CLEAR && + ops != KTROP_KERN)) usage(); if (inherit) @@ -116,12 +120,16 @@ main(int argc, char *argv[]) (void)signal(SIGSYS, no_ktrace); if (clear != NOTSET) { if (clear == CLEARALL) { - ops = KTROP_CLEAR | KTRFLAG_DESCEND; + if (ops) + ops = KTROP_KERNCLEAR; + else + ops = KTROP_CLEAR | KTRFLAG_DESCEND; trpoints = ALL_POINTS; pid = 1; - } else - ops |= pid ? KTROP_CLEAR : KTROP_CLEARFILE; + } else if (!ops) + ops = pid ? KTROP_CLEAR : KTROP_CLEARFILE; + ops |= flags; if (ktrace(tracefile, ops, trpoints, pid) < 0) err(1, "%s", tracefile); exit(0); @@ -144,7 +152,8 @@ main(int argc, char *argv[]) (void)umask(omask); (void)close(fd); - if (*argv) { + ops |= flags; + if (*argv) { if (ktrace(tracefile, ops, trpoints, getpid()) < 0) err(1, "%s", tracefile); execvp(argv[0], &argv[0]); Index: usr.bin/ktrace/ktrace.h =================================================================== RCS file: /cvs/src/usr.bin/ktrace/ktrace.h,v retrieving revision 1.3 diff -u -p -r1.3 ktrace.h --- usr.bin/ktrace/ktrace.h 3 Jun 2003 02:56:09 -0000 1.3 +++ usr.bin/ktrace/ktrace.h 23 Sep 2010 00:38:59 -0000 @@ -1,4 +1,4 @@ -/* * $OpenBSD: ktrace.h,v 1.3 2003/06/03 02:56:09 millert Exp $*/ +/* * $OpenBSD: ktrace.h,v 1.2 1996/06/26 05:34:47 deraadt Exp $*/ /*- * Copyright (c) 1988, 1993 * The Regents of the University of California. All rights reserved. @@ -33,6 +33,6 @@ #define DEF_POINTS (KTRFAC_SYSCALL | KTRFAC_SYSRET | KTRFAC_NAMEI | \ KTRFAC_GENIO | KTRFAC_PSIG | KTRFAC_EMUL) -#define ALL_POINTS (DEF_POINTS | KTRFAC_CSW) +#define ALL_POINTS (DEF_POINTS | KTRFAC_CSW | KTRFAC_KERN) #define DEF_TRACEFILE "ktrace.out" Index: usr.bin/systat/mbufs.c =================================================================== RCS file: /cvs/src/usr.bin/systat/mbufs.c,v retrieving revision 1.28 diff -u -p -r1.28 mbufs.c --- usr.bin/systat/mbufs.c 1 Aug 2010 05:30:13 -0000 1.28 +++ usr.bin/systat/mbufs.c 23 Sep 2010 00:39:00 -0000 @@ -349,9 +349,9 @@ showmbuf(struct if_info *ifi, int p, int #if NOTYET print_fld_uint(FLD_MB_RXDELAY, ifi->data.ifi_rxdelay); print_fld_uint(FLD_MB_TXDELAY, ifi->data.ifi_txdelay); -#endif if (ifi->data.ifi_livelocks) print_fld_size(FLD_MB_LLOCKS, ifi->data.ifi_livelocks); +#endif if (p >= 0 && p < mclpool_count) { struct mclpool *mp = &ifi->data.ifi_mclpool[p]; Index: usr.sbin/snmpd/mib.c =================================================================== RCS file: /cvs/src/usr.sbin/snmpd/mib.c,v retrieving revision 1.41 diff -u -p -r1.41 mib.c --- usr.sbin/snmpd/mib.c 20 Sep 2010 16:29:51 -0000 1.41 +++ usr.sbin/snmpd/mib.c 23 Sep 2010 00:39:02 -0000 @@ -1428,8 +1428,7 @@ mib_memiftable(struct oid *oid, struct b ber = ber_add_string(ber, kif->if_name); break; case 2: - ber = ber_add_integer(ber, kif->if_data.ifi_livelocks); - ber_set_header(ber, BER_CLASS_APPLICATION, SNMP_T_COUNTER64); + ber = ber_add_string(ber, 0); break; default: return (-1);