Date: Fri, 8 May 2009 14:58:17 GMT From: Marko Zec <zec@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 161777 for review Message-ID: <200905081458.n48EwH52054756@repoman.freebsd.org>
index | next in thread | raw e-mail
http://perforce.freebsd.org/chv.cgi?CH=161777 Change 161777 by zec@zec_tpx32 on 2009/05/08 14:58:13 IFC @ 161774 The vimage branch is most probably still broken. Affected files ... .. //depot/projects/vimage/src/share/man/man4/if_bridge.4#2 integrate .. //depot/projects/vimage/src/share/man/man4/ubsec.4#2 integrate .. //depot/projects/vimage/src/sys/amd64/linux32/linux.h#12 integrate .. //depot/projects/vimage/src/sys/amd64/linux32/linux32_sysvec.c#17 integrate .. //depot/projects/vimage/src/sys/arm/arm/pmap.c#18 integrate .. //depot/projects/vimage/src/sys/arm/conf/NSLU.hints#2 integrate .. //depot/projects/vimage/src/sys/arm/include/pmap.h#9 integrate .. //depot/projects/vimage/src/sys/cddl/compat/opensolaris/kern/opensolaris.c#2 integrate .. //depot/projects/vimage/src/sys/cddl/compat/opensolaris/kern/opensolaris_misc.c#4 integrate .. //depot/projects/vimage/src/sys/cddl/compat/opensolaris/sys/vnode.h#6 integrate .. //depot/projects/vimage/src/sys/cddl/contrib/opensolaris/uts/common/fs/vnode.c#2 integrate .. //depot/projects/vimage/src/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c#3 integrate .. //depot/projects/vimage/src/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu.c#3 integrate .. //depot/projects/vimage/src/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c#9 integrate .. //depot/projects/vimage/src/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zil.c#3 integrate .. //depot/projects/vimage/src/sys/cddl/contrib/opensolaris/uts/common/sys/vnode.h#2 integrate .. //depot/projects/vimage/src/sys/compat/linux/linux_futex.c#12 integrate .. //depot/projects/vimage/src/sys/compat/linux/linux_ioctl.c#20 integrate .. //depot/projects/vimage/src/sys/compat/linux/linux_mib.c#6 integrate .. //depot/projects/vimage/src/sys/compat/linux/linux_mib.h#3 integrate .. //depot/projects/vimage/src/sys/compat/linux/linux_misc.c#30 integrate .. //depot/projects/vimage/src/sys/compat/linux/linux_socket.c#19 integrate .. //depot/projects/vimage/src/sys/compat/linux/linux_socket.h#3 integrate .. //depot/projects/vimage/src/sys/compat/linux/linux_stats.c#12 integrate .. //depot/projects/vimage/src/sys/compat/linux/linux_util.h#4 integrate .. //depot/projects/vimage/src/sys/compat/svr4/svr4_stat.c#7 integrate .. //depot/projects/vimage/src/sys/dev/ata/ata-pci.h#23 integrate .. //depot/projects/vimage/src/sys/dev/ata/chipsets/ata-siliconimage.c#5 integrate .. //depot/projects/vimage/src/sys/dev/ath/ah_osdep.c#8 integrate .. //depot/projects/vimage/src/sys/dev/ath/ah_osdep.h#6 integrate .. //depot/projects/vimage/src/sys/dev/ath/ath_hal/ar5211/ar5211_interrupts.c#2 integrate .. //depot/projects/vimage/src/sys/dev/ath/ath_hal/ar5212/ar5212_interrupts.c#2 integrate .. //depot/projects/vimage/src/sys/dev/ath/ath_hal/ar5416/ar5416_interrupts.c#3 integrate .. //depot/projects/vimage/src/sys/dev/ath/ath_hal/ar5416/ar5416_reset.c#7 integrate .. //depot/projects/vimage/src/sys/dev/ath/if_ath.c#36 integrate .. //depot/projects/vimage/src/sys/dev/ipw/if_ipw.c#15 integrate .. //depot/projects/vimage/src/sys/dev/iwi/if_iwi.c#16 integrate .. //depot/projects/vimage/src/sys/dev/sound/pci/ich.c#9 integrate .. //depot/projects/vimage/src/sys/dev/ubsec/ubsec.c#3 integrate .. //depot/projects/vimage/src/sys/dev/ubsec/ubsecreg.h#2 integrate .. //depot/projects/vimage/src/sys/dev/usb/serial/u3g.c#8 integrate .. //depot/projects/vimage/src/sys/geom/vinum/geom_vinum.c#7 integrate .. //depot/projects/vimage/src/sys/geom/vinum/geom_vinum.h#7 integrate .. //depot/projects/vimage/src/sys/geom/vinum/geom_vinum_plex.c#7 integrate .. //depot/projects/vimage/src/sys/geom/vinum/geom_vinum_raid5.c#5 integrate .. //depot/projects/vimage/src/sys/geom/vinum/geom_vinum_var.h#6 integrate .. //depot/projects/vimage/src/sys/i386/ibcs2/ibcs2_socksys.c#7 integrate .. //depot/projects/vimage/src/sys/i386/linux/linux.h#11 integrate .. //depot/projects/vimage/src/sys/i386/linux/linux_sysvec.c#13 integrate .. //depot/projects/vimage/src/sys/kern/init_main.c#26 integrate .. //depot/projects/vimage/src/sys/kern/kern_exit.c#30 integrate .. //depot/projects/vimage/src/sys/kern/kern_fork.c#25 integrate .. //depot/projects/vimage/src/sys/kern/kern_jail.c#26 integrate .. //depot/projects/vimage/src/sys/kern/kern_linker.c#26 integrate .. //depot/projects/vimage/src/sys/kern/kern_mib.c#19 integrate .. //depot/projects/vimage/src/sys/kern/kern_prot.c#15 integrate .. //depot/projects/vimage/src/sys/kern/kern_vimage.c#89 integrate .. //depot/projects/vimage/src/sys/kern/tty_ttydisc.c#7 integrate .. //depot/projects/vimage/src/sys/kern/uipc_socket.c#34 integrate .. //depot/projects/vimage/src/sys/kern/uipc_syscalls.c#25 integrate .. //depot/projects/vimage/src/sys/kern/vfs_vnops.c#23 integrate .. //depot/projects/vimage/src/sys/modules/linux/Makefile#6 integrate .. //depot/projects/vimage/src/sys/netinet/igmp.c#40 integrate .. //depot/projects/vimage/src/sys/netinet/sctp_crc32.c#13 integrate .. //depot/projects/vimage/src/sys/netinet/sctp_uio.h#24 integrate .. //depot/projects/vimage/src/sys/netinet/tcp_hostcache.c#37 integrate .. //depot/projects/vimage/src/sys/nlm/nlm_advlock.c#6 integrate .. //depot/projects/vimage/src/sys/sys/buf_ring.h#4 integrate .. //depot/projects/vimage/src/sys/sys/jail.h#13 integrate .. //depot/projects/vimage/src/sys/sys/kernel.h#18 integrate .. //depot/projects/vimage/src/sys/sys/param.h#51 integrate .. //depot/projects/vimage/src/sys/sys/proc.h#31 integrate .. //depot/projects/vimage/src/sys/sys/sysctl.h#36 integrate .. //depot/projects/vimage/src/sys/sys/termios.h#8 integrate .. //depot/projects/vimage/src/sys/sys/ucred.h#9 integrate .. //depot/projects/vimage/src/sys/sys/vimage.h#94 integrate .. //depot/projects/vimage/src/sys/vm/vm_fault.c#16 integrate Differences ... ==== //depot/projects/vimage/src/share/man/man4/if_bridge.4#2 (text+ko) ==== @@ -33,7 +33,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.\" $FreeBSD: src/share/man/man4/if_bridge.4,v 1.32 2008/09/08 03:28:26 thompsa Exp $ +.\" $FreeBSD: src/share/man/man4/if_bridge.4,v 1.34 2009/05/07 16:31:50 emaste Exp $ .\" .Dd September 17, 2007 .Dt IF_BRIDGE 4 @@ -342,7 +342,7 @@ will cause a bridge called .Dq Li bridge0 to be created, and will add the interfaces -.Dq Li ath0 +.Dq Li wlan0 and .Dq Li fxp0 to the bridge, and then enable packet forwarding. @@ -351,14 +351,15 @@ in ad-hoc mode). .Bd -literal -offset indent cloned_interfaces="bridge0" -ifconfig_bridge0="addm ath0 addm fxp0 up" +ifconfig_bridge0="addm wlan0 addm fxp0 up" .Ed .Pp For the bridge to forward packets all member interfaces and the bridge need to be up. The above example would also require: .Bd -literal -offset indent -ifconfig_ath0="up ssid my_ap mode 11g mediaopt hostap" +create_args_wlan0="wlanmode hostap" +ifconfig_wlan0="up ssid my_ap mode 11g" ifconfig_fxp0="up" .Ed .Pp ==== //depot/projects/vimage/src/share/man/man4/ubsec.4#2 (text+ko) ==== @@ -29,7 +29,7 @@ .\" ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.\" $FreeBSD: src/share/man/man4/ubsec.4,v 1.5 2006/04/01 10:56:36 brueffer Exp $ +.\" $FreeBSD: src/share/man/man4/ubsec.4,v 1.6 2009/05/08 14:09:31 philip Exp $ .\" .Dd April 1, 2006 .Dt UBSEC 4 @@ -102,6 +102,8 @@ Faster version of the BCM5820. .It Broadcom BCM5823 A BCM5822 with AES capability. +.It Broadcom BCM5825 +Faster version of the BCM5823. .El .Sh SEE ALSO .Xr crypt 3 , ==== //depot/projects/vimage/src/sys/amd64/linux32/linux.h#12 (text+ko) ==== @@ -27,7 +27,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $FreeBSD: src/sys/amd64/linux32/linux.h,v 1.25 2009/03/27 17:00:49 ambrisko Exp $ + * $FreeBSD: src/sys/amd64/linux32/linux.h,v 1.26 2009/05/07 09:39:20 dchagin Exp $ */ #ifndef _AMD64_LINUX_H_ @@ -669,14 +669,6 @@ #define LINUX_SENDMSG 16 #define LINUX_RECVMSG 17 -#define LINUX_AF_UNSPEC 0 -#define LINUX_AF_UNIX 1 -#define LINUX_AF_INET 2 -#define LINUX_AF_AX25 3 -#define LINUX_AF_IPX 4 -#define LINUX_AF_APPLETALK 5 -#define LINUX_AF_INET6 10 - #define LINUX_SOL_SOCKET 1 #define LINUX_SOL_IP 0 #define LINUX_SOL_IPX 256 ==== //depot/projects/vimage/src/sys/amd64/linux32/linux32_sysvec.c#17 (text+ko) ==== @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/amd64/linux32/linux32_sysvec.c,v 1.48 2009/05/02 10:06:49 dchagin Exp $"); +__FBSDID("$FreeBSD: src/sys/amd64/linux32/linux32_sysvec.c,v 1.49 2009/05/07 18:36:47 jamie Exp $"); #include "opt_compat.h" #ifndef COMPAT_IA32 @@ -1124,6 +1124,7 @@ linux_proc_exec, NULL, 1000); linux_szplatform = roundup(strlen(linux_platform) + 1, sizeof(char *)); + linux_osd_jail_register(); if (bootverbose) printf("Linux ELF exec handler installed\n"); } else @@ -1151,6 +1152,7 @@ EVENTHANDLER_DEREGISTER(process_exit, linux_exit_tag); EVENTHANDLER_DEREGISTER(schedtail, linux_schedtail_tag); EVENTHANDLER_DEREGISTER(process_exec, linux_exec_tag); + linux_osd_jail_deregister(); if (bootverbose) printf("Linux ELF exec handler removed\n"); } else ==== //depot/projects/vimage/src/sys/arm/arm/pmap.c#18 (text+ko) ==== @@ -147,7 +147,7 @@ #include "opt_vm.h" #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/arm/arm/pmap.c,v 1.107 2009/02/02 20:09:14 cognet Exp $"); +__FBSDID("$FreeBSD: src/sys/arm/arm/pmap.c,v 1.108 2009/05/07 05:42:13 alc Exp $"); #include <sys/param.h> #include <sys/systm.h> #include <sys/kernel.h> @@ -224,7 +224,6 @@ vm_offset_t kernel_vm_end = 0; struct pmap kernel_pmap_store; -pmap_t kernel_pmap; static pt_entry_t *csrc_pte, *cdst_pte; static vm_offset_t csrcp, cdstp; @@ -2337,7 +2336,6 @@ firstaddr, loadaddr)); virtual_avail = firstaddr; - kernel_pmap = &kernel_pmap_store; kernel_pmap->pm_l1 = l1; kernel_l1pa = l1pt->pv_pa; ==== //depot/projects/vimage/src/sys/arm/conf/NSLU.hints#2 (text+ko) ==== @@ -1,4 +1,4 @@ -# $FreeBSD: src/sys/arm/conf/NSLU.hints,v 1.1 2008/08/03 07:10:25 imp Exp $ +# $FreeBSD: src/sys/arm/conf/NSLU.hints,v 1.2 2009/05/06 20:24:17 cognet Exp $ # # Device wiring for the Linksys NSLU2 @@ -17,17 +17,17 @@ # NPE Hardware Queue Manager hint.ixpqmgr.0.at="ixp0" -# NPE wireless NIC's, requires ixpqmgr +# NPE wired NICs, requires ixpqmgr hint.npe.0.at="ixp0" -hint.npe.0.mac="A" -hint.npe.0.mii="A" +hint.npe.0.mac="B" +hint.npe.0.mii="B" hint.npe.0.phy=1 # The second MAC isn't used on the NSLU, but it needs to be configured or # we timeout on dhcp packets hint.npe.1.at="ixp0" -hint.npe.1.mac="B" -hint.npe.1.mii="A" -hint.npe.1.phy=0 +#hint.npe.1.mac="B" +#hint.npe.1.mii="A" +#hint.npe.1.phy=0 #not yet # RTC ==== //depot/projects/vimage/src/sys/arm/include/pmap.h#9 (text+ko) ==== @@ -44,7 +44,7 @@ * from: @(#)pmap.h 7.4 (Berkeley) 5/12/91 * from: FreeBSD: src/sys/i386/include/pmap.h,v 1.70 2000/11/30 * - * $FreeBSD: src/sys/arm/include/pmap.h,v 1.30 2008/11/06 16:20:27 raj Exp $ + * $FreeBSD: src/sys/arm/include/pmap.h,v 1.31 2009/05/07 05:42:13 alc Exp $ */ #ifndef _MACHINE_PMAP_H_ @@ -138,7 +138,8 @@ typedef struct pmap *pmap_t; #ifdef _KERNEL -extern pmap_t kernel_pmap; +extern struct pmap kernel_pmap_store; +#define kernel_pmap (&kernel_pmap_store) #define pmap_kernel() kernel_pmap #define PMAP_ASSERT_LOCKED(pmap) \ @@ -166,8 +167,6 @@ int pv_flags; /* flags (wired, etc...) */ } *pv_entry_t; -#define PV_ENTRY_NULL ((pv_entry_t) 0) - #ifdef _KERNEL boolean_t pmap_get_pde_pte(pmap_t, vm_offset_t, pd_entry_t **, pt_entry_t **); ==== //depot/projects/vimage/src/sys/cddl/compat/opensolaris/kern/opensolaris.c#2 (text+ko) ==== @@ -22,7 +22,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/sys/cddl/compat/opensolaris/kern/opensolaris.c,v 1.1 2008/05/23 22:39:28 jb Exp $ + * $FreeBSD: src/sys/cddl/compat/opensolaris/kern/opensolaris.c,v 1.2 2009/05/08 14:11:06 zec Exp $ * */ @@ -32,8 +32,10 @@ #include <sys/cpuvar.h> #include <sys/errno.h> #include <sys/kernel.h> +#include <sys/misc.h> #include <sys/module.h> #include <sys/mutex.h> +#include <sys/vimage.h> cpu_core_t cpu_core[MAXCPU]; kmutex_t cpu_lock; @@ -81,6 +83,7 @@ switch (type) { case MOD_LOAD: + utsname.nodename = G_hostname; break; case MOD_UNLOAD: ==== //depot/projects/vimage/src/sys/cddl/compat/opensolaris/kern/opensolaris_misc.c#4 (text+ko) ==== @@ -25,7 +25,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/cddl/compat/opensolaris/kern/opensolaris_misc.c,v 1.4 2008/11/17 20:49:29 pjd Exp $"); +__FBSDID("$FreeBSD: src/sys/cddl/compat/opensolaris/kern/opensolaris_misc.c,v 1.5 2009/05/08 14:11:06 zec Exp $"); #include <sys/param.h> #include <sys/kernel.h> @@ -37,11 +37,7 @@ char hw_serial[11] = "0"; struct opensolaris_utsname utsname = { -#ifdef VIMAGE - .nodename = "XXX" /* XXX FIXME!!! */ -#else - .nodename = hostname -#endif + .nodename = "unset" }; int ==== //depot/projects/vimage/src/sys/cddl/compat/opensolaris/sys/vnode.h#6 (text+ko) ==== @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/sys/cddl/compat/opensolaris/sys/vnode.h,v 1.10 2009/04/10 10:52:19 rwatson Exp $ + * $FreeBSD: src/sys/cddl/compat/opensolaris/sys/vnode.h,v 1.11 2009/05/07 23:02:15 kmacy Exp $ */ #ifndef _OPENSOLARIS_SYS_VNODE_H_ @@ -75,6 +75,7 @@ #define VN_HOLD(v) vref(v) #define VN_RELE(v) vrele(v) #define VN_URELE(v) vput(v) +#define VN_RELE_ASYNC(v, tq) vn_rele_async(v, tq); #define VOP_REALVP(vp, vpp, ct) (*(vpp) = (vp), 0) ==== //depot/projects/vimage/src/sys/cddl/contrib/opensolaris/uts/common/fs/vnode.c#2 (text+ko) ==== @@ -41,6 +41,7 @@ #include <sys/types.h> #include <sys/param.h> +#include <sys/proc.h> #include <sys/vnode.h> /* Extensible attribute (xva) routines. */ @@ -72,3 +73,139 @@ xoap = &xvap->xva_xoptattrs; return (xoap); } + +static STAILQ_HEAD(, vnode) vn_rele_async_list; +static struct mtx vn_rele_async_lock; +static struct cv vn_rele_async_cv; +static int vn_rele_list_length; +static int vn_rele_async_thread_exit; + +typedef struct { + struct vnode *stqe_next; +} vnode_link_t; + +/* + * Like vn_rele() except if we are going to call VOP_INACTIVE() then do it + * asynchronously using a taskq. This can avoid deadlocks caused by re-entering + * the file system as a result of releasing the vnode. Note, file systems + * already have to handle the race where the vnode is incremented before the + * inactive routine is called and does its locking. + * + * Warning: Excessive use of this routine can lead to performance problems. + * This is because taskqs throttle back allocation if too many are created. + */ +void +vn_rele_async(vnode_t *vp, taskq_t *taskq /* unused */) +{ + + KASSERT(vp != NULL, ("vrele: null vp")); + VFS_ASSERT_GIANT(vp->v_mount); + VI_LOCK(vp); + + if (vp->v_usecount > 1 || ((vp->v_iflag & VI_DOINGINACT) && + vp->v_usecount == 1)) { + vp->v_usecount--; + vdropl(vp); + return; + } + if (vp->v_usecount != 1) { +#ifdef DIAGNOSTIC + vprint("vrele: negative ref count", vp); +#endif + VI_UNLOCK(vp); + panic("vrele: negative ref cnt"); + } + /* + * We are exiting + */ + if (vn_rele_async_thread_exit != 0) { + vrele(vp); + return; + } + + mtx_lock(&vn_rele_async_lock); + + /* STAILQ_INSERT_TAIL */ + (*(vnode_link_t *)&vp->v_cstart).stqe_next = NULL; + *vn_rele_async_list.stqh_last = vp; + vn_rele_async_list.stqh_last = + &((vnode_link_t *)&vp->v_cstart)->stqe_next; + + /****************************************/ + vn_rele_list_length++; + if ((vn_rele_list_length % 100) == 0) + cv_signal(&vn_rele_async_cv); + mtx_unlock(&vn_rele_async_lock); + VI_UNLOCK(vp); +} + +static void +vn_rele_async_init(void *arg) +{ + + mtx_init(&vn_rele_async_lock, "valock", NULL, MTX_DEF); + STAILQ_INIT(&vn_rele_async_list); + + /* cv_init(&vn_rele_async_cv, "vacv"); */ + vn_rele_async_cv.cv_description = "vacv"; + vn_rele_async_cv.cv_waiters = 0; +} + +void +vn_rele_async_fini(void) +{ + + mtx_lock(&vn_rele_async_lock); + vn_rele_async_thread_exit = 1; + cv_signal(&vn_rele_async_cv); + while (vn_rele_async_thread_exit != 0) + cv_wait(&vn_rele_async_cv, &vn_rele_async_lock); + mtx_unlock(&vn_rele_async_lock); + mtx_destroy(&vn_rele_async_lock); +} + + +static void +vn_rele_async_cleaner(void) +{ + STAILQ_HEAD(, vnode) vn_tmp_list; + struct vnode *curvnode; + + STAILQ_INIT(&vn_tmp_list); + mtx_lock(&vn_rele_async_lock); + while (vn_rele_async_thread_exit == 0) { + STAILQ_CONCAT(&vn_tmp_list, &vn_rele_async_list); + vn_rele_list_length = 0; + mtx_unlock(&vn_rele_async_lock); + + while (!STAILQ_EMPTY(&vn_tmp_list)) { + curvnode = STAILQ_FIRST(&vn_tmp_list); + + /* STAILQ_REMOVE_HEAD */ + STAILQ_FIRST(&vn_tmp_list) = + ((vnode_link_t *)&curvnode->v_cstart)->stqe_next; + if (STAILQ_FIRST(&vn_tmp_list) == NULL) + vn_tmp_list.stqh_last = &STAILQ_FIRST(&vn_tmp_list); + /***********************/ + vrele(curvnode); + } + mtx_lock(&vn_rele_async_lock); + if (vn_rele_list_length == 0) + cv_timedwait(&vn_rele_async_cv, &vn_rele_async_lock, + hz/10); + } + + vn_rele_async_thread_exit = 0; + cv_broadcast(&vn_rele_async_cv); + mtx_unlock(&vn_rele_async_lock); + thread_exit(); +} + +static struct proc *vn_rele_async_proc; +static struct kproc_desc up_kp = { + "vaclean", + vn_rele_async_cleaner, + &vn_rele_async_proc +}; +SYSINIT(vaclean, SI_SUB_KTHREAD_UPDATE, SI_ORDER_FIRST, kproc_start, &up_kp); +SYSINIT(vn_rele_async_setup, SI_SUB_VFS, SI_ORDER_FIRST, vn_rele_async_init, NULL); ==== //depot/projects/vimage/src/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c#3 (text+ko) ==== @@ -131,6 +131,8 @@ #include <sys/kstat.h> #include <sys/sdt.h> +#include <vm/vm_pageout.h> + static kmutex_t arc_reclaim_thr_lock; static kcondvar_t arc_reclaim_thr_cv; /* used to signal reclaim thr */ static uint8_t arc_thread_exit; @@ -1710,14 +1712,23 @@ static void arc_do_user_evicts(void) { + static arc_buf_t *tmp_arc_eviction_list; + + /* + * Move list over to avoid LOR + */ +restart: mutex_enter(&arc_eviction_mtx); - while (arc_eviction_list != NULL) { - arc_buf_t *buf = arc_eviction_list; - arc_eviction_list = buf->b_next; + tmp_arc_eviction_list = arc_eviction_list; + arc_eviction_list = NULL; + mutex_exit(&arc_eviction_mtx); + + while (tmp_arc_eviction_list != NULL) { + arc_buf_t *buf = tmp_arc_eviction_list; + tmp_arc_eviction_list = buf->b_next; rw_enter(&buf->b_lock, RW_WRITER); buf->b_hdr = NULL; rw_exit(&buf->b_lock); - mutex_exit(&arc_eviction_mtx); if (buf->b_efunc != NULL) VERIFY(buf->b_efunc(buf) == 0); @@ -1725,9 +1736,10 @@ buf->b_efunc = NULL; buf->b_private = NULL; kmem_cache_free(buf_cache, buf); - mutex_enter(&arc_eviction_mtx); } - mutex_exit(&arc_eviction_mtx); + + if (arc_eviction_list != NULL) + goto restart; } /* @@ -1809,6 +1821,13 @@ #ifdef _KERNEL + /* + * If pages are needed or we're within 2048 pages + * of needing to page need to reclaim + */ + if (vm_pages_needed || (vm_paging_target() > -2048)) + return (1); + if (needfree) return (1); ==== //depot/projects/vimage/src/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu.c#3 (text+ko) ==== @@ -1199,6 +1199,9 @@ void dmu_fini(void) { +#ifdef _KERNEL + vn_rele_async_fini(); +#endif arc_fini(); dnode_fini(); dbuf_fini(); ==== //depot/projects/vimage/src/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c#9 (text+ko) ==== @@ -93,6 +93,7 @@ * pushing cached pages (which acquires range locks) and syncing out * cached atime changes. Third, zfs_zinactive() may require a new tx, * which could deadlock the system if you were already holding one. + * If you must call VN_RELE() within a tx then use VN_RELE_ASYNC(). * * (3) All range locks must be grabbed before calling dmu_tx_assign(), * as they can span dmu_tx_assign() calls. @@ -928,7 +929,11 @@ vfslocked = VFS_LOCK_GIANT(vp->v_vfsp); dmu_buf_rele(db, vzgd); zfs_range_unlock(rl); - VN_RELE(vp); + /* + * Release the vnode asynchronously as we currently have the + * txg stopped from syncing. + */ + VN_RELE_ASYNC(vp, NULL); zil_add_block(zgd->zgd_zilog, zgd->zgd_bp); kmem_free(zgd, sizeof (zgd_t)); VFS_UNLOCK_GIANT(vfslocked); @@ -959,7 +964,12 @@ if (zfs_zget(zfsvfs, lr->lr_foid, &zp) != 0) return (ENOENT); if (zp->z_unlinked) { - VN_RELE(ZTOV(zp)); + /* + * Release the vnode asynchronously as we currently have the + * txg stopped from syncing. + */ + VN_RELE_ASYNC(ZTOV(zp), NULL); + return (ENOENT); } @@ -1031,7 +1041,11 @@ } out: zfs_range_unlock(rl); - VN_RELE(ZTOV(zp)); + /* + * Release the vnode asynchronously as we currently have the + * txg stopped from syncing. + */ + VN_RELE_ASYNC(ZTOV(zp), NULL); return (error); } ==== //depot/projects/vimage/src/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zil.c#3 (text+ko) ==== @@ -1041,7 +1041,7 @@ if ((itx != NULL) && (itx->itx_lr.lrc_txg <= spa_last_synced_txg(zilog->zl_spa))) { (void) taskq_dispatch(zilog->zl_clean_taskq, - (void (*)(void *))zil_itx_clean, zilog, TQ_NOSLEEP); + (task_func_t *)zil_itx_clean, zilog, TQ_SLEEP); } mutex_exit(&zilog->zl_lock); } ==== //depot/projects/vimage/src/sys/cddl/contrib/opensolaris/uts/common/sys/vnode.h#2 (text+ko) ==== @@ -377,6 +377,10 @@ void xva_init(xvattr_t *); xoptattr_t *xva_getxoptattr(xvattr_t *); /* Get ptr to xoptattr_t */ +struct taskq; +void vn_rele_async(struct vnode *vp, struct taskq *taskq); +void vn_rele_async_fini(void); + /* * Flags to VOP_SETATTR/VOP_GETATTR. */ ==== //depot/projects/vimage/src/sys/compat/linux/linux_futex.c#12 (text+ko) ==== @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/compat/linux/linux_futex.c,v 1.21 2009/05/02 10:06:49 dchagin Exp $"); +__FBSDID("$FreeBSD: src/sys/compat/linux/linux_futex.c,v 1.22 2009/05/07 16:14:31 dchagin Exp $"); #if 0 __KERNEL_RCSID(1, "$NetBSD: linux_futex.c,v 1.7 2006/07/24 19:01:49 manu Exp $"); #endif @@ -43,6 +43,7 @@ #include <sys/systm.h> #include <sys/imgact.h> #include <sys/kernel.h> +#include <sys/ktr.h> #include <sys/lock.h> #include <sys/malloc.h> #include <sys/mutex.h> @@ -61,6 +62,7 @@ #endif #include <compat/linux/linux_futex.h> #include <compat/linux/linux_emul.h> +#include <compat/linux/linux_util.h> MALLOC_DEFINE(M_FUTEX, "futex", "Linux futexes"); MALLOC_DEFINE(M_FUTEX_WP, "futex wp", "Linux futexes wp"); @@ -131,11 +133,15 @@ FUTEXES_UNLOCK; FUTEX_UNLOCK(f); + LINUX_CTR2(sys_futex, "futex_put destroy uaddr %p ref %d", + f->f_uaddr, f->f_refcount); FUTEX_DESTROY(f); free(f, M_FUTEX); return; } + LINUX_CTR2(sys_futex, "futex_put uaddr %p ref %d", + f->f_uaddr, f->f_refcount); FUTEXES_UNLOCK; FUTEX_UNLOCK(f); } @@ -170,12 +176,15 @@ FUTEX_LOCK(f); *newf = f; + LINUX_CTR2(sys_futex, "futex_get uaddr %p ref %d", + uaddr, f->f_refcount); return (0); } } if (flags & FUTEX_DONTCREATE) { FUTEXES_UNLOCK; + LINUX_CTR1(sys_futex, "futex_get uaddr %p null", uaddr); return (0); } @@ -198,6 +207,8 @@ LIST_INSERT_HEAD(&futex_list, tmpf, f_list); FUTEXES_UNLOCK; + LINUX_CTR2(sys_futex, "futex_get uaddr %p ref %d new", + uaddr, tmpf->f_refcount); *newf = tmpf; return (0); } @@ -232,13 +243,21 @@ int error; FUTEX_ASSERT_LOCKED(f); + LINUX_CTR4(sys_futex, "futex_sleep enter uaddr %p wp %p timo %ld ref %d", + f->f_uaddr, wp, timeout, f->f_refcount); error = sx_sleep(wp, &f->f_lck, PCATCH, "futex", timeout); if (wp->wp_flags & FUTEX_WP_REQUEUED) { KASSERT(f != wp->wp_futex, ("futex != wp_futex")); + LINUX_CTR5(sys_futex, "futex_sleep out error %d uaddr %p w" + " %p requeued uaddr %p ref %d", + error, f->f_uaddr, wp, wp->wp_futex->f_uaddr, + wp->wp_futex->f_refcount); futex_put(f, NULL); f = wp->wp_futex; FUTEX_LOCK(f); - } + } else + LINUX_CTR3(sys_futex, "futex_sleep out error %d uaddr %p wp %p", + error, f->f_uaddr, wp); futex_put(f, wp); return (error); @@ -252,6 +271,8 @@ FUTEX_ASSERT_LOCKED(f); TAILQ_FOREACH_SAFE(wp, &f->f_waiting_proc, wp_list, wpt) { + LINUX_CTR3(sys_futex, "futex_wake uaddr %p wp %p ref %d", + f->f_uaddr, wp, f->f_refcount); wp->wp_flags |= FUTEX_WP_REMOVED; TAILQ_REMOVE(&f->f_waiting_proc, wp, wp_list); wakeup_one(wp); @@ -273,10 +294,14 @@ TAILQ_FOREACH_SAFE(wp, &f->f_waiting_proc, wp_list, wpt) { if (++count <= n) { + LINUX_CTR2(sys_futex, "futex_req_wake uaddr %p wp %p", + f->f_uaddr, wp); wp->wp_flags |= FUTEX_WP_REMOVED; TAILQ_REMOVE(&f->f_waiting_proc, wp, wp_list); wakeup_one(wp); } else { + LINUX_CTR3(sys_futex, "futex_requeue uaddr %p wp %p to %p", + f->f_uaddr, wp, f2->f_uaddr); wp->wp_flags |= FUTEX_WP_REQUEUED; /* Move wp to wp_list of f2 futex */ TAILQ_REMOVE(&f->f_waiting_proc, wp, wp_list); @@ -421,6 +446,8 @@ switch (args->op) { case LINUX_FUTEX_WAIT: + LINUX_CTR2(sys_futex, "WAIT val %d uaddr %p", + args->val, args->uaddr); #ifdef DEBUG if (ldebug(sys_futex)) printf(ARGS(sys_futex, "futex_wait val %d uaddr %p"), @@ -431,15 +458,14 @@ return (error); error = copyin(args->uaddr, &val, sizeof(val)); if (error) { + LINUX_CTR1(sys_futex, "WAIT copyin failed %d", + error); futex_put(f, wp); return (error); } if (val != args->val) { -#ifdef DEBUG - if (ldebug(sys_futex)) - printf(ARGS(sys_futex, "futex_wait uaddr %p WHOOPS %d != %d"), - args->uaddr, args->val, val); -#endif + LINUX_CTR3(sys_futex, "WAIT uaddr %p val %d != uval %d", + args->uaddr, args->val, val); futex_put(f, wp); return (EWOULDBLOCK); } @@ -449,6 +475,9 @@ case LINUX_FUTEX_WAKE: + LINUX_CTR2(sys_futex, "WAKE val %d uaddr %p", + args->val, args->uaddr); + /* * XXX: Linux is able to cope with different addresses * corresponding to the same mapped memory in the sleeping @@ -472,6 +501,11 @@ case LINUX_FUTEX_CMP_REQUEUE: + LINUX_CTR5(sys_futex, "CMP_REQUEUE uaddr %p " + "val %d val3 %d uaddr2 %p val2 %d", + args->uaddr, args->val, args->val3, args->uaddr2, + (int)(unsigned long)args->timeout); + #ifdef DEBUG if (ldebug(sys_futex)) printf(ARGS(sys_futex, "futex_cmp_requeue uaddr %p " @@ -505,16 +539,15 @@ } error = copyin(args->uaddr, &val, sizeof(val)); if (error) { + LINUX_CTR1(sys_futex, "CMP_REQUEUE copyin failed %d", + error); futex_put(f2, NULL); futex_put(f, NULL); return (error); } if (val != args->val3) { -#ifdef DEBUG - if (ldebug(sys_futex)) - printf(ARGS(sys_futex, "futex_cmp_requeue WHOOPS" - " VAL %d != UVAL %d"), args->val, val); -#endif + LINUX_CTR2(sys_futex, "CMP_REQUEUE val %d != uval %d", + args->val, val); futex_put(f2, NULL); futex_put(f, NULL); return (EAGAIN); @@ -528,6 +561,11 @@ case LINUX_FUTEX_WAKE_OP: + LINUX_CTR5(sys_futex, "WAKE_OP " + "uaddr %p op %d val %x uaddr2 %p val3 %x", + args->uaddr, args->op, args->val, + args->uaddr2, args->val3); + #ifdef DEBUG if (ldebug(sys_futex)) printf(ARGS(sys_futex, "futex_wake_op " ==== //depot/projects/vimage/src/sys/compat/linux/linux_ioctl.c#20 (text+ko) ==== @@ -30,7 +30,7 @@ #include "opt_compat.h" #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/compat/linux/linux_ioctl.c,v 1.147 2009/02/27 14:12:05 bz Exp $"); +__FBSDID("$FreeBSD: src/sys/compat/linux/linux_ioctl.c,v 1.148 2009/05/07 09:39:20 dchagin Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -77,6 +77,7 @@ #include <compat/linux/linux_ioctl.h> #include <compat/linux/linux_mib.h> +#include <compat/linux/linux_socket.h> #include <compat/linux/linux_util.h> CTASSERT(LINUX_IFNAMSIZ == IFNAMSIZ); ==== //depot/projects/vimage/src/sys/compat/linux/linux_mib.c#6 (text+ko) ==== @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/compat/linux/linux_mib.c,v 1.31 2009/05/04 19:06:05 jamie Exp $"); +__FBSDID("$FreeBSD: src/sys/compat/linux/linux_mib.c,v 1.34 2009/05/07 19:46:29 jamie Exp $"); #include <sys/param.h> #include <sys/kernel.h> @@ -35,9 +35,11 @@ #include <sys/sysctl.h> #include <sys/proc.h> #include <sys/malloc.h> +#include <sys/mount.h> #include <sys/jail.h> #include <sys/lock.h> #include <sys/mutex.h> +#include <sys/sx.h> #include "opt_compat.h" @@ -55,6 +57,8 @@ int pr_use_linux26; /* flag to determine whether to use 2.6 emulation */ }; +static unsigned linux_osd_jail_slot; + SYSCTL_NODE(_compat, OID_AUTO, linux, CTLFLAG_RW, 0, "Linux mode"); @@ -128,58 +132,306 @@ /* * Returns holding the prison mutex if return non-NULL. */ -static struct prison * -linux_get_prison(struct thread *td) +static struct linux_prison * +linux_get_prison(struct thread *td, struct prison **prp) { - register struct prison *pr; - register struct linux_prison *lpr; + struct prison *pr; + struct linux_prison *lpr; KASSERT(td == curthread, ("linux_get_prison() called on !curthread")); - if (!jailed(td->td_ucred)) + *prp = pr = td->td_ucred->cr_prison; + if (pr == NULL || !linux_osd_jail_slot) return (NULL); - pr = td->td_ucred->cr_prison; + mtx_lock(&pr->pr_mtx); + lpr = osd_jail_get(pr, linux_osd_jail_slot); + if (lpr == NULL) + mtx_unlock(&pr->pr_mtx); + return (lpr); +} + +/* + * Ensure a prison has its own Linux info. The prison should be locked on + * entrance and will be locked on exit (though it may get unlocked in the + * interrim). + */ +static int +linux_alloc_prison(struct prison *pr, struct linux_prison **lprp) +{ + struct linux_prison *lpr, *nlpr; + int error; + + /* If this prison already has Linux info, return that. */ + error = 0; + mtx_assert(&pr->pr_mtx, MA_OWNED); + lpr = osd_jail_get(pr, linux_osd_jail_slot); + if (lpr != NULL) + goto done; + /* + * Allocate a new info record. Then check again, in case something + * changed during the allocation. + */ + mtx_unlock(&pr->pr_mtx); + nlpr = malloc(sizeof(struct linux_prison), M_PRISON, M_WAITOK); + mtx_lock(&pr->pr_mtx); + lpr = osd_jail_get(pr, linux_osd_jail_slot); + if (lpr != NULL) { + free(nlpr, M_PRISON); + goto done; + } + error = osd_jail_set(pr, linux_osd_jail_slot, nlpr); + if (error) + free(nlpr, M_PRISON); + else { + lpr = nlpr; + mtx_lock(&osname_lock); + strncpy(lpr->pr_osname, linux_osname, LINUX_MAX_UTSNAME); + strncpy(lpr->pr_osrelease, linux_osrelease, LINUX_MAX_UTSNAME); + lpr->pr_oss_version = linux_oss_version; + lpr->pr_use_linux26 = linux_use_linux26; + mtx_unlock(&osname_lock); + } +done: >>> TRUNCATED FOR MAIL (1000 lines) <<<help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200905081458.n48EwH52054756>
