From owner-p4-projects@FreeBSD.ORG Mon Jul 21 04:55:17 2008 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 2FBF81065673; Mon, 21 Jul 2008 04:55:17 +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 BE3821065671 for ; Mon, 21 Jul 2008 04:55:16 +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 A63FD8FC1F for ; Mon, 21 Jul 2008 04:55:16 +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 m6L4tGuE040913 for ; Mon, 21 Jul 2008 04:55:16 GMT (envelope-from jb@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.2/8.14.1/Submit) id m6L4tGdI040911 for perforce@freebsd.org; Mon, 21 Jul 2008 04:55:16 GMT (envelope-from jb@freebsd.org) Date: Mon, 21 Jul 2008 04:55:16 GMT Message-Id: <200807210455.m6L4tGdI040911@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 145533 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: Mon, 21 Jul 2008 04:55:17 -0000 http://perforce.freebsd.org/chv.cgi?CH=145533 Change 145533 by jb@freebsd3 on 2008/07/21 04:54:34 For FreeBSD8 onward, use the per file data hooks instead of the buggy device clone implementation (which needs some lock love). Affected files ... .. //depot/projects/dtrace/src/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c#11 edit .. //depot/projects/dtrace/src/sys/cddl/dev/dtrace/dtrace_ioctl.c#25 edit .. //depot/projects/dtrace/src/sys/cddl/dev/dtrace/dtrace_load.c#33 edit .. //depot/projects/dtrace/src/sys/cddl/dev/dtrace/dtrace_unload.c#29 edit Differences ... ==== //depot/projects/dtrace/src/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c#11 (text) ==== @@ -3007,6 +3007,9 @@ case DIF_VAR_EXECARGS: { struct pargs *p_args = curthread->td_proc->p_args; + if (p_args == NULL) + return(0); + return (dtrace_dif_varstrz( (uintptr_t) p_args->ar_args, p_args->ar_length, state, mstate)); } @@ -15235,6 +15238,15 @@ } #endif +#if !defined(sun) +#if __FreeBSD_version >= 800039 +static void +dtrace_dtr(void *data __unused) +{ +} +#endif +#endif + /*ARGSUSED*/ static int #if defined(sun) @@ -15260,6 +15272,7 @@ #else cred_t *cred_p = NULL; +#if __FreeBSD_version < 800039 /* * The first minor device is the one that is cloned so there is * nothing more to do here. @@ -15275,6 +15288,7 @@ */ if (dev->si_drv1 != NULL) return (EBUSY); +#endif cred_p = dev->si_cred; #endif @@ -15286,9 +15300,11 @@ dtrace_cred2priv(cred_p, &priv, &uid, &zoneid); if (priv == DTRACE_PRIV_NONE) { #if !defined(sun) +#if __FreeBSD_version < 800039 /* Destroy the cloned device. */ destroy_dev(dev); #endif +#endif return (EACCES); } @@ -15320,8 +15336,12 @@ state = dtrace_state_create(devp, cred_p); #else state = dtrace_state_create(dev); +#if __FreeBSD_version < 800039 dev->si_drv1 = state; +#else + devfs_set_cdevpriv(state, dtrace_dtr); #endif +#endif mutex_exit(&cpu_lock); @@ -15334,9 +15354,11 @@ #endif mutex_exit(&dtrace_lock); #if !defined(sun) +#if __FreeBSD_version < 800039 /* Destroy the cloned device. */ destroy_dev(dev); #endif +#endif return (EAGAIN); } @@ -15362,11 +15384,16 @@ state = ddi_get_soft_state(dtrace_softstate, minor); #else +#if __FreeBSD_version < 800039 dtrace_state_t *state = dev->si_drv1; /* Check if this is not a cloned device. */ if (minor(dev) == 0) return (0); +#else + dtrace_state_t *state; + devfs_get_cdevpriv((void **) &state); +#endif #endif @@ -15386,7 +15413,11 @@ #if !defined(sun) kmem_free(state, 0); +#if __FreeBSD_version < 800039 dev->si_drv1 = NULL; +#else + devfs_clear_cdevpriv(); +#endif #endif } @@ -15401,8 +15432,10 @@ mutex_exit(&dtrace_lock); mutex_exit(&cpu_lock); +#if __FreeBSD_version < 800039 /* Schedule this cloned device to be destroyed. */ destroy_dev_sched(dev); +#endif return (0); } @@ -16436,16 +16469,20 @@ static d_ioctl_t dtrace_ioctl; static void dtrace_load(void *); static int dtrace_unload(void); +#if __FreeBSD_version < 800039 static void dtrace_clone(void *, struct ucred *, char *, int , struct cdev **); static struct clonedevs *dtrace_clones; /* Ptr to the array of cloned devices. */ static eventhandler_tag eh_tag; /* Event handler tag. */ +#else +static struct cdev *dtrace_dev; +#endif void dtrace_invop_init(void); void dtrace_invop_uninit(void); static struct cdevsw dtrace_cdevsw = { .d_version = D_VERSION, - .d_flags = D_NEEDMINOR, + .d_flags = D_TRACKCLOSE | D_NEEDMINOR, .d_close = dtrace_close, .d_ioctl = dtrace_ioctl, .d_open = dtrace_open, @@ -16453,7 +16490,9 @@ }; #include +#if __FreeBSD_version < 800039 #include +#endif #include #include #include ==== //depot/projects/dtrace/src/sys/cddl/dev/dtrace/dtrace_ioctl.c#25 (text+ko) ==== @@ -32,7 +32,12 @@ dtrace_ioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flags __unused, struct thread *td) { +#if __FreeBSD_version < 800039 dtrace_state_t *state = dev->si_drv1; +#else + dtrace_state_t *state; + devfs_get_cdevpriv((void **) &state); +#endif int error = 0; if (state == NULL) return (EINVAL); ==== //depot/projects/dtrace/src/sys/cddl/dev/dtrace/dtrace_load.c#33 (text+ko) ==== @@ -154,11 +154,15 @@ mutex_exit(&cpu_lock); +#if __FreeBSD_version < 800039 /* Enable device cloning. */ clone_setup(&dtrace_clones); /* Setup device cloning events. */ eh_tag = EVENTHANDLER_REGISTER(dev_clone, dtrace_clone, 0, 1000); +#else + dtrace_dev = make_dev(&dtrace_cdevsw, 0, UID_ROOT, GID_WHEEL, 0600, "dtrace/dtrace"); +#endif return; } ==== //depot/projects/dtrace/src/sys/cddl/dev/dtrace/dtrace_unload.c#29 (text+ko) ==== @@ -28,6 +28,7 @@ dtrace_state_t *state; int error = 0; +#if __FreeBSD_version < 800039 /* * Check if there is still an event handler callback * registered. @@ -40,6 +41,9 @@ /* Stop device cloning. */ clone_cleanup(&dtrace_clones); } +#else + destroy_dev(dtrace_dev); +#endif mutex_enter(&dtrace_provider_lock); mutex_enter(&dtrace_lock);