Date: Mon, 3 Feb 2014 10:31:44 +0000 (UTC) From: "Andrey V. Elsukov" <ae@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r261433 - in user/ae/inet6: bin/df cddl/contrib/opensolaris/cmd/zdb contrib/gcc/cp gnu/lib/libgcc lib/libc libexec/rtld-elf release release/amd64 release/i386 release/pkg_repos release/... Message-ID: <201402031031.s13AViXA028469@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: ae Date: Mon Feb 3 10:31:43 2014 New Revision: 261433 URL: http://svnweb.freebsd.org/changeset/base/261433 Log: Merge from head/ up to r260851. Added: user/ae/inet6/release/pkg_repos/ - copied from r260851, head/release/pkg_repos/ user/ae/inet6/share/man/man4/virtio_random.4 - copied unchanged from r260851, head/share/man/man4/virtio_random.4 user/ae/inet6/sys/dev/virtio/random/ - copied from r260851, head/sys/dev/virtio/random/ user/ae/inet6/sys/modules/virtio/random/ - copied from r260851, head/sys/modules/virtio/random/ Deleted: user/ae/inet6/release/amd64/pkg-stage.conf user/ae/inet6/release/i386/pkg-stage.conf Modified: user/ae/inet6/bin/df/df.1 user/ae/inet6/cddl/contrib/opensolaris/cmd/zdb/zdb.c user/ae/inet6/contrib/gcc/cp/ChangeLog.apple user/ae/inet6/contrib/gcc/cp/parser.c user/ae/inet6/gnu/lib/libgcc/Makefile user/ae/inet6/lib/libc/Makefile user/ae/inet6/libexec/rtld-elf/Makefile user/ae/inet6/release/Makefile user/ae/inet6/release/scripts/pkg-stage.sh user/ae/inet6/share/man/man4/Makefile user/ae/inet6/share/mk/bsd.libnames.mk user/ae/inet6/sys/amd64/conf/NOTES user/ae/inet6/sys/amd64/vmm/intel/vmcs.h user/ae/inet6/sys/amd64/vmm/intel/vmx.c user/ae/inet6/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c user/ae/inet6/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_traverse.c user/ae/inet6/sys/compat/freebsd32/freebsd32_misc.c user/ae/inet6/sys/conf/files.amd64 user/ae/inet6/sys/conf/files.i386 user/ae/inet6/sys/dev/ahci/ahci.c user/ae/inet6/sys/dev/usb/usb_dev.c user/ae/inet6/sys/dev/usb/usb_device.c user/ae/inet6/sys/i386/conf/NOTES user/ae/inet6/sys/kern/kern_event.c user/ae/inet6/sys/kern/uipc_sockbuf.c user/ae/inet6/sys/kern/uipc_syscalls.c user/ae/inet6/sys/mips/cavium/ciu.c user/ae/inet6/sys/modules/virtio/Makefile user/ae/inet6/sys/net/netmap_user.h user/ae/inet6/sys/netinet/in_mcast.c user/ae/inet6/sys/netinet6/in6.c user/ae/inet6/sys/netinet6/ip6_fastfwd.c user/ae/inet6/sys/sys/random.h user/ae/inet6/sys/sys/sf_base.h user/ae/inet6/sys/sys/sf_sync.h user/ae/inet6/sys/sys/socket.h user/ae/inet6/tools/tools/mcgrab/mcgrab.cc user/ae/inet6/usr.bin/killall/killall.c user/ae/inet6/usr.bin/ktrdump/ktrdump.c user/ae/inet6/usr.bin/script/script.c Directory Properties: user/ae/inet6/ (props changed) user/ae/inet6/cddl/ (props changed) user/ae/inet6/cddl/contrib/opensolaris/ (props changed) user/ae/inet6/contrib/gcc/ (props changed) user/ae/inet6/gnu/lib/ (props changed) user/ae/inet6/lib/libc/ (props changed) user/ae/inet6/share/man/man4/ (props changed) user/ae/inet6/sys/ (props changed) user/ae/inet6/sys/amd64/vmm/ (props changed) user/ae/inet6/sys/cddl/contrib/opensolaris/ (props changed) user/ae/inet6/sys/conf/ (props changed) Modified: user/ae/inet6/bin/df/df.1 ============================================================================== --- user/ae/inet6/bin/df/df.1 Mon Feb 3 08:15:09 2014 (r261432) +++ user/ae/inet6/bin/df/df.1 Mon Feb 3 10:31:43 2014 (r261433) @@ -29,7 +29,7 @@ .\" @(#)df.1 8.3 (Berkeley) 5/8/95 .\" $FreeBSD$ .\" -.Dd January 24, 2013 +.Dd January 16, 2014 .Dt DF 1 .Os .Sh NAME @@ -83,13 +83,13 @@ Use 1073741824 byte (1 Gibibyte) blocks This overrides any .Ev BLOCKSIZE specification from the environment. -.It Fl H +.It Fl h .Dq Human-readable output. Use unit suffixes: Byte, Kibibyte, Mebibyte, Gibibyte, Tebibyte and Pebibyte (based on powers of 1024) in order to reduce the number of digits to four or fewer. -.It Fl h +.It Fl H .Dq Human-readable output. Use unit suffixes: Byte, Kilobyte, Megabyte, Modified: user/ae/inet6/cddl/contrib/opensolaris/cmd/zdb/zdb.c ============================================================================== --- user/ae/inet6/cddl/contrib/opensolaris/cmd/zdb/zdb.c Mon Feb 3 08:15:09 2014 (r261432) +++ user/ae/inet6/cddl/contrib/opensolaris/cmd/zdb/zdb.c Mon Feb 3 10:31:43 2014 (r261433) @@ -3012,6 +3012,7 @@ zdb_read_block(char *thing, spa_t *spa) free(dup); return; } + i += p - &flagstr[i + 1]; /* skip over the number */ } } Modified: user/ae/inet6/contrib/gcc/cp/ChangeLog.apple ============================================================================== --- user/ae/inet6/contrib/gcc/cp/ChangeLog.apple Mon Feb 3 08:15:09 2014 (r261432) +++ user/ae/inet6/contrib/gcc/cp/ChangeLog.apple Mon Feb 3 10:31:43 2014 (r261433) @@ -302,15 +302,6 @@ (cp_parser_objc_declaration): Parses attribute list and passes it down to cp_parser_objc_class_interface/cp_parser_objc_protocol_declaration. -2007-07-24 Fariborz Jahanian <fjahanian@apple.com> - - Radar 5355344 - * cp-tree.h (cp_objc_protocol_id_list): New declaration - * cp-lang.c (cp_objc_protocol_id_list): New stub - * parser.c (cp_parser_type_name): Added code to disambiguate - conditional from a protocol type. - (cp_parser_objc_tentative_protocol_refs_opt): New - 2007-07-13 Fariborz Jahanian <fjahanian@apple.com> Radar 5277239 Modified: user/ae/inet6/contrib/gcc/cp/parser.c ============================================================================== --- user/ae/inet6/contrib/gcc/cp/parser.c Mon Feb 3 08:15:09 2014 (r261432) +++ user/ae/inet6/contrib/gcc/cp/parser.c Mon Feb 3 10:31:43 2014 (r261433) @@ -1827,10 +1827,6 @@ static tree cp_parser_objc_identifier_li /* APPLE LOCAL end radar 3803157 - objc attribute */ static tree cp_parser_objc_protocol_refs_opt (cp_parser *); -/* APPLE LOCAL begin radar 5355344 */ -static bool cp_parser_objc_tentative_protocol_refs_opt - (cp_parser *, tree *); -/* APPLE LOCAL end radar 5355344 */ static void cp_parser_objc_declaration (cp_parser *); static tree cp_parser_objc_statement @@ -17873,32 +17869,6 @@ cp_parser_objc_protocol_refs_opt (cp_par return protorefs; } -/* APPLE LOCAL begin radar 5355344 */ -/* This routine also parses a list of Objective-C protocol references; except that - if list is not valid, it returns FALSE and back-tracks parsing. */ - -static bool -cp_parser_objc_tentative_protocol_refs_opt (cp_parser* parser, tree *protorefs) -{ - *protorefs = NULL_TREE; - if(cp_lexer_next_token_is (parser->lexer, CPP_LESS)) - { - cp_parser_parse_tentatively (parser); - cp_lexer_consume_token (parser->lexer); /* Eat '<'. */ - *protorefs = cp_parser_objc_identifier_list (parser); - if (!cp_objc_protocol_id_list (*protorefs)) - { - cp_parser_abort_tentative_parse (parser); - return false; - } - if (cp_parser_parse_definitely (parser)) - cp_parser_require (parser, CPP_GREATER, "`>'"); - } - - return true; -} -/* APPLE LOCAL end radar 5355344 */ - /* Parse a Objective-C visibility specification. */ static void Modified: user/ae/inet6/gnu/lib/libgcc/Makefile ============================================================================== --- user/ae/inet6/gnu/lib/libgcc/Makefile Mon Feb 3 08:15:09 2014 (r261432) +++ user/ae/inet6/gnu/lib/libgcc/Makefile Mon Feb 3 10:31:43 2014 (r261433) @@ -119,8 +119,8 @@ LIB1ASMFUNCS = _dvmd_tls _bb_init_func .if ${MK_ARM_EABI} != "no" LIB2ADDEH = unwind-arm.c libunwind.S pr-support.c unwind-c.c # Some compilers generate __aeabi_ functions libgcc_s is missing -DPADD+= ${LIBGCC} -LDADD+= -lgcc +DPADD+= ${LIBCOMPILER_RT} +LDADD+= -lcompiler_rt .else LIB2FUNCS_EXTRA = floatunsidf.c floatunsisf.c .endif @@ -145,6 +145,7 @@ LIB1ASMFUNCS = __divxf3 __divdf3 __divsf __divsi3 __modsi3 __udivsi3 __umodsi3 __save_stack_nonlocal \ __nonlocal_goto __restore_stack_nonlocal __trampoline \ _fixtfdi _fixunstfdi _floatditf +LIB2FUNCS += _bswapsi2 _bswapdi2 LIB2ADDEH = unwind-ia64.c unwind-sjlj.c unwind-c.c .endif Modified: user/ae/inet6/lib/libc/Makefile ============================================================================== --- user/ae/inet6/lib/libc/Makefile Mon Feb 3 08:15:09 2014 (r261432) +++ user/ae/inet6/lib/libc/Makefile Mon Feb 3 10:31:43 2014 (r261433) @@ -40,11 +40,11 @@ CFLAGS+=${CANCELPOINTS_CFLAGS} .endif # -# Only link with static libgcc.a (no libgcc_eh.a). +# Link with static libcompiler_rt.a. # -DPADD+= ${LIBGCC} +DPADD+= ${LIBCOMPILER_RT} LDFLAGS+= -nodefaultlibs -LDADD+= -lgcc +LDADD+= -lcompiler_rt .if ${MK_SSP} != "no" LDADD+= -lssp_nonshared Modified: user/ae/inet6/libexec/rtld-elf/Makefile ============================================================================== --- user/ae/inet6/libexec/rtld-elf/Makefile Mon Feb 3 08:15:09 2014 (r261432) +++ user/ae/inet6/libexec/rtld-elf/Makefile Mon Feb 3 10:31:43 2014 (r261433) @@ -43,11 +43,12 @@ DPADD= ${LIBC_PIC} LDADD= -lc_pic .if ${MACHINE_CPUARCH} == "arm" && ${MK_ARM_EABI} != "no" -# Some of the required math functions (div & mod) are implemented in libgcc -# on ARM. The library also needs to be placed first to be correctly linked. -# As some of the functions are used before we have shared libraries. -DPADD+= ${LIBGCC} -LDADD+= -lgcc +# Some of the required math functions (div & mod) are implemented in +# libcompiler_rt on ARM. The library also needs to be placed first to be +# correctly linked. As some of the functions are used before we have +# shared libraries. +DPADD+= ${LIBCOMPILER_RT} +LDADD+= -lcompiler_rt .endif Modified: user/ae/inet6/release/Makefile ============================================================================== --- user/ae/inet6/release/Makefile Mon Feb 3 08:15:09 2014 (r261432) +++ user/ae/inet6/release/Makefile Mon Feb 3 10:31:43 2014 (r261433) @@ -224,9 +224,9 @@ packagesystem: base.txz kernel.txz ${EXT touch ${.TARGET} pkg-stage: -.if !defined(NOPKG) && exists(${.CURDIR}/${TARGET}/pkg-stage.conf) - sh ${.CURDIR}/scripts/pkg-stage.sh ${.CURDIR}/${TARGET}/pkg-stage.conf \ - ${REVISION} +.if !defined(NOPKG) + env REPOS_DIR=${.CURDIR}/pkg_repos/ \ + sh ${.CURDIR}/scripts/pkg-stage.sh mkdir -p ${.OBJDIR}/dvd/packages/repos/ cp ${.CURDIR}/scripts/FreeBSD_install_cdrom.conf \ ${.OBJDIR}/dvd/packages/repos/ Modified: user/ae/inet6/release/scripts/pkg-stage.sh ============================================================================== --- user/ae/inet6/release/scripts/pkg-stage.sh Mon Feb 3 08:15:09 2014 (r261432) +++ user/ae/inet6/release/scripts/pkg-stage.sh Mon Feb 3 10:31:43 2014 (r261433) @@ -5,24 +5,31 @@ set -e -usage() { - echo "$(basename ${0}) /path/to/pkg-stage.conf revision" - exit 1 -} - -if [ ! -e "${1}" ]; then - echo "Configuration file not specified." - echo - usage -fi - -if [ "$#" -lt 2 ]; then - usage -fi - -# Source config file for this architecture. -REVISION="${2}" -. "${1}" || exit 1 +export ASSUME_ALWAYS_YES=1 +export PKG_DBDIR="/tmp/pkg" +export PERMISSIVE="YES" +export REPO_AUTOUPDATE="NO" +export PKGCMD="/usr/sbin/pkg -d" + +DVD_PACKAGES="archivers/unzip +devel/subversion +devel/subversion-static +emulators/linux_base-f10 +misc/freebsd-doc-all +net/mpd5 +net/rsync +ports-mgmt/pkg +ports-mgmt/portmaster +shells/bash +shells/zsh +security/sudo +sysutils/screen +www/firefox +www/links +x11-drivers/xf86-video-vmware +x11/gnome2 +x11/kde4 +x11/xorg" # If NOPORTS is set for the release, do not attempt to build pkg(8). if [ ! -f /usr/ports/Makefile ]; then @@ -33,8 +40,13 @@ if [ ! -x /usr/local/sbin/pkg ]; then /usr/bin/make -C /usr/ports/ports-mgmt/pkg install clean fi +export PKG_ABI=$(pkg -vv | grep ^ABI | awk '{print $3}') +export PKG_CACHEDIR="dvd/packages/${PKG_ABI}" + /bin/mkdir -p ${PKG_CACHEDIR} +# Print pkg(8) information to make debugging easier. +${PKGCMD} -vv ${PKGCMD} update -f ${PKGCMD} fetch -d ${DVD_PACKAGES} Modified: user/ae/inet6/share/man/man4/Makefile ============================================================================== --- user/ae/inet6/share/man/man4/Makefile Mon Feb 3 08:15:09 2014 (r261432) +++ user/ae/inet6/share/man/man4/Makefile Mon Feb 3 10:31:43 2014 (r261433) @@ -543,6 +543,7 @@ MAN= aac.4 \ ${_virtio.4} \ ${_virtio_balloon.4} \ ${_virtio_blk.4} \ + ${_virtio_random.4} \ ${_virtio_scsi.4} \ vkbd.4 \ vlan.4 \ @@ -787,6 +788,7 @@ _nxge.4= nxge.4 _virtio.4= virtio.4 _virtio_balloon.4=virtio_balloon.4 _virtio_blk.4= virtio_blk.4 +_virtio_random.4= virtio_random.4 _virtio_scsi.4= virtio_scsi.4 _vmx.4= vmx.4 _vtnet.4= vtnet.4 Copied: user/ae/inet6/share/man/man4/virtio_random.4 (from r260851, head/share/man/man4/virtio_random.4) ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ user/ae/inet6/share/man/man4/virtio_random.4 Mon Feb 3 10:31:43 2014 (r261433, copy of r260851, head/share/man/man4/virtio_random.4) @@ -0,0 +1,61 @@ +.\" Copyright (c) 2013 Bryan Venteicher +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (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$ +.\" +.Dd December 28, 2013 +.Dt VIRTIO_RANDOM 4 +.Os +.Sh NAME +.Nm virtio_random +.Nd VirtIO Entropy driver +.Sh SYNOPSIS +To compile this driver into the kernel, +place the following lines in your +kernel configuration file: +.Bd -ragged -offset indent +.Cd "device virtio_random" +.Ed +.Pp +Alternatively, to load the driver as a +module at boot time, place the following line in +.Xr loader.conf 5 : +.Bd -literal -offset indent +virtio_random_load="YES" +.Ed +.Sh DESCRIPTION +The +.Nm +device driver provides support for VirtIO entropy devices. +.Pp +The entropy device supplies high-quality randomness from the +hypervisor to the guest. +.Sh SEE ALSO +.Xr random 4 +.Xr virtio 4 +.Sh HISTORY +The +.Nm +driver was written by +.An Bryan Venteicher Aq bryanv@FreeBSD.org . Modified: user/ae/inet6/share/mk/bsd.libnames.mk ============================================================================== --- user/ae/inet6/share/mk/bsd.libnames.mk Mon Feb 3 08:15:09 2014 (r261432) +++ user/ae/inet6/share/mk/bsd.libnames.mk Mon Feb 3 10:31:43 2014 (r261433) @@ -36,6 +36,7 @@ LIBCAPSICUM?= ${DESTDIR}${LIBDIR}/libcap LIBCASPER?= ${DESTDIR}${LIBDIR}/libcasper.a LIBCOM_ERR?= ${DESTDIR}${LIBDIR}/libcom_err.a LIBCOMPAT?= ${DESTDIR}${LIBDIR}/libcompat.a +LIBCOMPILER_RT?=${DESTDIR}${LIBDIR}/libcompiler_rt.a LIBCRYPT?= ${DESTDIR}${LIBDIR}/libcrypt.a LIBCRYPTO?= ${DESTDIR}${LIBDIR}/libcrypto.a LIBCTF?= ${DESTDIR}${LIBDIR}/libctf.a @@ -53,8 +54,6 @@ LIBFETCH?= ${DESTDIR}${LIBDIR}/libfetch. LIBFL?= "don't use LIBFL, use LIBL" LIBFORM?= ${DESTDIR}${LIBDIR}/libform.a LIBG2C?= ${DESTDIR}${LIBDIR}/libg2c.a -LIBGCC?= ${DESTDIR}${LIBDIR}/libgcc.a -LIBGCC_PIC?= ${DESTDIR}${LIBDIR}/libgcc_pic.a LIBGEOM?= ${DESTDIR}${LIBDIR}/libgeom.a LIBGNUREGEX?= ${DESTDIR}${LIBDIR}/libgnuregex.a LIBGSSAPI?= ${DESTDIR}${LIBDIR}/libgssapi.a Modified: user/ae/inet6/sys/amd64/conf/NOTES ============================================================================== --- user/ae/inet6/sys/amd64/conf/NOTES Mon Feb 3 08:15:09 2014 (r261432) +++ user/ae/inet6/sys/amd64/conf/NOTES Mon Feb 3 10:31:43 2014 (r261433) @@ -472,6 +472,7 @@ device vtnet # VirtIO Ethernet device device virtio_blk # VirtIO Block device device virtio_scsi # VirtIO SCSI device device virtio_balloon # VirtIO Memory Balloon device +device virtio_random # VirtIO Entropy device device hyperv # HyperV drivers Modified: user/ae/inet6/sys/amd64/vmm/intel/vmcs.h ============================================================================== --- user/ae/inet6/sys/amd64/vmm/intel/vmcs.h Mon Feb 3 08:15:09 2014 (r261432) +++ user/ae/inet6/sys/amd64/vmm/intel/vmcs.h Mon Feb 3 10:31:43 2014 (r261433) @@ -331,12 +331,18 @@ vmcs_write(uint32_t encoding, uint64_t v #define EXIT_REASON_APIC_WRITE 56 /* + * NMI unblocking due to IRET. + * + * Applies to VM-exits due to hardware exception or EPT fault. + */ +#define EXIT_QUAL_NMIUDTI (1 << 12) +/* * VMCS interrupt information fields */ -#define VMCS_INTR_INFO_VALID (1U << 31) -#define VMCS_INTR_INFO_TYPE(info) (((info) >> 8) & 0x7) -#define VMCS_INTR_INFO_HW_INTR (0 << 8) -#define VMCS_INTR_INFO_NMI (2 << 8) +#define VMCS_INTR_VALID (1U << 31) +#define VMCS_INTR_T_MASK 0x700 /* Interruption-info type */ +#define VMCS_INTR_T_HWINTR (0 << 8) +#define VMCS_INTR_T_NMI (2 << 8) /* * VMCS IDT-Vectoring information fields Modified: user/ae/inet6/sys/amd64/vmm/intel/vmx.c ============================================================================== --- user/ae/inet6/sys/amd64/vmm/intel/vmx.c Mon Feb 3 08:15:09 2014 (r261432) +++ user/ae/inet6/sys/amd64/vmm/intel/vmx.c Mon Feb 3 10:31:43 2014 (r261433) @@ -1065,7 +1065,7 @@ vmx_inject_nmi(struct vmx *vmx, int vcpu * Inject the virtual NMI. The vector must be the NMI IDT entry * or the VMCS entry check will fail. */ - info = VMCS_INTR_INFO_NMI | VMCS_INTR_INFO_VALID; + info = VMCS_INTR_T_NMI | VMCS_INTR_VALID; info |= IDT_NMI; vmcs_write(VMCS_ENTRY_INTR_INFO, info); @@ -1103,7 +1103,7 @@ vmx_inject_interrupts(struct vmx *vmx, i * because of a pending AST. */ info = vmcs_read(VMCS_ENTRY_INTR_INFO); - if (info & VMCS_INTR_INFO_VALID) + if (info & VMCS_INTR_VALID) return; /* @@ -1134,7 +1134,7 @@ vmx_inject_interrupts(struct vmx *vmx, i goto cantinject; /* Inject the interrupt */ - info = VMCS_INTR_INFO_HW_INTR | VMCS_INTR_INFO_VALID; + info = VMCS_INTR_T_HWINTR | VMCS_INTR_VALID; info |= vector; vmcs_write(VMCS_ENTRY_INTR_INFO, info); @@ -1155,6 +1155,37 @@ cantinject: VCPU_CTR0(vmx->vm, vcpu, "Enabling interrupt window exiting"); } +/* + * If the Virtual NMIs execution control is '1' then the logical processor + * tracks virtual-NMI blocking in the Guest Interruptibility-state field of + * the VMCS. An IRET instruction in VMX non-root operation will remove any + * virtual-NMI blocking. + * + * This unblocking occurs even if the IRET causes a fault. In this case the + * hypervisor needs to restore virtual-NMI blocking before resuming the guest. + */ +static void +vmx_restore_nmi_blocking(struct vmx *vmx, int vcpuid) +{ + uint32_t gi; + + VCPU_CTR0(vmx->vm, vcpuid, "Restore Virtual-NMI blocking"); + gi = vmcs_read(VMCS_GUEST_INTERRUPTIBILITY); + gi |= VMCS_INTERRUPTIBILITY_NMI_BLOCKING; + vmcs_write(VMCS_GUEST_INTERRUPTIBILITY, gi); +} + +static void +vmx_clear_nmi_blocking(struct vmx *vmx, int vcpuid) +{ + uint32_t gi; + + VCPU_CTR0(vmx->vm, vcpuid, "Clear Virtual-NMI blocking"); + gi = vmcs_read(VMCS_GUEST_INTERRUPTIBILITY); + gi &= ~VMCS_INTERRUPTIBILITY_NMI_BLOCKING; + vmcs_write(VMCS_GUEST_INTERRUPTIBILITY, gi); +} + static int vmx_emulate_cr_access(struct vmx *vmx, int vcpu, uint64_t exitqual) { @@ -1448,6 +1479,8 @@ vmx_exit_process(struct vmx *vmx, int vc uint64_t qual, gpa; bool retu; + CTASSERT((PINBASED_CTLS_ONE_SETTING & PINBASED_VIRTUAL_NMI) != 0); + handled = 0; vmxctx = &vmx->ctx[vcpu]; @@ -1480,9 +1513,20 @@ vmx_exit_process(struct vmx *vmx, int vc vmcs_write(VMCS_ENTRY_EXCEPTION_ERROR, idtvec_err); } + /* + * If 'virtual NMIs' are being used and the VM-exit + * happened while injecting an NMI during the previous + * VM-entry, then clear "blocking by NMI" in the Guest + * Interruptibility-state. + */ + if ((idtvec_info & VMCS_INTR_T_MASK) == + VMCS_INTR_T_NMI) { + vmx_clear_nmi_blocking(vmx, vcpu); + } vmcs_write(VMCS_ENTRY_INST_LENGTH, vmexit->inst_length); } default: + idtvec_info = 0; break; } @@ -1556,8 +1600,8 @@ vmx_exit_process(struct vmx *vmx, int vc * this virtual interrupt during the subsequent VM enter. */ intr_info = vmcs_read(VMCS_EXIT_INTR_INFO); - KASSERT((intr_info & VMCS_INTR_INFO_VALID) != 0 && - VMCS_INTR_INFO_TYPE(intr_info) == 0, + KASSERT((intr_info & VMCS_INTR_VALID) != 0 && + (intr_info & VMCS_INTR_T_MASK) == VMCS_INTR_T_HWINTR, ("VM exit interruption info invalid: %#x", intr_info)); vmx_trigger_hostintr(intr_info & 0xff); @@ -1587,6 +1631,23 @@ vmx_exit_process(struct vmx *vmx, int vc vmm_stat_incr(vmx->vm, vcpu, VMEXIT_CPUID, 1); handled = vmx_handle_cpuid(vmx->vm, vcpu, vmxctx); break; + case EXIT_REASON_EXCEPTION: + intr_info = vmcs_read(VMCS_EXIT_INTR_INFO); + KASSERT((intr_info & VMCS_INTR_VALID) != 0, + ("VM exit interruption info invalid: %#x", intr_info)); + /* + * If Virtual NMIs control is 1 and the VM-exit is due to a + * fault encountered during the execution of IRET then we must + * restore the state of "virtual-NMI blocking" before resuming + * the guest. + * + * See "Resuming Guest Software after Handling an Exception". + */ + if ((idtvec_info & VMCS_IDT_VEC_VALID) == 0 && + (intr_info & 0xff) != IDT_DF && + (intr_info & EXIT_QUAL_NMIUDTI) != 0) + vmx_restore_nmi_blocking(vmx, vcpu); + break; case EXIT_REASON_EPT_FAULT: vmm_stat_incr(vmx->vm, vcpu, VMEXIT_EPT_FAULT, 1); /* @@ -1605,6 +1666,17 @@ vmx_exit_process(struct vmx *vmx, int vc vmexit->u.inst_emul.gla = vmcs_gla(); vmexit->u.inst_emul.cr3 = vmcs_guest_cr3(); } + /* + * If Virtual NMIs control is 1 and the VM-exit is due to an + * EPT fault during the execution of IRET then we must restore + * the state of "virtual-NMI blocking" before resuming. + * + * See description of "NMI unblocking due to IRET" in + * "Exit Qualification for EPT Violations". + */ + if ((idtvec_info & VMCS_IDT_VEC_VALID) == 0 && + (qual & EXIT_QUAL_NMIUDTI) != 0) + vmx_restore_nmi_blocking(vmx, vcpu); break; case EXIT_REASON_APIC_ACCESS: handled = vmx_handle_apic_access(vmx, vcpu, vmexit); @@ -2039,11 +2111,11 @@ vmx_inject(void *arg, int vcpu, int type if (error) return (error); - if (info & VMCS_INTR_INFO_VALID) + if (info & VMCS_INTR_VALID) return (EAGAIN); info = vector | (type_map[type] << 8) | (code_valid ? 1 << 11 : 0); - info |= VMCS_INTR_INFO_VALID; + info |= VMCS_INTR_VALID; error = vmcs_setreg(vmcs, 0, VMCS_IDENT(VMCS_ENTRY_INTR_INFO), info); if (error != 0) return (error); Modified: user/ae/inet6/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c ============================================================================== --- user/ae/inet6/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c Mon Feb 3 08:15:09 2014 (r261432) +++ user/ae/inet6/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c Mon Feb 3 10:31:43 2014 (r261433) @@ -21,7 +21,7 @@ /* * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2013 by Delphix. All rights reserved. - * Copyright (c) 2013 by Saso Kiselkov. All rights reserved. + * Copyright (c) 2014 by Saso Kiselkov. All rights reserved. * Copyright 2013 Nexenta Systems, Inc. All rights reserved. */ @@ -4597,6 +4597,13 @@ l2arc_write_done(zio_t *zio) */ for (ab = list_prev(buflist, head); ab; ab = ab_prev) { ab_prev = list_prev(buflist, ab); + abl2 = ab->b_l2hdr; + + /* + * Release the temporary compressed buffer as soon as possible. + */ + if (abl2->b_compress != ZIO_COMPRESS_OFF) + l2arc_release_cdata_buf(ab); hash_lock = HDR_LOCK(ab); if (!mutex_tryenter(hash_lock)) { @@ -4609,14 +4616,6 @@ l2arc_write_done(zio_t *zio) continue; } - abl2 = ab->b_l2hdr; - - /* - * Release the temporary compressed buffer as soon as possible. - */ - if (abl2->b_compress != ZIO_COMPRESS_OFF) - l2arc_release_cdata_buf(ab); - if (zio->io_error != 0) { /* * Error - drop L2ARC entry. Modified: user/ae/inet6/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_traverse.c ============================================================================== --- user/ae/inet6/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_traverse.c Mon Feb 3 08:15:09 2014 (r261432) +++ user/ae/inet6/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_traverse.c Mon Feb 3 10:31:43 2014 (r261433) @@ -351,9 +351,9 @@ traverse_visitbp(traverse_data_t *td, co prefetch_dnode_metadata(td, dnp, zb->zb_objset, DMU_META_DNODE_OBJECT); if (arc_buf_size(buf) >= sizeof (objset_phys_t)) { - prefetch_dnode_metadata(td, &osp->os_userused_dnode, - zb->zb_objset, DMU_USERUSED_OBJECT); prefetch_dnode_metadata(td, &osp->os_groupused_dnode, + zb->zb_objset, DMU_GROUPUSED_OBJECT); + prefetch_dnode_metadata(td, &osp->os_userused_dnode, zb->zb_objset, DMU_USERUSED_OBJECT); } @@ -364,18 +364,18 @@ traverse_visitbp(traverse_data_t *td, co err = 0; } if (err == 0 && arc_buf_size(buf) >= sizeof (objset_phys_t)) { - dnp = &osp->os_userused_dnode; + dnp = &osp->os_groupused_dnode; err = traverse_dnode(td, dnp, zb->zb_objset, - DMU_USERUSED_OBJECT); + DMU_GROUPUSED_OBJECT); } if (err && hard) { lasterr = err; err = 0; } if (err == 0 && arc_buf_size(buf) >= sizeof (objset_phys_t)) { - dnp = &osp->os_groupused_dnode; + dnp = &osp->os_userused_dnode; err = traverse_dnode(td, dnp, zb->zb_objset, - DMU_GROUPUSED_OBJECT); + DMU_USERUSED_OBJECT); } } Modified: user/ae/inet6/sys/compat/freebsd32/freebsd32_misc.c ============================================================================== --- user/ae/inet6/sys/compat/freebsd32/freebsd32_misc.c Mon Feb 3 08:15:09 2014 (r261432) +++ user/ae/inet6/sys/compat/freebsd32/freebsd32_misc.c Mon Feb 3 10:31:43 2014 (r261433) @@ -1644,18 +1644,28 @@ struct sf_hdtr32 { int trl_cnt; }; +struct sf_hdtr_kq32 { + int kq_fd; + uint32_t kq_flags; + uint32_t kq_udata; /* 32-bit void ptr */ + uint32_t kq_ident; /* 32-bit uintptr_t */ +}; + static int freebsd32_do_sendfile(struct thread *td, struct freebsd32_sendfile_args *uap, int compat) { struct sf_hdtr32 hdtr32; struct sf_hdtr hdtr; + struct sf_hdtr_kq32 hdtr_kq32; + struct sf_hdtr_kq hdtr_kq; struct uio *hdr_uio, *trl_uio; struct iovec32 *iov32; off_t offset; int error; off_t sbytes; struct sendfile_sync *sfs; + int do_kqueue = 0; offset = PAIR32TO64(off_t, uap->offset); if (offset < 0) @@ -1687,10 +1697,32 @@ freebsd32_do_sendfile(struct thread *td, if (error) goto out; } + + /* + * If SF_KQUEUE is set, then we need to also copy in + * the kqueue data after the normal hdtr set and set do_kqueue=1. + */ + if (uap->flags & SF_KQUEUE) { + error = copyin(((char *) uap->hdtr) + sizeof(hdtr32), + &hdtr_kq32, + sizeof(hdtr_kq32)); + if (error != 0) + goto out; + + /* 32->64 bit fields */ + CP(hdtr_kq32, hdtr_kq, kq_fd); + CP(hdtr_kq32, hdtr_kq, kq_flags); + PTRIN_CP(hdtr_kq32, hdtr_kq, kq_udata); + CP(hdtr_kq32, hdtr_kq, kq_ident); + do_kqueue = 1; + } } + + /* Call sendfile */ + /* XXX stack depth! */ error = _do_sendfile(td, uap->fd, uap->s, uap->flags, compat, - offset, uap->nbytes, &sbytes, hdr_uio, trl_uio); + offset, uap->nbytes, &sbytes, hdr_uio, trl_uio, &hdtr_kq); if (uap->sbytes != NULL) copyout(&sbytes, uap->sbytes, sizeof(off_t)); Modified: user/ae/inet6/sys/conf/files.amd64 ============================================================================== --- user/ae/inet6/sys/conf/files.amd64 Mon Feb 3 08:15:09 2014 (r261432) +++ user/ae/inet6/sys/conf/files.amd64 Mon Feb 3 10:31:43 2014 (r261433) @@ -448,6 +448,7 @@ dev/virtio/network/if_vtnet.c optional dev/virtio/block/virtio_blk.c optional virtio_blk dev/virtio/balloon/virtio_balloon.c optional virtio_balloon dev/virtio/scsi/virtio_scsi.c optional virtio_scsi +dev/virtio/random/virtio_random.c optional virtio_random isa/syscons_isa.c optional sc isa/vga_isa.c optional vga kern/kern_clocksource.c standard Modified: user/ae/inet6/sys/conf/files.i386 ============================================================================== --- user/ae/inet6/sys/conf/files.i386 Mon Feb 3 08:15:09 2014 (r261432) +++ user/ae/inet6/sys/conf/files.i386 Mon Feb 3 10:31:43 2014 (r261433) @@ -414,6 +414,7 @@ dev/virtio/network/if_vtnet.c optional dev/virtio/block/virtio_blk.c optional virtio_blk dev/virtio/balloon/virtio_balloon.c optional virtio_balloon dev/virtio/scsi/virtio_scsi.c optional virtio_scsi +dev/virtio/random/virtio_random.c optional virtio_random i386/acpica/acpi_machdep.c optional acpi acpi_wakecode.o optional acpi \ dependency "$S/i386/acpica/acpi_wakecode.S assym.s" \ Modified: user/ae/inet6/sys/dev/ahci/ahci.c ============================================================================== --- user/ae/inet6/sys/dev/ahci/ahci.c Mon Feb 3 08:15:09 2014 (r261432) +++ user/ae/inet6/sys/dev/ahci/ahci.c Mon Feb 3 10:31:43 2014 (r261433) @@ -146,6 +146,7 @@ static struct { {0x78021022, 0x00, "AMD Hudson-2", 0}, {0x78031022, 0x00, "AMD Hudson-2", 0}, {0x78041022, 0x00, "AMD Hudson-2", 0}, + {0x06111b21, 0x00, "ASMedia ASM2106", 0}, {0x06121b21, 0x00, "ASMedia ASM1061", 0}, {0x26528086, 0x00, "Intel ICH6", AHCI_Q_NOFORCE}, {0x26538086, 0x00, "Intel ICH6M", AHCI_Q_NOFORCE}, Modified: user/ae/inet6/sys/dev/usb/usb_dev.c ============================================================================== --- user/ae/inet6/sys/dev/usb/usb_dev.c Mon Feb 3 08:15:09 2014 (r261432) +++ user/ae/inet6/sys/dev/usb/usb_dev.c Mon Feb 3 10:31:43 2014 (r261433) @@ -207,6 +207,11 @@ usb_ref_device(struct usb_cdev_privdata DPRINTFN(2, "no device at %u\n", cpd->dev_index); goto error; } + if (cpd->udev->state == USB_STATE_DETACHED && + (need_uref != 2)) { + DPRINTFN(2, "device is detached\n"); + goto error; + } if (cpd->udev->refcount == USB_DEV_REF_MAX) { DPRINTFN(2, "no dev ref\n"); goto error; @@ -597,6 +602,13 @@ usb_fifo_free(struct usb_fifo *f) mtx_unlock(f->priv_mtx); mtx_lock(&usb_ref_lock); + /* + * Check if the "f->refcount" variable reached zero + * during the unlocked time before entering wait: + */ + if (f->refcount == 0) + break; + /* wait for sync */ cv_wait(&f->cv_drain, &usb_ref_lock); } @@ -915,23 +927,12 @@ usb_close(void *arg) DPRINTFN(2, "cpd=%p\n", cpd); - err = usb_ref_device(cpd, &refs, 0); - if (err) + err = usb_ref_device(cpd, &refs, + 2 /* uref and allow detached state */); + if (err) { + DPRINTFN(0, "Cannot grab USB reference when " + "closing USB file handle\n"); goto done; - - /* - * If this function is not called directly from the root HUB - * thread, there is usually a need to lock the enumeration - * lock. Check this. - */ - if (!usbd_enum_is_locked(cpd->udev)) { - - DPRINTFN(2, "Locking enumeration\n"); - - /* reference device */ - err = usb_usb_ref_device(cpd, &refs); - if (err) - goto done; } if (cpd->fflags & FREAD) { usb_fifo_close(refs.rxfifo, cpd->fflags); Modified: user/ae/inet6/sys/dev/usb/usb_device.c ============================================================================== --- user/ae/inet6/sys/dev/usb/usb_device.c Mon Feb 3 08:15:09 2014 (r261432) +++ user/ae/inet6/sys/dev/usb/usb_device.c Mon Feb 3 10:31:43 2014 (r261433) @@ -2070,6 +2070,8 @@ usb_free_device(struct usb_device *udev, DPRINTFN(4, "udev=%p port=%d\n", udev, udev->port_no); bus = udev->bus; + + /* set DETACHED state to prevent any further references */ usb_set_device_state(udev, USB_STATE_DETACHED); #if USB_HAVE_DEVCTL @@ -2085,16 +2087,7 @@ usb_free_device(struct usb_device *udev, usb_free_symlink(udev->ugen_symlink); udev->ugen_symlink = NULL; } -#endif - /* - * Unregister our device first which will prevent any further - * references: - */ - usb_bus_port_set_device(bus, udev->parent_hub ? - udev->parent_hub->hub->ports + udev->port_index : NULL, - NULL, USB_ROOT_HUB_ADDR); -#if USB_HAVE_UGEN /* wait for all pending references to go away: */ mtx_lock(&usb_ref_lock); udev->refcount--; @@ -2114,6 +2107,11 @@ usb_free_device(struct usb_device *udev, /* the following will get the device unconfigured in software */ usb_unconfigure(udev, USB_UNCFG_FLAG_FREE_EP0); + /* final device unregister after all character devices are closed */ + usb_bus_port_set_device(bus, udev->parent_hub ? + udev->parent_hub->hub->ports + udev->port_index : NULL, + NULL, USB_ROOT_HUB_ADDR); + /* unsetup any leftover default USB transfers */ usbd_transfer_unsetup(udev->ctrl_xfer, USB_CTRL_XFER_MAX); @@ -2647,8 +2645,14 @@ usb_set_device_state(struct usb_device * DPRINTF("udev %p state %s -> %s\n", udev, usb_statestr(udev->state), usb_statestr(state)); - udev->state = state; +#if USB_HAVE_UGEN + mtx_lock(&usb_ref_lock); +#endif + udev->state = state; +#if USB_HAVE_UGEN + mtx_unlock(&usb_ref_lock); +#endif if (udev->bus->methods->device_state_change != NULL) (udev->bus->methods->device_state_change) (udev); } Modified: user/ae/inet6/sys/i386/conf/NOTES ============================================================================== --- user/ae/inet6/sys/i386/conf/NOTES Mon Feb 3 08:15:09 2014 (r261432) +++ user/ae/inet6/sys/i386/conf/NOTES Mon Feb 3 10:31:43 2014 (r261433) @@ -800,6 +800,7 @@ device vtnet # VirtIO Ethernet device device virtio_blk # VirtIO Block device device virtio_scsi # VirtIO SCSI device device virtio_balloon # VirtIO Memory Balloon device +device virtio_random # VirtIO Entropy device device hyperv # HyperV drivers Modified: user/ae/inet6/sys/kern/kern_event.c ============================================================================== --- user/ae/inet6/sys/kern/kern_event.c Mon Feb 3 08:15:09 2014 (r261432) +++ user/ae/inet6/sys/kern/kern_event.c Mon Feb 3 10:31:43 2014 (r261433) @@ -294,6 +294,7 @@ static struct { { &fs_filtops }, /* EVFILT_FS */ { &null_filtops }, /* EVFILT_LIO */ { &user_filtops }, /* EVFILT_USER */ + { &null_filtops }, /* EVFILT_SENDFILE */ }; /* Modified: user/ae/inet6/sys/kern/uipc_sockbuf.c ============================================================================== --- user/ae/inet6/sys/kern/uipc_sockbuf.c Mon Feb 3 08:15:09 2014 (r261432) +++ user/ae/inet6/sys/kern/uipc_sockbuf.c Mon Feb 3 10:31:43 2014 (r261433) @@ -813,7 +813,7 @@ sbflush_internal(struct sockbuf *sb) while (sb->sb_mbcnt) { /* - * Don't call sbdrop(sb, 0) if the leading mbuf is non-empty: + * Don't call sbcut(sb, 0) if the leading mbuf is non-empty: * we would loop forever. Panic instead. */ if (!sb->sb_cc && (sb->sb_mb == NULL || sb->sb_mb->m_len)) Modified: user/ae/inet6/sys/kern/uipc_syscalls.c ============================================================================== --- user/ae/inet6/sys/kern/uipc_syscalls.c Mon Feb 3 08:15:09 2014 (r261432) +++ user/ae/inet6/sys/kern/uipc_syscalls.c Mon Feb 3 10:31:43 2014 (r261433) @@ -123,6 +123,10 @@ static int getpeername1(struct thread *t counter_u64_t sfstat[sizeof(struct sfstat) / sizeof(uint64_t)]; +static int filt_sfsync_attach(struct knote *kn); +static void filt_sfsync_detach(struct knote *kn); +static int filt_sfsync(struct knote *kn, long hint); + /* * sendfile(2)-related variables and associated sysctls */ @@ -132,8 +136,28 @@ static int sfreadahead = 1; SYSCTL_INT(_kern_ipc_sendfile, OID_AUTO, readahead, CTLFLAG_RW, &sfreadahead, 0, "Number of sendfile(2) read-ahead MAXBSIZE blocks"); +#ifdef SFSYNC_DEBUG +static int sf_sync_debug = 0; +SYSCTL_INT(_debug, OID_AUTO, sf_sync_debug, CTLFLAG_RW, + &sf_sync_debug, 0, "Output debugging during sf_sync lifecycle"); +#define SFSYNC_DPRINTF(s, ...) \ + do { \ + if (sf_sync_debug) \ + printf((s), ##__VA_ARGS__); \ + } while (0) +#else +#define SFSYNC_DPRINTF(c, ...) +#endif + static uma_zone_t zone_sfsync; +static struct filterops sendfile_filtops = { + .f_isfd = 0, + .f_attach = filt_sfsync_attach, + .f_detach = filt_sfsync_detach, + .f_event = filt_sfsync, +}; + static void sfstat_init(const void *unused) { @@ -152,6 +176,7 @@ sf_sync_init(const void *unused) NULL, NULL, UMA_ALIGN_CACHE, 0); + kqueue_add_filteropts(EVFILT_SENDFILE, &sendfile_filtops); } SYSINIT(sf_sync, SI_SUB_MBUF, SI_ORDER_FIRST, sf_sync_init, NULL); @@ -1860,6 +1885,118 @@ getsockaddr(namp, uaddr, len) return (error); } +static int +filt_sfsync_attach(struct knote *kn) +{ + struct sendfile_sync *sfs = (struct sendfile_sync *) kn->kn_sdata; + struct knlist *knl = &sfs->klist; + + SFSYNC_DPRINTF("%s: kn=%p, sfs=%p\n", __func__, kn, sfs); + + /* + * Validate that we actually received this via the kernel API. + */ + if ((kn->kn_flags & EV_FLAG1) == 0) + return (EPERM); + + kn->kn_ptr.p_v = sfs; + kn->kn_flags &= ~EV_FLAG1; + + knl->kl_lock(knl->kl_lockarg); + /* + * If we're in the "freeing" state, + * don't allow the add. That way we don't + * end up racing with some other thread that + * is trying to finish some setup. + */ + if (sfs->state == SF_STATE_FREEING) { + knl->kl_unlock(knl->kl_lockarg); + return (EINVAL); + } + knlist_add(&sfs->klist, kn, 1); + knl->kl_unlock(knl->kl_lockarg); + + return (0); +} + +/* + * Called when a knote is being detached. + */ +static void +filt_sfsync_detach(struct knote *kn) +{ + struct knlist *knl; + struct sendfile_sync *sfs; + int do_free = 0; + + sfs = kn->kn_ptr.p_v; + knl = &sfs->klist; + + SFSYNC_DPRINTF("%s: kn=%p, sfs=%p\n", __func__, kn, sfs); + + knl->kl_lock(knl->kl_lockarg); + if (!knlist_empty(knl)) + knlist_remove(knl, kn, 1); + + /* + * If the list is empty _AND_ the refcount is 0 + * _AND_ we've finished the setup phase and now + * we're in the running phase, we can free the + * underlying sendfile_sync. + * + * But we shouldn't do it before finishing the + * underlying divorce from the knote. + * + * So, we have the sfsync lock held; transition + * it to "freeing", then unlock, then free + * normally. + */ + if (knlist_empty(knl)) { + if (sfs->state == SF_STATE_COMPLETED && sfs->count == 0) { + SFSYNC_DPRINTF("%s: (%llu) sfs=%p; completed, " + "count==0, empty list: time to free!\n", + __func__, + (unsigned long long) curthread->td_tid, + sfs); + sf_sync_set_state(sfs, SF_STATE_FREEING, 1); + do_free = 1; + } + } + knl->kl_unlock(knl->kl_lockarg); + + /* + * Only call free if we're the one who has transitioned things + * to free. Otherwise we could race with another thread that + * is currently tearing things down. + */ + if (do_free == 1) { + SFSYNC_DPRINTF("%s: (%llu) sfs=%p, %s:%d\n", + __func__, + (unsigned long long) curthread->td_tid, + sfs, + __FILE__, *** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201402031031.s13AViXA028469>