From owner-svn-src-projects@FreeBSD.ORG Sun Aug 25 10:09:04 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 3F1C8598; Sun, 25 Aug 2013 10:09:04 +0000 (UTC) (envelope-from markm@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 29FE0251C; Sun, 25 Aug 2013 10:09:04 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id r7PA94EI092966; Sun, 25 Aug 2013 10:09:04 GMT (envelope-from markm@svn.freebsd.org) Received: (from markm@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id r7PA8x08092839; Sun, 25 Aug 2013 10:08:59 GMT (envelope-from markm@svn.freebsd.org) Message-Id: <201308251008.r7PA8x08092839@svn.freebsd.org> From: Mark Murray Date: Sun, 25 Aug 2013 10:08:59 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r254839 - in projects/random_number_generator: bin/sh contrib/llvm/include/llvm/MC contrib/llvm/lib/MC contrib/llvm/lib/Target/X86/InstPrinter contrib/llvm/tools/lldb/source/Expression ... X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 25 Aug 2013 10:09:04 -0000 Author: markm Date: Sun Aug 25 10:08:58 2013 New Revision: 254839 URL: http://svnweb.freebsd.org/changeset/base/254839 Log: MFC Added: projects/random_number_generator/sys/dev/drm2/drm_buffer.c - copied unchanged from r254838, head/sys/dev/drm2/drm_buffer.c projects/random_number_generator/sys/dev/drm2/drm_buffer.h - copied unchanged from r254838, head/sys/dev/drm2/drm_buffer.h projects/random_number_generator/sys/dev/drm2/drm_core.h - copied unchanged from r254838, head/sys/dev/drm2/drm_core.h projects/random_number_generator/sys/dev/drm2/drm_dp_helper.c - copied unchanged from r254838, head/sys/dev/drm2/drm_dp_helper.c projects/random_number_generator/tools/regression/bin/sh/expansion/arith13.0 - copied unchanged from r254838, head/tools/regression/bin/sh/expansion/arith13.0 Modified: projects/random_number_generator/bin/sh/arith_yylex.c projects/random_number_generator/contrib/llvm/include/llvm/MC/MCInstPrinter.h projects/random_number_generator/contrib/llvm/lib/MC/MCInstPrinter.cpp projects/random_number_generator/contrib/llvm/lib/Target/X86/InstPrinter/X86ATTInstPrinter.cpp projects/random_number_generator/contrib/llvm/lib/Target/X86/InstPrinter/X86IntelInstPrinter.cpp projects/random_number_generator/contrib/llvm/tools/lldb/source/Expression/IRForTarget.cpp projects/random_number_generator/etc/defaults/periodic.conf projects/random_number_generator/share/man/man9/EVENTHANDLER.9 projects/random_number_generator/share/man/man9/pfil.9 projects/random_number_generator/share/man/man9/timeout.9 projects/random_number_generator/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c projects/random_number_generator/sys/cddl/dev/dtrace/dtrace_load.c projects/random_number_generator/sys/cddl/dev/dtrace/dtrace_unload.c projects/random_number_generator/sys/cddl/dev/sdt/sdt.c projects/random_number_generator/sys/dev/cas/if_cas.c projects/random_number_generator/sys/dev/cxgb/cxgb_sge.c projects/random_number_generator/sys/dev/drm2/drmP.h projects/random_number_generator/sys/dev/drm2/drm_crtc.c projects/random_number_generator/sys/dev/drm2/drm_crtc.h projects/random_number_generator/sys/dev/drm2/drm_crtc_helper.h projects/random_number_generator/sys/dev/drm2/drm_dp_helper.h projects/random_number_generator/sys/dev/drm2/drm_dp_iic_helper.c projects/random_number_generator/sys/dev/drm2/drm_drv.c projects/random_number_generator/sys/dev/drm2/drm_edid.c projects/random_number_generator/sys/dev/drm2/drm_gem.c projects/random_number_generator/sys/dev/drm2/drm_gem_names.c projects/random_number_generator/sys/dev/drm2/i915/intel_crt.c projects/random_number_generator/sys/dev/drm2/i915/intel_display.c projects/random_number_generator/sys/dev/drm2/i915/intel_dp.c projects/random_number_generator/sys/dev/drm2/i915/intel_drv.h projects/random_number_generator/sys/dev/drm2/i915/intel_hdmi.c projects/random_number_generator/sys/dev/drm2/i915/intel_lvds.c projects/random_number_generator/sys/dev/drm2/i915/intel_panel.c projects/random_number_generator/sys/dev/drm2/i915/intel_sdvo.c projects/random_number_generator/sys/dev/drm2/i915/intel_tv.c projects/random_number_generator/sys/dev/e1000/if_igb.c projects/random_number_generator/sys/dev/fdc/fdc.c projects/random_number_generator/sys/dev/hatm/if_hatm_intr.c projects/random_number_generator/sys/dev/hwpmc/hwpmc_core.c projects/random_number_generator/sys/dev/hwpmc/hwpmc_mod.c projects/random_number_generator/sys/dev/hwpmc/pmc_events.h projects/random_number_generator/sys/dev/iscsi_initiator/isc_soc.c projects/random_number_generator/sys/dev/ixgbe/ixgbe.c projects/random_number_generator/sys/dev/ixgbe/ixv.c projects/random_number_generator/sys/dev/jme/if_jme.c projects/random_number_generator/sys/dev/lge/if_lge.c projects/random_number_generator/sys/dev/mwl/if_mwl.c projects/random_number_generator/sys/dev/nfe/if_nfe.c projects/random_number_generator/sys/dev/patm/if_patm.c projects/random_number_generator/sys/dev/patm/if_patm_tx.c projects/random_number_generator/sys/dev/qlxgb/qla_hw.c projects/random_number_generator/sys/dev/sfxge/sfxge_rx.c projects/random_number_generator/sys/dev/usb/controller/dwc_otg.c projects/random_number_generator/sys/dev/usb/controller/musb_otg.c projects/random_number_generator/sys/kern/kern_linker.c projects/random_number_generator/sys/kern/kern_mbuf.c projects/random_number_generator/sys/kern/kern_physio.c projects/random_number_generator/sys/kern/link_elf.c projects/random_number_generator/sys/kern/subr_mbpool.c projects/random_number_generator/sys/kern/subr_taskqueue.c projects/random_number_generator/sys/kern/uipc_cow.c projects/random_number_generator/sys/kern/uipc_mbuf.c projects/random_number_generator/sys/kern/uipc_syscalls.c projects/random_number_generator/sys/modules/drm2/drm2/Makefile projects/random_number_generator/sys/modules/vmware/vmxnet3/Makefile projects/random_number_generator/sys/net/if.h projects/random_number_generator/sys/net/if_fddisubr.c projects/random_number_generator/sys/net/if_iso88025subr.c projects/random_number_generator/sys/net/if_llatbl.h projects/random_number_generator/sys/netinet/igmp.c projects/random_number_generator/sys/netinet/ip_input.c projects/random_number_generator/sys/netinet/sctp_input.c projects/random_number_generator/sys/netinet6/ip6_output.c projects/random_number_generator/sys/netinet6/mld6.c projects/random_number_generator/sys/netinet6/sctp6_usrreq.c projects/random_number_generator/sys/ofed/drivers/net/mlx4/en_frag.c projects/random_number_generator/sys/sys/eventhandler.h projects/random_number_generator/sys/sys/mbpool.h projects/random_number_generator/sys/sys/mbuf.h projects/random_number_generator/sys/sys/pmckern.h projects/random_number_generator/sys/sys/sf_buf.h projects/random_number_generator/usr.sbin/periodic/periodic.sh Directory Properties: projects/random_number_generator/ (props changed) projects/random_number_generator/contrib/llvm/ (props changed) projects/random_number_generator/sys/ (props changed) projects/random_number_generator/sys/cddl/contrib/opensolaris/ (props changed) Modified: projects/random_number_generator/bin/sh/arith_yylex.c ============================================================================== --- projects/random_number_generator/bin/sh/arith_yylex.c Sun Aug 25 10:04:10 2013 (r254838) +++ projects/random_number_generator/bin/sh/arith_yylex.c Sun Aug 25 10:08:58 2013 (r254839) @@ -218,9 +218,13 @@ checkeqcur: value += ARITH_REM - '%'; goto checkeq; case '+': + if (buf[1] == '+') + return ARITH_BAD; value += ARITH_ADD - '+'; goto checkeq; case '-': + if (buf[1] == '-') + return ARITH_BAD; value += ARITH_SUB - '-'; goto checkeq; case '~': Modified: projects/random_number_generator/contrib/llvm/include/llvm/MC/MCInstPrinter.h ============================================================================== --- projects/random_number_generator/contrib/llvm/include/llvm/MC/MCInstPrinter.h Sun Aug 25 10:04:10 2013 (r254838) +++ projects/random_number_generator/contrib/llvm/include/llvm/MC/MCInstPrinter.h Sun Aug 25 10:08:58 2013 (r254839) @@ -21,6 +21,13 @@ class MCInstrInfo; class MCRegisterInfo; class StringRef; +namespace HexStyle { + enum Style { + C, ///< 0xff + Asm ///< 0ffh + }; +} + /// MCInstPrinter - This is an instance of a target assembly language printer /// that converts an MCInst to valid target assembly syntax. class MCInstPrinter { @@ -42,13 +49,16 @@ protected: /// True if we are printing immediates as hex. bool PrintImmHex; + /// Which style to use for printing hexadecimal values. + HexStyle::Style PrintHexStyle; + /// Utility function for printing annotations. void printAnnotation(raw_ostream &OS, StringRef Annot); public: MCInstPrinter(const MCAsmInfo &mai, const MCInstrInfo &mii, const MCRegisterInfo &mri) : CommentStream(0), MAI(mai), MII(mii), MRI(mri), AvailableFeatures(0), - UseMarkup(0), PrintImmHex(0) {} + UseMarkup(0), PrintImmHex(0), PrintHexStyle(HexStyle::C) {} virtual ~MCInstPrinter(); @@ -80,8 +90,16 @@ public: bool getPrintImmHex() const { return PrintImmHex; } void setPrintImmHex(bool Value) { PrintImmHex = Value; } + HexStyle::Style getPrintHexStyleHex() const { return PrintHexStyle; } + void setPrintImmHex(HexStyle::Style Value) { PrintHexStyle = Value; } + /// Utility function to print immediates in decimal or hex. - format_object1 formatImm(const int64_t Value) const; + format_object1 formatImm(const int64_t Value) const { return PrintImmHex ? formatHex(Value) : formatDec(Value); } + + /// Utility functions to print decimal/hexadecimal values. + format_object1 formatDec(const int64_t Value) const; + format_object1 formatHex(const int64_t Value) const; + format_object1 formatHex(const uint64_t Value) const; }; } // namespace llvm Modified: projects/random_number_generator/contrib/llvm/lib/MC/MCInstPrinter.cpp ============================================================================== --- projects/random_number_generator/contrib/llvm/lib/MC/MCInstPrinter.cpp Sun Aug 25 10:04:10 2013 (r254838) +++ projects/random_number_generator/contrib/llvm/lib/MC/MCInstPrinter.cpp Sun Aug 25 10:08:58 2013 (r254839) @@ -52,10 +52,53 @@ StringRef MCInstPrinter::markup(StringRe return b; } -/// Utility function to print immediates in decimal or hex. -format_object1 MCInstPrinter::formatImm(const int64_t Value) const { - if (getPrintImmHex()) - return format("0x%" PRIx64, Value); - else - return format("%" PRId64, Value); +// For asm-style hex (e.g. 0ffh) the first digit always has to be a number. +static bool needsLeadingZero(uint64_t Value) +{ + while(Value) + { + uint64_t digit = (Value >> 60) & 0xf; + if (digit != 0) + return (digit >= 0xa); + Value <<= 4; + } + return false; +} + +format_object1 MCInstPrinter::formatDec(const int64_t Value) const { + return format("%" PRId64, Value); +} + +format_object1 MCInstPrinter::formatHex(const int64_t Value) const { + switch(PrintHexStyle) { + case HexStyle::C: + if (Value < 0) + return format("-0x%" PRIx64, -Value); + else + return format("0x%" PRIx64, Value); + case HexStyle::Asm: + if (Value < 0) { + if (needsLeadingZero((uint64_t)(-Value))) + return format("-0%" PRIx64 "h", -Value); + else + return format("-%" PRIx64 "h", -Value); + } else { + if (needsLeadingZero((uint64_t)(Value))) + return format("0%" PRIx64 "h", Value); + else + return format("%" PRIx64 "h", Value); + } + } +} + +format_object1 MCInstPrinter::formatHex(const uint64_t Value) const { + switch(PrintHexStyle) { + case HexStyle::C: + return format("0x%" PRIx64, Value); + case HexStyle::Asm: + if (needsLeadingZero(Value)) + return format("0%" PRIx64 "h", Value); + else + return format("%" PRIx64 "h", Value); + } } Modified: projects/random_number_generator/contrib/llvm/lib/Target/X86/InstPrinter/X86ATTInstPrinter.cpp ============================================================================== --- projects/random_number_generator/contrib/llvm/lib/Target/X86/InstPrinter/X86ATTInstPrinter.cpp Sun Aug 25 10:04:10 2013 (r254838) +++ projects/random_number_generator/contrib/llvm/lib/Target/X86/InstPrinter/X86ATTInstPrinter.cpp Sun Aug 25 10:08:58 2013 (r254839) @@ -139,8 +139,7 @@ void X86ATTInstPrinter::printPCRelImm(co const MCConstantExpr *BranchTarget = dyn_cast(Op.getExpr()); int64_t Address; if (BranchTarget && BranchTarget->EvaluateAsAbsolute(Address)) { - O << "0x"; - O.write_hex(Address); + O << formatHex((uint64_t)Address); } else { // Otherwise, just print the expression. Modified: projects/random_number_generator/contrib/llvm/lib/Target/X86/InstPrinter/X86IntelInstPrinter.cpp ============================================================================== --- projects/random_number_generator/contrib/llvm/lib/Target/X86/InstPrinter/X86IntelInstPrinter.cpp Sun Aug 25 10:04:10 2013 (r254838) +++ projects/random_number_generator/contrib/llvm/lib/Target/X86/InstPrinter/X86IntelInstPrinter.cpp Sun Aug 25 10:08:58 2013 (r254839) @@ -119,7 +119,7 @@ void X86IntelInstPrinter::printPCRelImm( raw_ostream &O) { const MCOperand &Op = MI->getOperand(OpNo); if (Op.isImm()) - O << Op.getImm(); + O << formatImm(Op.getImm()); else { assert(Op.isExpr() && "unknown pcrel immediate operand"); // If a symbolic branch target was added as a constant expression then print @@ -127,8 +127,7 @@ void X86IntelInstPrinter::printPCRelImm( const MCConstantExpr *BranchTarget = dyn_cast(Op.getExpr()); int64_t Address; if (BranchTarget && BranchTarget->EvaluateAsAbsolute(Address)) { - O << "0x"; - O.write_hex(Address); + O << formatHex((uint64_t)Address); } else { // Otherwise, just print the expression. @@ -148,7 +147,7 @@ void X86IntelInstPrinter::printOperand(c if (Op.isReg()) { PrintRegName(O, getRegisterName(Op.getReg())); } else if (Op.isImm()) { - O << Op.getImm(); + O << formatImm((int64_t)Op.getImm()); } else { assert(Op.isExpr() && "unknown operand kind in printOperand"); O << *Op.getExpr(); @@ -200,7 +199,7 @@ void X86IntelInstPrinter::printMemRefere DispVal = -DispVal; } } - O << DispVal; + O << formatImm(DispVal); } } Modified: projects/random_number_generator/contrib/llvm/tools/lldb/source/Expression/IRForTarget.cpp ============================================================================== --- projects/random_number_generator/contrib/llvm/tools/lldb/source/Expression/IRForTarget.cpp Sun Aug 25 10:04:10 2013 (r254838) +++ projects/random_number_generator/contrib/llvm/tools/lldb/source/Expression/IRForTarget.cpp Sun Aug 25 10:08:58 2013 (r254839) @@ -356,20 +356,6 @@ IRForTarget::ResolveFunctionPointers(llv if (value_ptr) *value_ptr = value; - - // If we are replacing a function with the nobuiltin attribute, it may - // be called with the builtin attribute on call sites. Remove any such - // attributes since it's illegal to have a builtin call to something - // other than a nobuiltin function. - if (fun->hasFnAttribute(Attribute::NoBuiltin)) { - Attribute builtin = Attribute::get(fun->getContext(), Attribute::Builtin); - - for (auto u = fun->use_begin(), e = fun->use_end(); u != e; ++u) { - if (auto call = dyn_cast(*u)) { - call->removeAttribute(AttributeSet::FunctionIndex, builtin); - } - } - } fun->replaceAllUsesWith(value); } Modified: projects/random_number_generator/etc/defaults/periodic.conf ============================================================================== --- projects/random_number_generator/etc/defaults/periodic.conf Sun Aug 25 10:04:10 2013 (r254838) +++ projects/random_number_generator/etc/defaults/periodic.conf Sun Aug 25 10:08:58 2013 (r254839) @@ -166,7 +166,6 @@ daily_local="/etc/daily.local" # Loca # 450.status-security above. daily_status_security_inline="NO" # Run inline ? daily_status_security_output="root" # user or /file -daily_status_security_noamd="NO" # Don't check amd mounts daily_status_security_logdir="/var/log" # Directory for logs daily_status_security_diff_flags="-b -u" # flags for diff output @@ -180,6 +179,7 @@ daily_status_security_neggrpperm_enable= daily_status_security_chkmounts_enable="YES" #daily_status_security_chkmounts_ignore="^amd:" # Don't check matching # FS types +daily_status_security_noamd="NO" # Don't check amd mounts # 300.chkuid0 daily_status_security_chkuid0_enable="YES" Modified: projects/random_number_generator/share/man/man9/EVENTHANDLER.9 ============================================================================== --- projects/random_number_generator/share/man/man9/EVENTHANDLER.9 Sun Aug 25 10:04:10 2013 (r254838) +++ projects/random_number_generator/share/man/man9/EVENTHANDLER.9 Sun Aug 25 10:08:58 2013 (r254839) @@ -202,6 +202,8 @@ Callbacks invoked when a BPF listener at .It Vt kld_load Callbacks invoked after a linker file has been loaded. .It Vt kld_unload +Callbacks invoked after a linker file has been successfully unloaded. +.It Vt kld_unload_try Callbacks invoked before a linker file is about to be unloaded. These callbacks may be used to return an error and prevent the unload from proceeding. Modified: projects/random_number_generator/share/man/man9/pfil.9 ============================================================================== --- projects/random_number_generator/share/man/man9/pfil.9 Sun Aug 25 10:04:10 2013 (r254838) +++ projects/random_number_generator/share/man/man9/pfil.9 Sun Aug 25 10:08:58 2013 (r254839) @@ -71,6 +71,7 @@ typedef int (*pfil_func_t)(void *arg, st .Fn pfil_wlock "struct pfil_head *" .Ft void .Fn pfil_wunlock "struct pfil_head *" +.Ed .Sh DESCRIPTION The .Nm @@ -241,8 +242,7 @@ Fine-grained locking was added in lock export was added in .Fx 10.0 . .Sh BUGS -The -.Fn When a +When a .Vt pfil_head is being modified, no traffic is diverted (to avoid deadlock). Modified: projects/random_number_generator/share/man/man9/timeout.9 ============================================================================== --- projects/random_number_generator/share/man/man9/timeout.9 Sun Aug 25 10:04:10 2013 (r254838) +++ projects/random_number_generator/share/man/man9/timeout.9 Sun Aug 25 10:08:58 2013 (r254839) @@ -256,7 +256,7 @@ after the callout function returns. .Pp The .Fn callout_init_rw -and the +and the .Fn callout_init_rm fuctions serve the need of using rwlocks and rmlocks in conjunction with callouts. Modified: projects/random_number_generator/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c ============================================================================== --- projects/random_number_generator/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c Sun Aug 25 10:04:10 2013 (r254838) +++ projects/random_number_generator/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c Sun Aug 25 10:08:58 2013 (r254839) @@ -242,7 +242,7 @@ int dtrace_in_probe; /* non-zero if exe uintptr_t dtrace_in_probe_addr; /* Address of invop when already in probe */ #endif static eventhandler_tag dtrace_kld_load_tag; -static eventhandler_tag dtrace_kld_unload_tag; +static eventhandler_tag dtrace_kld_unload_try_tag; #endif /* @@ -15351,7 +15351,7 @@ dtrace_kld_load(void *arg __unused, link } static void -dtrace_kld_unload(void *arg __unused, linker_file_t lf, int *error) +dtrace_kld_unload_try(void *arg __unused, linker_file_t lf, int *error) { if (*error != 0) Modified: projects/random_number_generator/sys/cddl/dev/dtrace/dtrace_load.c ============================================================================== --- projects/random_number_generator/sys/cddl/dev/dtrace/dtrace_load.c Sun Aug 25 10:04:10 2013 (r254838) +++ projects/random_number_generator/sys/cddl/dev/dtrace/dtrace_load.c Sun Aug 25 10:08:58 2013 (r254839) @@ -59,8 +59,8 @@ dtrace_load(void *dummy) /* Register callbacks for linker file load and unload events. */ dtrace_kld_load_tag = EVENTHANDLER_REGISTER(kld_load, dtrace_kld_load, NULL, EVENTHANDLER_PRI_ANY); - dtrace_kld_unload_tag = EVENTHANDLER_REGISTER(kld_unload, - dtrace_kld_unload, NULL, EVENTHANDLER_PRI_ANY); + dtrace_kld_unload_try_tag = EVENTHANDLER_REGISTER(kld_unload_try, + dtrace_kld_unload_try, NULL, EVENTHANDLER_PRI_ANY); /* * Initialise the mutexes without 'witness' because the dtrace Modified: projects/random_number_generator/sys/cddl/dev/dtrace/dtrace_unload.c ============================================================================== --- projects/random_number_generator/sys/cddl/dev/dtrace/dtrace_unload.c Sun Aug 25 10:04:10 2013 (r254838) +++ projects/random_number_generator/sys/cddl/dev/dtrace/dtrace_unload.c Sun Aug 25 10:08:58 2013 (r254839) @@ -68,7 +68,7 @@ dtrace_unload() dtrace_provider = NULL; EVENTHANDLER_DEREGISTER(kld_load, dtrace_kld_load_tag); - EVENTHANDLER_DEREGISTER(kld_unload, dtrace_kld_unload_tag); + EVENTHANDLER_DEREGISTER(kld_unload_try, dtrace_kld_unload_try_tag); if ((state = dtrace_anon_grab()) != NULL) { /* Modified: projects/random_number_generator/sys/cddl/dev/sdt/sdt.c ============================================================================== --- projects/random_number_generator/sys/cddl/dev/sdt/sdt.c Sun Aug 25 10:04:10 2013 (r254838) +++ projects/random_number_generator/sys/cddl/dev/sdt/sdt.c Sun Aug 25 10:08:58 2013 (r254839) @@ -59,7 +59,7 @@ static int sdt_unload(void *); static void sdt_create_provider(struct sdt_provider *); static void sdt_create_probe(struct sdt_probe *); static void sdt_kld_load(void *, struct linker_file *); -static void sdt_kld_unload(void *, struct linker_file *, int *); +static void sdt_kld_unload_try(void *, struct linker_file *, int *); static MALLOC_DEFINE(M_SDT, "SDT", "DTrace SDT providers"); @@ -95,7 +95,7 @@ static struct cdev *sdt_cdev; static TAILQ_HEAD(, sdt_provider) sdt_prov_list; eventhandler_tag sdt_kld_load_tag; -eventhandler_tag sdt_kld_unload_tag; +eventhandler_tag sdt_kld_unload_try_tag; static void sdt_create_provider(struct sdt_provider *prov) @@ -264,7 +264,7 @@ sdt_kld_load(void *arg __unused, struct } static void -sdt_kld_unload(void *arg __unused, struct linker_file *lf, int *error __unused) +sdt_kld_unload_try(void *arg __unused, struct linker_file *lf, int *error __unused) { struct sdt_provider *prov, **curr, **begin, **end, *tmp; @@ -319,8 +319,8 @@ sdt_load(void *arg __unused) sdt_kld_load_tag = EVENTHANDLER_REGISTER(kld_load, sdt_kld_load, NULL, EVENTHANDLER_PRI_ANY); - sdt_kld_unload_tag = EVENTHANDLER_REGISTER(kld_unload, sdt_kld_unload, - NULL, EVENTHANDLER_PRI_ANY); + sdt_kld_unload_try_tag = EVENTHANDLER_REGISTER(kld_unload_try, + sdt_kld_unload_try, NULL, EVENTHANDLER_PRI_ANY); /* Pick up probes from the kernel and already-loaded linker files. */ linker_file_foreach(sdt_linker_file_cb, NULL); @@ -332,7 +332,7 @@ sdt_unload(void *arg __unused) struct sdt_provider *prov, *tmp; EVENTHANDLER_DEREGISTER(kld_load, sdt_kld_load_tag); - EVENTHANDLER_DEREGISTER(kld_unload, sdt_kld_unload_tag); + EVENTHANDLER_DEREGISTER(kld_unload_try, sdt_kld_unload_try_tag); sdt_probe_func = sdt_probe_stub; Modified: projects/random_number_generator/sys/dev/cas/if_cas.c ============================================================================== --- projects/random_number_generator/sys/dev/cas/if_cas.c Sun Aug 25 10:04:10 2013 (r254838) +++ projects/random_number_generator/sys/dev/cas/if_cas.c Sun Aug 25 10:08:58 2013 (r254839) @@ -132,7 +132,7 @@ static void cas_detach(struct cas_softc static int cas_disable_rx(struct cas_softc *sc); static int cas_disable_tx(struct cas_softc *sc); static void cas_eint(struct cas_softc *sc, u_int status); -static void cas_free(void *arg1, void* arg2); +static void cas_free(struct mbuf *m, void *arg1, void* arg2); static void cas_init(void *xsc); static void cas_init_locked(struct cas_softc *sc); static void cas_init_regs(struct cas_softc *sc); @@ -1888,7 +1888,7 @@ cas_rint(struct cas_softc *sc) } static void -cas_free(void *arg1, void *arg2) +cas_free(struct mbuf *m, void *arg1, void *arg2) { struct cas_rxdsoft *rxds; struct cas_softc *sc; Modified: projects/random_number_generator/sys/dev/cxgb/cxgb_sge.c ============================================================================== --- projects/random_number_generator/sys/dev/cxgb/cxgb_sge.c Sun Aug 25 10:04:10 2013 (r254838) +++ projects/random_number_generator/sys/dev/cxgb/cxgb_sge.c Sun Aug 25 10:08:58 2013 (r254839) @@ -1470,9 +1470,9 @@ t3_encap(struct sge_qset *qs, struct mbu hdr->len = htonl(mlen | 0x80000000); if (__predict_false(mlen < TCPPKTHDRSIZE)) { - printf("mbuf=%p,len=%d,tso_segsz=%d,csum_flags=%#x,flags=%#x", + printf("mbuf=%p,len=%d,tso_segsz=%d,csum_flags=%b,flags=%#x", m0, mlen, m0->m_pkthdr.tso_segsz, - m0->m_pkthdr.csum_flags, m0->m_flags); + (int)m0->m_pkthdr.csum_flags, CSUM_BITS, m0->m_flags); panic("tx tso packet too small"); } @@ -2634,7 +2634,6 @@ t3_rx_eth(struct adapter *adap, struct m } m->m_pkthdr.rcvif = ifp; - m->m_pkthdr.header = mtod(m, uint8_t *) + sizeof(*cpl) + ethpad; /* * adjust after conversion to mbuf chain */ Modified: projects/random_number_generator/sys/dev/drm2/drmP.h ============================================================================== --- projects/random_number_generator/sys/dev/drm2/drmP.h Sun Aug 25 10:04:10 2013 (r254838) +++ projects/random_number_generator/sys/dev/drm2/drmP.h Sun Aug 25 10:08:58 2013 (r254839) @@ -317,6 +317,9 @@ typedef int8_t s8; #define DRM_HZ hz #define DRM_UDELAY(udelay) DELAY(udelay) +#define DRM_MDELAY(msecs) do { int loops = (msecs); \ + while (loops--) DELAY(1000); \ + } while (0) #define DRM_TIME_SLICE (hz/20) /* Time slice for GLXContexts */ #define DRM_GET_PRIV_SAREA(_dev, _ctx, _map) do { \ @@ -695,6 +698,7 @@ struct drm_gem_object { struct drm_driver_info { int (*load)(struct drm_device *, unsigned long flags); + int (*use_msi)(struct drm_device *, unsigned long flags); int (*firstopen)(struct drm_device *); int (*open)(struct drm_device *, struct drm_file *); void (*preclose)(struct drm_device *, struct drm_file *file_priv); @@ -733,6 +737,8 @@ struct drm_driver_info { int (*gem_init_object)(struct drm_gem_object *obj); void (*gem_free_object)(struct drm_gem_object *obj); + int (*gem_open_object)(struct drm_gem_object *, struct drm_file *); + void (*gem_close_object)(struct drm_gem_object *, struct drm_file *); struct cdev_pager_ops *gem_pager_ops; @@ -826,8 +832,10 @@ struct drm_device { struct drm_driver_info *driver; drm_pci_id_list_t *id_entry; /* PCI ID, name, and chipset private */ - u_int16_t pci_device; /* PCI device id */ - u_int16_t pci_vendor; /* PCI vendor id */ + uint16_t pci_device; /* PCI device id */ + uint16_t pci_vendor; /* PCI vendor id */ + uint16_t pci_subdevice; /* PCI subsystem device id */ + uint16_t pci_subvendor; /* PCI subsystem vendor id */ char *unique; /* Unique identifier: e.g., busid */ int unique_len; /* Length of unique field */ @@ -907,7 +915,7 @@ struct drm_device { struct drm_minor *control; /**< Control node for card */ struct drm_minor *primary; /**< render type primary screen head */ - void *drm_ttm_bo; + void *drm_ttm_bdev; struct unrhdr *drw_unrhdr; /* RB tree of drawable infos */ RB_HEAD(drawable_tree, bsd_drm_drawable_info) drw_head; @@ -1408,5 +1416,10 @@ do { \ #define KTR_DRM KTR_DEV #define KTR_DRM_REG KTR_SPARE3 +/* Error codes conversion from Linux to FreeBSD. */ +/* XXXKIB what is the right code for EREMOTEIO on FreeBSD? */ +#define EREMOTEIO ENXIO +#define ERESTARTSYS ERESTART + #endif /* __KERNEL__ */ #endif /* _DRM_P_H_ */ Copied: projects/random_number_generator/sys/dev/drm2/drm_buffer.c (from r254838, head/sys/dev/drm2/drm_buffer.c) ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/random_number_generator/sys/dev/drm2/drm_buffer.c Sun Aug 25 10:08:58 2013 (r254839, copy of r254838, head/sys/dev/drm2/drm_buffer.c) @@ -0,0 +1,183 @@ +/************************************************************************** + * + * Copyright 2010 Pauli Nieminen. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sub license, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + * USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * + **************************************************************************/ +/* + * Multipart buffer for coping data which is larger than the page size. + * + * Authors: + * Pauli Nieminen + */ + +#include +__FBSDID("$FreeBSD$"); + +#include + +/** + * Allocate the drm buffer object. + * + * buf: Pointer to a pointer where the object is stored. + * size: The number of bytes to allocate. + */ +int drm_buffer_alloc(struct drm_buffer **buf, int size) +{ + int nr_pages = size / PAGE_SIZE + 1; + int idx; + + /* Allocating pointer table to end of structure makes drm_buffer + * variable sized */ + *buf = malloc(sizeof(struct drm_buffer) + nr_pages*sizeof(char *), + DRM_MEM_DRIVER, M_ZERO | M_WAITOK); + + if (*buf == NULL) { + DRM_ERROR("Failed to allocate drm buffer object to hold" + " %d bytes in %d pages.\n", + size, nr_pages); + return -ENOMEM; + } + + (*buf)->size = size; + + for (idx = 0; idx < nr_pages; ++idx) { + + (*buf)->data[idx] = + malloc(min(PAGE_SIZE, size - idx * PAGE_SIZE), + DRM_MEM_DRIVER, M_WAITOK); + + + if ((*buf)->data[idx] == NULL) { + DRM_ERROR("Failed to allocate %dth page for drm" + " buffer with %d bytes and %d pages.\n", + idx + 1, size, nr_pages); + goto error_out; + } + + } + + return 0; + +error_out: + + /* Only last element can be null pointer so check for it first. */ + if ((*buf)->data[idx]) + free((*buf)->data[idx], DRM_MEM_DRIVER); + + for (--idx; idx >= 0; --idx) + free((*buf)->data[idx], DRM_MEM_DRIVER); + + free(*buf, DRM_MEM_DRIVER); + return -ENOMEM; +} + +/** + * Copy the user data to the begin of the buffer and reset the processing + * iterator. + * + * user_data: A pointer the data that is copied to the buffer. + * size: The Number of bytes to copy. + */ +int drm_buffer_copy_from_user(struct drm_buffer *buf, + void __user *user_data, int size) +{ + int nr_pages = size / PAGE_SIZE + 1; + int idx; + + if (size > buf->size) { + DRM_ERROR("Requesting to copy %d bytes to a drm buffer with" + " %d bytes space\n", + size, buf->size); + return -EFAULT; + } + + for (idx = 0; idx < nr_pages; ++idx) { + + if (DRM_COPY_FROM_USER(buf->data[idx], + (char *)user_data + idx * PAGE_SIZE, + min(PAGE_SIZE, size - idx * PAGE_SIZE))) { + DRM_ERROR("Failed to copy user data (%p) to drm buffer" + " (%p) %dth page.\n", + user_data, buf, idx); + return -EFAULT; + + } + } + buf->iterator = 0; + return 0; +} + +/** + * Free the drm buffer object + */ +void drm_buffer_free(struct drm_buffer *buf) +{ + + if (buf != NULL) { + + int nr_pages = buf->size / PAGE_SIZE + 1; + int idx; + for (idx = 0; idx < nr_pages; ++idx) + free(buf->data[idx], DRM_MEM_DRIVER); + + free(buf, DRM_MEM_DRIVER); + } +} + +/** + * Read an object from buffer that may be split to multiple parts. If object + * is not split function just returns the pointer to object in buffer. But in + * case of split object data is copied to given stack object that is suplied + * by caller. + * + * The processing location of the buffer is also advanced to the next byte + * after the object. + * + * objsize: The size of the objet in bytes. + * stack_obj: A pointer to a memory location where object can be copied. + */ +void *drm_buffer_read_object(struct drm_buffer *buf, + int objsize, void *stack_obj) +{ + int idx = drm_buffer_index(buf); + int page = drm_buffer_page(buf); + void *obj = NULL; + + if (idx + objsize <= PAGE_SIZE) { + obj = &buf->data[page][idx]; + } else { + /* The object is split which forces copy to temporary object.*/ + int beginsz = PAGE_SIZE - idx; + memcpy(stack_obj, &buf->data[page][idx], beginsz); + + memcpy((char *)stack_obj + beginsz, &buf->data[page + 1][0], + objsize - beginsz); + + obj = stack_obj; + } + + drm_buffer_advance(buf, objsize); + return obj; +} Copied: projects/random_number_generator/sys/dev/drm2/drm_buffer.h (from r254838, head/sys/dev/drm2/drm_buffer.h) ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/random_number_generator/sys/dev/drm2/drm_buffer.h Sun Aug 25 10:08:58 2013 (r254839, copy of r254838, head/sys/dev/drm2/drm_buffer.h) @@ -0,0 +1,151 @@ +/************************************************************************** + * + * Copyright 2010 Pauli Nieminen. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sub license, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + * USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * + **************************************************************************/ +/* + * Multipart buffer for coping data which is larger than the page size. + * + * Authors: + * Pauli Nieminen + */ + +#include +__FBSDID("$FreeBSD$"); + +#ifndef _DRM_BUFFER_H_ +#define _DRM_BUFFER_H_ + +#include + +struct drm_buffer { + int iterator; + int size; + char *data[]; +}; + + +/** + * Return the index of page that buffer is currently pointing at. + */ +static inline int drm_buffer_page(struct drm_buffer *buf) +{ + return buf->iterator / PAGE_SIZE; +} +/** + * Return the index of the current byte in the page + */ +static inline int drm_buffer_index(struct drm_buffer *buf) +{ + return buf->iterator & (PAGE_SIZE - 1); +} +/** + * Return number of bytes that is left to process + */ +static inline int drm_buffer_unprocessed(struct drm_buffer *buf) +{ + return buf->size - buf->iterator; +} + +/** + * Advance the buffer iterator number of bytes that is given. + */ +static inline void drm_buffer_advance(struct drm_buffer *buf, int bytes) +{ + buf->iterator += bytes; +} + +/** + * Allocate the drm buffer object. + * + * buf: A pointer to a pointer where the object is stored. + * size: The number of bytes to allocate. + */ +extern int drm_buffer_alloc(struct drm_buffer **buf, int size); + +/** + * Copy the user data to the begin of the buffer and reset the processing + * iterator. + * + * user_data: A pointer the data that is copied to the buffer. + * size: The Number of bytes to copy. + */ +extern int drm_buffer_copy_from_user(struct drm_buffer *buf, + void __user *user_data, int size); + +/** + * Free the drm buffer object + */ +extern void drm_buffer_free(struct drm_buffer *buf); + +/** + * Read an object from buffer that may be split to multiple parts. If object + * is not split function just returns the pointer to object in buffer. But in + * case of split object data is copied to given stack object that is suplied + * by caller. + * + * The processing location of the buffer is also advanced to the next byte + * after the object. + * + * objsize: The size of the objet in bytes. + * stack_obj: A pointer to a memory location where object can be copied. + */ +extern void *drm_buffer_read_object(struct drm_buffer *buf, + int objsize, void *stack_obj); + +/** + * Returns the pointer to the dword which is offset number of elements from the + * current processing location. + * + * Caller must make sure that dword is not split in the buffer. This + * requirement is easily met if all the sizes of objects in buffer are + * multiples of dword and PAGE_SIZE is multiple dword. + * + * Call to this function doesn't change the processing location. + * + * offset: The index of the dword relative to the internat iterator. + */ +static inline void *drm_buffer_pointer_to_dword(struct drm_buffer *buffer, + int offset) +{ + int iter = buffer->iterator + offset * 4; + return &buffer->data[iter / PAGE_SIZE][iter & (PAGE_SIZE - 1)]; +} +/** + * Returns the pointer to the dword which is offset number of elements from + * the current processing location. + * + * Call to this function doesn't change the processing location. + * + * offset: The index of the byte relative to the internat iterator. + */ +static inline void *drm_buffer_pointer_to_byte(struct drm_buffer *buffer, + int offset) +{ + int iter = buffer->iterator + offset; + return &buffer->data[iter / PAGE_SIZE][iter & (PAGE_SIZE - 1)]; +} + +#endif Copied: projects/random_number_generator/sys/dev/drm2/drm_core.h (from r254838, head/sys/dev/drm2/drm_core.h) ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/random_number_generator/sys/dev/drm2/drm_core.h Sun Aug 25 10:08:58 2013 (r254839, copy of r254838, head/sys/dev/drm2/drm_core.h) @@ -0,0 +1,38 @@ +/* + * Copyright 2004 Jon Smirl + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#define CORE_AUTHOR "Gareth Hughes, Leif Delgass, José Fonseca, Jon Smirl" + +#define CORE_NAME "drm" +#define CORE_DESC "DRM shared core routines" +#define CORE_DATE "20060810" + +#define DRM_IF_MAJOR 1 +#define DRM_IF_MINOR 4 + +#define CORE_MAJOR 1 +#define CORE_MINOR 1 +#define CORE_PATCHLEVEL 0 Modified: projects/random_number_generator/sys/dev/drm2/drm_crtc.c ============================================================================== --- projects/random_number_generator/sys/dev/drm2/drm_crtc.c Sun Aug 25 10:04:10 2013 (r254838) +++ projects/random_number_generator/sys/dev/drm2/drm_crtc.c Sun Aug 25 10:08:58 2013 (r254839) @@ -170,6 +170,9 @@ static struct drm_prop_enum_list drm_enc { DRM_MODE_ENCODER_TVDAC, "TV" }, }; +static void drm_property_destroy_blob(struct drm_device *dev, + struct drm_property_blob *blob); + char *drm_get_encoder_name(struct drm_encoder *encoder) { static char buf[32]; @@ -520,6 +523,8 @@ void drm_connector_cleanup(struct drm_co drm_mode_remove(connector, mode); sx_xlock(&dev->mode_config.mutex); + if (connector->edid_blob_ptr) + drm_property_destroy_blob(dev, connector->edid_blob_ptr); drm_mode_object_put(dev, &connector->base); list_del(&connector->head); dev->mode_config.num_connector--; Modified: projects/random_number_generator/sys/dev/drm2/drm_crtc.h ============================================================================== --- projects/random_number_generator/sys/dev/drm2/drm_crtc.h Sun Aug 25 10:04:10 2013 (r254838) +++ projects/random_number_generator/sys/dev/drm2/drm_crtc.h Sun Aug 25 10:08:58 2013 (r254839) @@ -659,7 +659,7 @@ struct drm_mode_config { int min_width, min_height; int max_width, max_height; - struct drm_mode_config_funcs *funcs; + const struct drm_mode_config_funcs *funcs; resource_size_t fb_base; /* output poll support */ Modified: projects/random_number_generator/sys/dev/drm2/drm_crtc_helper.h ============================================================================== --- projects/random_number_generator/sys/dev/drm2/drm_crtc_helper.h Sun Aug 25 10:04:10 2013 (r254838) +++ projects/random_number_generator/sys/dev/drm2/drm_crtc_helper.h Sun Aug 25 10:08:58 2013 (r254839) @@ -51,7 +51,7 @@ struct drm_crtc_helper_funcs { /* Provider can fixup or change mode timings before modeset occurs */ bool (*mode_fixup)(struct drm_crtc *crtc, - struct drm_display_mode *mode, + const struct drm_display_mode *mode, struct drm_display_mode *adjusted_mode); /* Actually set the mode */ int (*mode_set)(struct drm_crtc *crtc, struct drm_display_mode *mode, @@ -78,7 +78,7 @@ struct drm_encoder_helper_funcs { void (*restore)(struct drm_encoder *encoder); bool (*mode_fixup)(struct drm_encoder *encoder, - struct drm_display_mode *mode, + const struct drm_display_mode *mode, struct drm_display_mode *adjusted_mode); void (*prepare)(struct drm_encoder *encoder); void (*commit)(struct drm_encoder *encoder); Copied: projects/random_number_generator/sys/dev/drm2/drm_dp_helper.c (from r254838, head/sys/dev/drm2/drm_dp_helper.c) ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/random_number_generator/sys/dev/drm2/drm_dp_helper.c Sun Aug 25 10:08:58 2013 (r254839, copy of r254838, head/sys/dev/drm2/drm_dp_helper.c) @@ -0,0 +1,147 @@ +/* + * Copyright © 2009 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that copyright + * notice and this permission notice appear in supporting documentation, and + * that the name of the copyright holders not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. The copyright holders make no representations + * about the suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include + +/** + * DOC: dp helpers + * + * These functions contain some common logic and helpers at various abstraction + * levels to deal with Display Port sink devices and related things like DP aux + * channel transfers, EDID reading over DP aux channels, decoding certain DPCD + * blocks, ... + */ + +static u8 dp_link_status(u8 link_status[DP_LINK_STATUS_SIZE], int r) +{ + return link_status[r - DP_LANE0_1_STATUS]; +} + +static u8 dp_get_lane_status(u8 link_status[DP_LINK_STATUS_SIZE], + int lane) +{ + int i = DP_LANE0_1_STATUS + (lane >> 1); + int s = (lane & 1) * 4; + u8 l = dp_link_status(link_status, i); + return (l >> s) & 0xf; +} + +bool drm_dp_channel_eq_ok(u8 link_status[DP_LINK_STATUS_SIZE], + int lane_count) +{ + u8 lane_align; + u8 lane_status; + int lane; + + lane_align = dp_link_status(link_status, + DP_LANE_ALIGN_STATUS_UPDATED); + if ((lane_align & DP_INTERLANE_ALIGN_DONE) == 0) + return false; + for (lane = 0; lane < lane_count; lane++) { + lane_status = dp_get_lane_status(link_status, lane); + if ((lane_status & DP_CHANNEL_EQ_BITS) != DP_CHANNEL_EQ_BITS) + return false; + } + return true; +} + +bool drm_dp_clock_recovery_ok(u8 link_status[DP_LINK_STATUS_SIZE], + int lane_count) +{ + int lane; + u8 lane_status; + + for (lane = 0; lane < lane_count; lane++) { + lane_status = dp_get_lane_status(link_status, lane); + if ((lane_status & DP_LANE_CR_DONE) == 0) + return false; + } + return true; +} + +u8 drm_dp_get_adjust_request_voltage(u8 link_status[DP_LINK_STATUS_SIZE], + int lane) +{ + int i = DP_ADJUST_REQUEST_LANE0_1 + (lane >> 1); + int s = ((lane & 1) ? + DP_ADJUST_VOLTAGE_SWING_LANE1_SHIFT : + DP_ADJUST_VOLTAGE_SWING_LANE0_SHIFT); + u8 l = dp_link_status(link_status, i); + + return ((l >> s) & 0x3) << DP_TRAIN_VOLTAGE_SWING_SHIFT; +} + +u8 drm_dp_get_adjust_request_pre_emphasis(u8 link_status[DP_LINK_STATUS_SIZE], + int lane) +{ + int i = DP_ADJUST_REQUEST_LANE0_1 + (lane >> 1); + int s = ((lane & 1) ? + DP_ADJUST_PRE_EMPHASIS_LANE1_SHIFT : + DP_ADJUST_PRE_EMPHASIS_LANE0_SHIFT); *** DIFF OUTPUT TRUNCATED AT 1000 LINES *** From owner-svn-src-projects@FreeBSD.ORG Sun Aug 25 11:21:10 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id CA9A8982; Sun, 25 Aug 2013 11:21:10 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 9F62D2848; Sun, 25 Aug 2013 11:21:10 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id r7PBLAL2033537; Sun, 25 Aug 2013 11:21:10 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id r7PBLA3v033536; Sun, 25 Aug 2013 11:21:10 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201308251121.r7PBLA3v033536@svn.freebsd.org> From: Alexander Motin Date: Sun, 25 Aug 2013 11:21:10 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r254846 - projects/camlock/sys/cddl/contrib/opensolaris/uts/common/fs/zfs X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 25 Aug 2013 11:21:10 -0000 Author: mav Date: Sun Aug 25 11:21:10 2013 New Revision: 254846 URL: http://svnweb.freebsd.org/changeset/base/254846 Log: Allow GEOM direct dispatch for zvol providers. Skip request handover to the worker thread if current context allows sleeping (thanks to the direct dispatch in action we are not in GEOM thread). Together this doubles zvol performance, reaching up to 300K IOPS on my tests. If there would be unmapped I/O support for zvols, the above value could be even bigger. Modified: projects/camlock/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zvol.c Modified: projects/camlock/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zvol.c ============================================================================== --- projects/camlock/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zvol.c Sun Aug 25 11:21:03 2013 (r254845) +++ projects/camlock/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zvol.c Sun Aug 25 11:21:10 2013 (r254846) @@ -2068,6 +2068,7 @@ zvol_geom_create(const char *name) gp->start = zvol_geom_start; gp->access = zvol_geom_access; pp = g_new_providerf(gp, "%s/%s", ZVOL_DRIVER, name); + pp->flags |= G_PF_DIRECT_RECEIVE | G_PF_DIRECT_SEND; pp->sectorsize = DEV_BSIZE; zv = kmem_zalloc(sizeof(*zv), KM_SLEEP); @@ -2171,18 +2172,20 @@ zvol_geom_start(struct bio *bp) zvol_state_t *zv; boolean_t first; + zv = bp->bio_to->private; + ASSERT(zv != NULL); switch (bp->bio_cmd) { + case BIO_FLUSH: + if (curthread->td_no_sleeping != 0) + goto enqueue; + zil_commit(zv->zv_zilog, ZVOL_OBJ); + g_io_deliver(bp, 0); + break; case BIO_READ: case BIO_WRITE: - case BIO_FLUSH: - zv = bp->bio_to->private; - ASSERT(zv != NULL); - mtx_lock(&zv->zv_queue_mtx); - first = (bioq_first(&zv->zv_queue) == NULL); - bioq_insert_tail(&zv->zv_queue, bp); - mtx_unlock(&zv->zv_queue_mtx); - if (first) - wakeup_one(&zv->zv_queue); + if (curthread->td_no_sleeping != 0) + goto enqueue; + zvol_strategy(bp); break; case BIO_GETATTR: case BIO_DELETE: @@ -2190,6 +2193,15 @@ zvol_geom_start(struct bio *bp) g_io_deliver(bp, EOPNOTSUPP); break; } + return; + +enqueue: + mtx_lock(&zv->zv_queue_mtx); + first = (bioq_first(&zv->zv_queue) == NULL); + bioq_insert_tail(&zv->zv_queue, bp); + mtx_unlock(&zv->zv_queue_mtx); + if (first) + wakeup_one(&zv->zv_queue); } static void @@ -2364,6 +2376,7 @@ zvol_rename_minor(struct g_geom *gp, con g_wither_provider(pp, ENXIO); pp = g_new_providerf(gp, "%s/%s", ZVOL_DRIVER, newname); + pp->flags |= G_PF_DIRECT_RECEIVE | G_PF_DIRECT_SEND; pp->sectorsize = DEV_BSIZE; pp->mediasize = zv->zv_volsize; pp->private = zv; From owner-svn-src-projects@FreeBSD.ORG Sun Aug 25 12:12:30 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 64538478; Sun, 25 Aug 2013 12:12:30 +0000 (UTC) (envelope-from mavbsd@gmail.com) Received: from mail-ee0-x234.google.com (mail-ee0-x234.google.com [IPv6:2a00:1450:4013:c00::234]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id C37982AA1; Sun, 25 Aug 2013 12:12:29 +0000 (UTC) Received: by mail-ee0-f52.google.com with SMTP id c41so1108131eek.11 for ; Sun, 25 Aug 2013 05:12:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:message-id:date:from:user-agent:mime-version:to:subject :references:in-reply-to:content-type:content-transfer-encoding; bh=UEVEN/A+6r0BBjRvc5l+iWc/9SjoIkX5uswx8uTXN/4=; b=pos/LJlTiS8ndJlBXo4TNTUDX5lcKAcuMrk/qXN3IuBrsrYdXtTxIWtwyQ6b2Hz5e9 /FDBy8QUxSAboAjJRwklLxsaizKIfBQ464bBlmQ7tzudAkz3eCCIETCsm9HjfV3ym0O4 AefTjH40Lv/L0puRp+q3tNPuBLMsNOhzp33FgFH2p0QE1hPlfIRCJv4cKV3R+rYpYb+C ycRx2QoBioCzQaoDl9g0z1rHXgCMxM5ywSacm2sKBjOr6e5FvQ2oJVkbtNHgk38EPPaZ TaxTkUbT+ktUYwwhEbAjNnNG/aMosM55MTc25jh7JgwQz+qFvblQxAXEZwMpemEQqK/k l3iw== X-Received: by 10.14.108.9 with SMTP id p9mr16491666eeg.8.1377432748021; Sun, 25 Aug 2013 05:12:28 -0700 (PDT) Received: from mavbook.mavhome.dp.ua ([37.229.21.195]) by mx.google.com with ESMTPSA id j7sm13609844eeo.15.1969.12.31.16.00.00 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sun, 25 Aug 2013 05:12:27 -0700 (PDT) Sender: Alexander Motin Message-ID: <5219F4A9.2090501@FreeBSD.org> Date: Sun, 25 Aug 2013 15:12:25 +0300 From: Alexander Motin User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:17.0) Gecko/20130616 Thunderbird/17.0.6 MIME-Version: 1.0 To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: Re: svn commit: r254846 - projects/camlock/sys/cddl/contrib/opensolaris/uts/common/fs/zfs References: <201308251121.r7PBLA3v033536@svn.freebsd.org> In-Reply-To: <201308251121.r7PBLA3v033536@svn.freebsd.org> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 25 Aug 2013 12:12:30 -0000 On 25.08.2013 14:21, Alexander Motin wrote: > Author: mav > Date: Sun Aug 25 11:21:10 2013 > New Revision: 254846 > URL: http://svnweb.freebsd.org/changeset/base/254846 > > Log: > Allow GEOM direct dispatch for zvol providers. Skip request handover to > the worker thread if current context allows sleeping (thanks to the direct > dispatch in action we are not in GEOM thread). > > Together this doubles zvol performance, reaching up to 300K IOPS on my tests. > If there would be unmapped I/O support for zvols, the above value could be > even bigger. I heavily underestimated effect of this change for the case of uncached reads and probably synchronous writes. Due to synchronous nature of the code, parallel execution introduced by this change can increase performance by much more then mentioned two times. With 8-64 threads doing uncached random read this change gives 6-10x performance! Now I am very curios why zvol was made to have only one worker thread per zvol, while multiple threads there could give major improvement even without direct dispatch. -- Alexander Motin From owner-svn-src-projects@FreeBSD.ORG Sun Aug 25 12:26:37 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 2D58C9B7 for ; Sun, 25 Aug 2013 12:26:37 +0000 (UTC) (envelope-from andre@freebsd.org) Received: from c00l3r.networx.ch (c00l3r.networx.ch [62.48.2.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 93FD42B1B for ; Sun, 25 Aug 2013 12:26:36 +0000 (UTC) Received: (qmail 666 invoked from network); 25 Aug 2013 13:08:58 -0000 Received: from c00l3r.networx.ch (HELO [127.0.0.1]) ([62.48.2.2]) (envelope-sender ) by c00l3r.networx.ch (qmail-ldap-1.03) with SMTP for ; 25 Aug 2013 13:08:58 -0000 Message-ID: <5219F7EF.1050901@freebsd.org> Date: Sun, 25 Aug 2013 14:26:23 +0200 From: Andre Oppermann User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Alexander Motin Subject: Re: svn commit: r254846 - projects/camlock/sys/cddl/contrib/opensolaris/uts/common/fs/zfs References: <201308251121.r7PBLA3v033536@svn.freebsd.org> <5219F4A9.2090501@FreeBSD.org> In-Reply-To: <5219F4A9.2090501@FreeBSD.org> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Cc: svn-src-projects@freebsd.org, src-committers@freebsd.org X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 25 Aug 2013 12:26:37 -0000 On 25.08.2013 14:12, Alexander Motin wrote: > On 25.08.2013 14:21, Alexander Motin wrote: >> Author: mav >> Date: Sun Aug 25 11:21:10 2013 >> New Revision: 254846 >> URL: http://svnweb.freebsd.org/changeset/base/254846 >> >> Log: >> Allow GEOM direct dispatch for zvol providers. Skip request handover to >> the worker thread if current context allows sleeping (thanks to the direct >> dispatch in action we are not in GEOM thread). >> >> Together this doubles zvol performance, reaching up to 300K IOPS on my tests. >> If there would be unmapped I/O support for zvols, the above value could be >> even bigger. > > I heavily underestimated effect of this change for the case of uncached reads and probably > synchronous writes. Due to synchronous nature of the code, parallel execution introduced by this > change can increase performance by much more then mentioned two times. With 8-64 threads doing > uncached random read this change gives 6-10x performance! Any chance for this to make it into HEAD before API freeze? > Now I am very curios why zvol was made to have only one worker thread per zvol, while multiple > threads there could give major improvement even without direct dispatch. -- Andre From owner-svn-src-projects@FreeBSD.ORG Sun Aug 25 12:48:23 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 322C1424; Sun, 25 Aug 2013 12:48:23 +0000 (UTC) (envelope-from adrian.chadd@gmail.com) Received: from mail-qe0-x234.google.com (mail-qe0-x234.google.com [IPv6:2607:f8b0:400d:c02::234]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id C41982C0B; Sun, 25 Aug 2013 12:48:22 +0000 (UTC) Received: by mail-qe0-f52.google.com with SMTP id a11so1220202qen.25 for ; Sun, 25 Aug 2013 05:48:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:date:message-id:subject :from:to:cc:content-type; bh=7UkpE2LpbzV/httsCFKcqUU0rkRl7jWPZ6XWUwBDaT8=; b=S89dA+Kn+G0wklot+ib7+jhV8jyln97KthWI1ati//u/5WT33Et3rodfrXJWJLrF0h Ys7QS+ZVvT9SYWLgIUyukji/qIXMZ8A15XtMqNNwaewP0CSGxXZUplcj0nVP0Xe8MZ1s C7HNnnOqalmaCSfRJpIscBOfX3gw3VJgb3HzUCDNrIowisOSIQue88/Ty1VIMW74P8Xz tTDmUALSlse+o3QwDvS2JFoUqssD0YfIRj8GmgLDzNMU+RpENUmBrteeNkaFyrNA1vnt LDTZtzIXk49hstpug1xPyefuw8z2H/5c2RJ2Bq78+dMP5MM+eo+NIik6CLVsPlreGOCt GRRA== MIME-Version: 1.0 X-Received: by 10.224.34.68 with SMTP id k4mr10345807qad.17.1377434902011; Sun, 25 Aug 2013 05:48:22 -0700 (PDT) Sender: adrian.chadd@gmail.com Received: by 10.224.128.70 with HTTP; Sun, 25 Aug 2013 05:48:21 -0700 (PDT) In-Reply-To: <201308251121.r7PBLA3v033536@svn.freebsd.org> References: <201308251121.r7PBLA3v033536@svn.freebsd.org> Date: Sun, 25 Aug 2013 05:48:21 -0700 X-Google-Sender-Auth: 9pqHSjOwYptjsrV6-8HRRRezHGc Message-ID: Subject: Re: svn commit: r254846 - projects/camlock/sys/cddl/contrib/opensolaris/uts/common/fs/zfs From: Adrian Chadd To: Alexander Motin Content-Type: text/plain; charset=ISO-8859-1 X-Content-Filtered-By: Mailman/MimeDel 2.1.14 Cc: svn-src-projects@freebsd.org, "src-committers@freebsd.org" X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 25 Aug 2013 12:48:23 -0000 Hi, (I know this is bikeshedding, sorry!) Surely there's a better way to check whether a thread can sleep besides digging around in curthread->td_no_sleeping ? What about adding an accessor macro along side THREAD_SLEEPING_OK and THREAD_NO_SLEEPING ? I assume that td_no_sleeping won't change during the execution of a thread? (Eg if it's preempted by anything?) It looks like it's only set when doing rmlock, timeout or ithread calls, to ensure the thread doesn't sleep. Thanks, -adrian On 25 August 2013 04:21, Alexander Motin wrote: > Author: mav > Date: Sun Aug 25 11:21:10 2013 > New Revision: 254846 > URL: http://svnweb.freebsd.org/changeset/base/254846 > > Log: > Allow GEOM direct dispatch for zvol providers. Skip request handover to > the worker thread if current context allows sleeping (thanks to the > direct > dispatch in action we are not in GEOM thread). > > Together this doubles zvol performance, reaching up to 300K IOPS on my > tests. > If there would be unmapped I/O support for zvols, the above value could > be > even bigger. > > Modified: > projects/camlock/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zvol.c > > Modified: > projects/camlock/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zvol.c > > ============================================================================== > --- projects/camlock/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zvol.c > Sun Aug 25 11:21:03 2013 (r254845) > +++ projects/camlock/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zvol.c > Sun Aug 25 11:21:10 2013 (r254846) > @@ -2068,6 +2068,7 @@ zvol_geom_create(const char *name) > gp->start = zvol_geom_start; > gp->access = zvol_geom_access; > pp = g_new_providerf(gp, "%s/%s", ZVOL_DRIVER, name); > + pp->flags |= G_PF_DIRECT_RECEIVE | G_PF_DIRECT_SEND; > pp->sectorsize = DEV_BSIZE; > > zv = kmem_zalloc(sizeof(*zv), KM_SLEEP); > @@ -2171,18 +2172,20 @@ zvol_geom_start(struct bio *bp) > zvol_state_t *zv; > boolean_t first; > > + zv = bp->bio_to->private; > + ASSERT(zv != NULL); > switch (bp->bio_cmd) { > + case BIO_FLUSH: > + if (curthread->td_no_sleeping != 0) > + goto enqueue; > + zil_commit(zv->zv_zilog, ZVOL_OBJ); > + g_io_deliver(bp, 0); > + break; > case BIO_READ: > case BIO_WRITE: > - case BIO_FLUSH: > - zv = bp->bio_to->private; > - ASSERT(zv != NULL); > - mtx_lock(&zv->zv_queue_mtx); > - first = (bioq_first(&zv->zv_queue) == NULL); > - bioq_insert_tail(&zv->zv_queue, bp); > - mtx_unlock(&zv->zv_queue_mtx); > - if (first) > - wakeup_one(&zv->zv_queue); > + if (curthread->td_no_sleeping != 0) > + goto enqueue; > + zvol_strategy(bp); > break; > case BIO_GETATTR: > case BIO_DELETE: > @@ -2190,6 +2193,15 @@ zvol_geom_start(struct bio *bp) > g_io_deliver(bp, EOPNOTSUPP); > break; > } > + return; > + > +enqueue: > + mtx_lock(&zv->zv_queue_mtx); > + first = (bioq_first(&zv->zv_queue) == NULL); > + bioq_insert_tail(&zv->zv_queue, bp); > + mtx_unlock(&zv->zv_queue_mtx); > + if (first) > + wakeup_one(&zv->zv_queue); > } > > static void > @@ -2364,6 +2376,7 @@ zvol_rename_minor(struct g_geom *gp, con > g_wither_provider(pp, ENXIO); > > pp = g_new_providerf(gp, "%s/%s", ZVOL_DRIVER, newname); > + pp->flags |= G_PF_DIRECT_RECEIVE | G_PF_DIRECT_SEND; > pp->sectorsize = DEV_BSIZE; > pp->mediasize = zv->zv_volsize; > pp->private = zv; > From owner-svn-src-projects@FreeBSD.ORG Sun Aug 25 13:21:50 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 8298BCB5; Sun, 25 Aug 2013 13:21:50 +0000 (UTC) (envelope-from mavbsd@gmail.com) Received: from mail-ee0-x22e.google.com (mail-ee0-x22e.google.com [IPv6:2a00:1450:4013:c00::22e]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id B6D382D76; Sun, 25 Aug 2013 13:21:49 +0000 (UTC) Received: by mail-ee0-f46.google.com with SMTP id c13so1116027eek.33 for ; Sun, 25 Aug 2013 06:21:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:message-id:date:from:user-agent:mime-version:to:cc:subject :references:in-reply-to:content-type:content-transfer-encoding; bh=pP0imFa8fGG6XKt3fxcCVaayKRcUlgKFJN2yCECb1ww=; b=wLRlWHjVUf01aeooxgaw2ZfuOFc3NN2UZ73I7hEAeeZOKALYjaZSjyVg48zakkpJI5 A41sm+a4U6wE3tazFX+j+p3HQ89OH2i4QN+kasifzYpBPd1ocTjEJSCFkoOQPVbPgPoE s+VVOv++gqeQhnRa+R9I+JQHojMkx1P2GzZNAlhaq7vCsC/ZoL6bAKdymScKig/9xxBf CIKTZPX30Zt9weG18XDdk4pOXKdpd3HeGzb1YhsrcAGlzjdHTJPTGN+GOKsdeumBglNT c55ybLQ9fkadUlKeslsMdmNBBHcqdNV8JB72GDR6lNZGHvP7j/5aT6o9+JVaIy2iydmj knZA== X-Received: by 10.14.214.136 with SMTP id c8mr16676584eep.6.1377436907668; Sun, 25 Aug 2013 06:21:47 -0700 (PDT) Received: from mavbook.mavhome.dp.ua ([37.229.21.195]) by mx.google.com with ESMTPSA id x47sm13953914eea.16.1969.12.31.16.00.00 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sun, 25 Aug 2013 06:21:46 -0700 (PDT) Sender: Alexander Motin Message-ID: <521A04E8.4010406@FreeBSD.org> Date: Sun, 25 Aug 2013 16:21:44 +0300 From: Alexander Motin User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:17.0) Gecko/20130616 Thunderbird/17.0.6 MIME-Version: 1.0 To: Andre Oppermann Subject: Re: svn commit: r254846 - projects/camlock/sys/cddl/contrib/opensolaris/uts/common/fs/zfs References: <201308251121.r7PBLA3v033536@svn.freebsd.org> <5219F4A9.2090501@FreeBSD.org> <5219F7EF.1050901@freebsd.org> In-Reply-To: <5219F7EF.1050901@freebsd.org> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Cc: svn-src-projects@freebsd.org, src-committers@freebsd.org X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 25 Aug 2013 13:21:50 -0000 On 25.08.2013 15:26, Andre Oppermann wrote: > On 25.08.2013 14:12, Alexander Motin wrote: >> On 25.08.2013 14:21, Alexander Motin wrote: >>> Author: mav >>> Date: Sun Aug 25 11:21:10 2013 >>> New Revision: 254846 >>> URL: http://svnweb.freebsd.org/changeset/base/254846 >>> >>> Log: >>> Allow GEOM direct dispatch for zvol providers. Skip request >>> handover to >>> the worker thread if current context allows sleeping (thanks to >>> the direct >>> dispatch in action we are not in GEOM thread). >>> >>> Together this doubles zvol performance, reaching up to 300K IOPS >>> on my tests. >>> If there would be unmapped I/O support for zvols, the above value >>> could be >>> even bigger. >> >> I heavily underestimated effect of this change for the case of >> uncached reads and probably >> synchronous writes. Due to synchronous nature of the code, parallel >> execution introduced by this >> change can increase performance by much more then mentioned two times. >> With 8-64 threads doing >> uncached random read this change gives 6-10x performance! > > Any chance for this to make it into HEAD before API freeze? GEOM direct dispatch code is still very experimental and this change is an integral part of it. If there would be month or two ahead before slush, I would say there is a chance to merge both CAM and GEOM changes. But we are already in code slush state, so I doubt, unless I would be gives some official carte blanche and active help in code review and testing. While I think CAM locking changes are quite complete already, I still got no any real reviews for them 10 days after posting to the lists. :( GEOM changes I've done so far are quite small and are not breaking any KPI/KBI, only extending them, so they probably could be merged to 10-STABLE at any point later. CAM changes are much bigger and more invasive, but mostly for CAM internals. I haven't checked explicitly, but I hope that binary controller drivers compatibility should not be broken, so hopefully it also could be merged too. >> Now I am very curios why zvol was made to have only one worker thread >> per zvol, while multiple >> threads there could give major improvement even without direct dispatch. Simple introduction of multiple worker threads to zvol could also help a lot for case of synchronous I/O. Somewhat less then direct dispatch, but that would be smaller and independent change. -- Alexander Motin From owner-svn-src-projects@FreeBSD.ORG Sun Aug 25 13:29:12 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 0D7F7DF5; Sun, 25 Aug 2013 13:29:12 +0000 (UTC) (envelope-from mavbsd@gmail.com) Received: from mail-ee0-x230.google.com (mail-ee0-x230.google.com [IPv6:2a00:1450:4013:c00::230]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 347A52D9D; Sun, 25 Aug 2013 13:29:11 +0000 (UTC) Received: by mail-ee0-f48.google.com with SMTP id l10so1097216eei.7 for ; Sun, 25 Aug 2013 06:29:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:message-id:date:from:user-agent:mime-version:to:cc:subject :references:in-reply-to:content-type:content-transfer-encoding; bh=lEM8wDvLwIQEnTGL09SeECBioe804q3Pm6RALsXWsBI=; b=NBzZ9fwr8GX17NmrSjwmZw3GRxwPwgKIkvXMNYsPYJ07rnRYJQnRtaT+DgU0brTqSQ d8c743N2eCH0sQOqFhWHgl8GP50699/lgsBvb1C5PhpbjeBu46I/2TwcIBV8RGuwyg5J yCeQDQvL2yhZR1arxO3J4BHXif47B7bY0+mxyGeg5NB/uX79eLsNOd4u9CG3V5dYpjOX aeZIeLkHB2RAlEK3Y6WQFfmlww5aE8Rhvt/g2hPua0mSwnQYG2vCxHkjalcMLQgddjrT krxlnA696nra+cCxuUTwBI16RSROhSbhUykYQ6MmYyat65oa5Gr/3ggmOkBNA+yMgdZf O84w== X-Received: by 10.14.111.9 with SMTP id v9mr16749089eeg.35.1377437349415; Sun, 25 Aug 2013 06:29:09 -0700 (PDT) Received: from mavbook.mavhome.dp.ua ([37.229.21.195]) by mx.google.com with ESMTPSA id k7sm14005969eeg.13.1969.12.31.16.00.00 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sun, 25 Aug 2013 06:29:08 -0700 (PDT) Sender: Alexander Motin Message-ID: <521A06A2.7050807@FreeBSD.org> Date: Sun, 25 Aug 2013 16:29:06 +0300 From: Alexander Motin User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:17.0) Gecko/20130616 Thunderbird/17.0.6 MIME-Version: 1.0 To: Adrian Chadd Subject: Re: svn commit: r254846 - projects/camlock/sys/cddl/contrib/opensolaris/uts/common/fs/zfs References: <201308251121.r7PBLA3v033536@svn.freebsd.org> In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: svn-src-projects@freebsd.org, "src-committers@freebsd.org" X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 25 Aug 2013 13:29:12 -0000 On 25.08.2013 15:48, Adrian Chadd wrote: > Surely there's a better way to check whether a thread can sleep besides > digging around in curthread->td_no_sleeping ? What about adding an > accessor macro along side THREAD_SLEEPING_OK and THREAD_NO_SLEEPING ? That sounds good to me. I was also surprised such macros are not there yet when found some code doing these checks just the same way as I did. > I assume that td_no_sleeping won't change during the execution of a > thread? (Eg if it's preempted by anything?) It looks like it's only set > when doing rmlock, timeout or ithread calls, to ensure the thread > doesn't sleep. If that status will change somehow after the check, then it is problem of that specific code, not mine. Preemption should not affect it in any way since it is property of the specific thread. > On 25 August 2013 04:21, Alexander Motin > wrote: > > Author: mav > Date: Sun Aug 25 11:21:10 2013 > New Revision: 254846 > URL: http://svnweb.freebsd.org/changeset/base/254846 > > Log: > Allow GEOM direct dispatch for zvol providers. Skip request > handover to > the worker thread if current context allows sleeping (thanks to > the direct > dispatch in action we are not in GEOM thread). > > Together this doubles zvol performance, reaching up to 300K IOPS > on my tests. > If there would be unmapped I/O support for zvols, the above value > could be > even bigger. > > Modified: > > projects/camlock/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zvol.c > > Modified: > projects/camlock/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zvol.c > ============================================================================== > --- > projects/camlock/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zvol.c > Sun Aug 25 11:21:03 2013 (r254845) > +++ > projects/camlock/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zvol.c > Sun Aug 25 11:21:10 2013 (r254846) > @@ -2068,6 +2068,7 @@ zvol_geom_create(const char *name) > gp->start = zvol_geom_start; > gp->access = zvol_geom_access; > pp = g_new_providerf(gp, "%s/%s", ZVOL_DRIVER, name); > + pp->flags |= G_PF_DIRECT_RECEIVE | G_PF_DIRECT_SEND; > pp->sectorsize = DEV_BSIZE; > > zv = kmem_zalloc(sizeof(*zv), KM_SLEEP); > @@ -2171,18 +2172,20 @@ zvol_geom_start(struct bio *bp) > zvol_state_t *zv; > boolean_t first; > > + zv = bp->bio_to->private; > + ASSERT(zv != NULL); > switch (bp->bio_cmd) { > + case BIO_FLUSH: > + if (curthread->td_no_sleeping != 0) > + goto enqueue; > + zil_commit(zv->zv_zilog, ZVOL_OBJ); > + g_io_deliver(bp, 0); > + break; > case BIO_READ: > case BIO_WRITE: > - case BIO_FLUSH: > - zv = bp->bio_to->private; > - ASSERT(zv != NULL); > - mtx_lock(&zv->zv_queue_mtx); > - first = (bioq_first(&zv->zv_queue) == NULL); > - bioq_insert_tail(&zv->zv_queue, bp); > - mtx_unlock(&zv->zv_queue_mtx); > - if (first) > - wakeup_one(&zv->zv_queue); > + if (curthread->td_no_sleeping != 0) > + goto enqueue; > + zvol_strategy(bp); > break; > case BIO_GETATTR: > case BIO_DELETE: > @@ -2190,6 +2193,15 @@ zvol_geom_start(struct bio *bp) > g_io_deliver(bp, EOPNOTSUPP); > break; > } > + return; > + > +enqueue: > + mtx_lock(&zv->zv_queue_mtx); > + first = (bioq_first(&zv->zv_queue) == NULL); > + bioq_insert_tail(&zv->zv_queue, bp); > + mtx_unlock(&zv->zv_queue_mtx); > + if (first) > + wakeup_one(&zv->zv_queue); > } > > static void > @@ -2364,6 +2376,7 @@ zvol_rename_minor(struct g_geom *gp, con > g_wither_provider(pp, ENXIO); > > pp = g_new_providerf(gp, "%s/%s", ZVOL_DRIVER, newname); > + pp->flags |= G_PF_DIRECT_RECEIVE | G_PF_DIRECT_SEND; > pp->sectorsize = DEV_BSIZE; > pp->mediasize = zv->zv_volsize; > pp->private = zv; > > -- Alexander Motin From owner-svn-src-projects@FreeBSD.ORG Sun Aug 25 17:26:06 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id A636EC03; Sun, 25 Aug 2013 17:26:06 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 927B92867; Sun, 25 Aug 2013 17:26:06 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id r7PHQ67V030997; Sun, 25 Aug 2013 17:26:06 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id r7PHQ6nZ030990; Sun, 25 Aug 2013 17:26:06 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201308251726.r7PHQ6nZ030990@svn.freebsd.org> From: Alexander Motin Date: Sun, 25 Aug 2013 17:26:06 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r254881 - projects/camlock/sys/geom X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 25 Aug 2013 17:26:06 -0000 Author: mav Date: Sun Aug 25 17:26:05 2013 New Revision: 254881 URL: http://svnweb.freebsd.org/changeset/base/254881 Log: Add more conditions when GEOM direct dispatch should not be used: - on down path when BIO is unmapped and we can't sleep (mapping may sleep); - when we are already in one of GEOM threads (direct call won't save much); - when more then half of thread stack size is already used (use the same mechanism as used by netgraph -- GET_STACK_USAGE() macro). Modified: projects/camlock/sys/geom/geom_io.c projects/camlock/sys/geom/geom_kern.c Modified: projects/camlock/sys/geom/geom_io.c ============================================================================== --- projects/camlock/sys/geom/geom_io.c Sun Aug 25 15:38:16 2013 (r254880) +++ projects/camlock/sys/geom/geom_io.c Sun Aug 25 17:26:05 2013 (r254881) @@ -83,6 +83,10 @@ static uma_zone_t biozone; static TAILQ_HEAD(g_classifier_tailq, g_classifier_hook) g_classifier_tailq = TAILQ_HEAD_INITIALIZER(g_classifier_tailq); +extern struct thread *g_up_td; +extern struct thread *g_down_td; +extern struct thread *g_event_td; + #include static void @@ -460,6 +464,7 @@ void g_io_request(struct bio *bp, struct g_consumer *cp) { struct g_provider *pp; + struct thread *td; int direct, error, first; KASSERT(cp != NULL, ("NULL cp in g_io_request")); @@ -515,8 +520,23 @@ g_io_request(struct bio *bp, struct g_co else getbinuptime(&bp->bio_t0); +#ifdef GET_STACK_USAGE + td = curthread; direct = (cp->flags & G_CF_DIRECT_SEND) && - (pp->flags & G_PF_DIRECT_RECEIVE); + (pp->flags & G_PF_DIRECT_RECEIVE) && + ((bp->bio_flags & BIO_UNMAPPED) == 0 || + td->td_no_sleeping == 0) && + td != g_up_td && td != g_down_td && td != g_event_td; + if (direct) { + /* Block direct execution if less then half of stack left. */ + size_t st, su; + GET_STACK_USAGE(st, su); + if (su * 2 > st) + direct = 0; + } +#else + direct = 0; +#endif /* * The statistics collection is lockless, as such, but we @@ -565,6 +585,7 @@ g_io_deliver(struct bio *bp, int error) { struct g_consumer *cp; struct g_provider *pp; + struct thread *td; int direct, first; KASSERT(bp != NULL, ("NULL bp in g_io_deliver")); @@ -611,8 +632,21 @@ g_io_deliver(struct bio *bp, int error) bp->bio_bcount = bp->bio_length; bp->bio_resid = bp->bio_bcount - bp->bio_completed; +#ifdef GET_STACK_USAGE + td = curthread; direct = (pp->flags & G_PF_DIRECT_SEND) && - (cp->flags & G_CF_DIRECT_RECEIVE); + (cp->flags & G_CF_DIRECT_RECEIVE) && + td != g_up_td && td != g_down_td && td != g_event_td; + if (direct) { + /* Block direct execution if less then half of stack left. */ + size_t st, su; + GET_STACK_USAGE(st, su); + if (su * 2 > st) + direct = 0; + } +#else + direct = 0; +#endif /* * The statistics collection is lockless, as such, but we Modified: projects/camlock/sys/geom/geom_kern.c ============================================================================== --- projects/camlock/sys/geom/geom_kern.c Sun Aug 25 15:38:16 2013 (r254880) +++ projects/camlock/sys/geom/geom_kern.c Sun Aug 25 17:26:05 2013 (r254881) @@ -59,9 +59,9 @@ MALLOC_DEFINE(M_GEOM, "GEOM", "Geom data struct sx topology_lock; static struct proc *g_proc; -static struct thread *g_up_td; -static struct thread *g_down_td; -static struct thread *g_event_td; +struct thread *g_up_td; +struct thread *g_down_td; +struct thread *g_event_td; int g_debugflags; int g_collectstats = 1; From owner-svn-src-projects@FreeBSD.ORG Sun Aug 25 22:18:06 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 66B8EE85; Sun, 25 Aug 2013 22:18:06 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 3317725A6; Sun, 25 Aug 2013 22:18:06 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id r7PMI6GM085106; Sun, 25 Aug 2013 22:18:06 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id r7PMI606085105; Sun, 25 Aug 2013 22:18:06 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201308252218.r7PMI606085105@svn.freebsd.org> From: Alexander Motin Date: Sun, 25 Aug 2013 22:18:06 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r254890 - projects/camlock/sys/geom X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 25 Aug 2013 22:18:06 -0000 Author: mav Date: Sun Aug 25 22:18:05 2013 New Revision: 254890 URL: http://svnweb.freebsd.org/changeset/base/254890 Log: Enable GEOM direct dispatch for GEOM VFS class, used for non-ZFS mounts. It is quite hard to measure difference with single device (even SSD), but it does not harm, so why not? Modified: projects/camlock/sys/geom/geom_vfs.c Modified: projects/camlock/sys/geom/geom_vfs.c ============================================================================== --- projects/camlock/sys/geom/geom_vfs.c Sun Aug 25 21:54:41 2013 (r254889) +++ projects/camlock/sys/geom/geom_vfs.c Sun Aug 25 22:18:05 2013 (r254890) @@ -102,14 +102,10 @@ g_vfs_done(struct bio *bip) /* * Collect statistics on synchronous and asynchronous read * and write counts for disks that have associated filesystems. - * Since this run by the g_up thread it is single threaded and - * we do not need to use atomic increments on the counters. */ bp = bip->bio_caller2; vp = bp->b_vp; - if (vp == NULL) { - mp = NULL; - } else { + if (vp != NULL) { /* * If not a disk vnode, use its associated mount point * otherwise use the mountpoint associated with the disk. @@ -122,20 +118,20 @@ g_vfs_done(struct bio *bip) mp = vp->v_mount; else mp = cdevp->si_mountpt; - VI_UNLOCK(vp); - } - if (mp != NULL) { - if (bp->b_iocmd == BIO_WRITE) { - if (LK_HOLDER(bp->b_lock.lk_lock) == LK_KERNPROC) - mp->mnt_stat.f_asyncwrites++; - else - mp->mnt_stat.f_syncwrites++; - } else { - if (LK_HOLDER(bp->b_lock.lk_lock) == LK_KERNPROC) - mp->mnt_stat.f_asyncreads++; - else - mp->mnt_stat.f_syncreads++; + if (mp != NULL) { + if (bp->b_iocmd == BIO_READ) { + if (LK_HOLDER(bp->b_lock.lk_lock) == LK_KERNPROC) + mp->mnt_stat.f_asyncreads++; + else + mp->mnt_stat.f_syncreads++; + } else if (bp->b_iocmd == BIO_WRITE) { + if (LK_HOLDER(bp->b_lock.lk_lock) == LK_KERNPROC) + mp->mnt_stat.f_asyncwrites++; + else + mp->mnt_stat.f_syncwrites++; + } } + VI_UNLOCK(vp); } cp = bip->bio_from; @@ -260,6 +256,7 @@ g_vfs_open(struct vnode *vp, struct g_co vnode_create_vobject(vp, pp->mediasize, curthread); *cpp = cp; cp->private = vp; + cp->flags |= G_CF_DIRECT_SEND | G_CF_DIRECT_RECEIVE; bo->bo_ops = g_vfs_bufops; bo->bo_private = cp; bo->bo_bsize = pp->sectorsize; From owner-svn-src-projects@FreeBSD.ORG Sun Aug 25 23:16:53 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id CCE02660; Sun, 25 Aug 2013 23:16:53 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id BA0C8284C; Sun, 25 Aug 2013 23:16:53 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id r7PNGrWH016719; Sun, 25 Aug 2013 23:16:53 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id r7PNGq3I016711; Sun, 25 Aug 2013 23:16:52 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201308252316.r7PNGq3I016711@svn.freebsd.org> From: Alexander Motin Date: Sun, 25 Aug 2013 23:16:52 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r254891 - in projects/camlock/sys: cam dev/ahci dev/ata dev/mvs dev/siis X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 25 Aug 2013 23:16:54 -0000 Author: mav Date: Sun Aug 25 23:16:52 2013 New Revision: 254891 URL: http://svnweb.freebsd.org/changeset/base/254891 Log: Since command completion no longer needs SIM lock and even requires one to be dropped during processing, move xpt_batch_start()/xpt_batch_done() out of it and assert that. Modified: projects/camlock/sys/cam/cam_xpt.c projects/camlock/sys/dev/ahci/ahci.c projects/camlock/sys/dev/ata/ata-all.c projects/camlock/sys/dev/mvs/mvs.c projects/camlock/sys/dev/siis/siis.c Modified: projects/camlock/sys/cam/cam_xpt.c ============================================================================== --- projects/camlock/sys/cam/cam_xpt.c Sun Aug 25 22:18:05 2013 (r254890) +++ projects/camlock/sys/cam/cam_xpt.c Sun Aug 25 23:16:52 2013 (r254891) @@ -4411,7 +4411,7 @@ xpt_batch_done(struct cam_sim *sim) { struct ccb_hdr *ccb_h; - CAM_SIM_UNLOCK(sim); + mtx_assert(sim->mtx, MA_NOTOWNED); mtx_lock(&sim->sim_doneq_mtx); KASSERT((sim->sim_doneq_flags & CAM_SIM_DQ_BATCH) != 0, ("Batch flag was not set")); @@ -4424,7 +4424,6 @@ xpt_batch_done(struct cam_sim *sim) mtx_lock(&sim->sim_doneq_mtx); } mtx_unlock(&sim->sim_doneq_mtx); - CAM_SIM_LOCK(sim); } union ccb * Modified: projects/camlock/sys/dev/ahci/ahci.c ============================================================================== --- projects/camlock/sys/dev/ahci/ahci.c Sun Aug 25 22:18:05 2013 (r254890) +++ projects/camlock/sys/dev/ahci/ahci.c Sun Aug 25 23:16:52 2013 (r254891) @@ -1469,11 +1469,11 @@ ahci_ch_intr_locked(void *data) device_t dev = (device_t)data; struct ahci_channel *ch = device_get_softc(dev); - mtx_lock(&ch->mtx); xpt_batch_start(ch->sim); + mtx_lock(&ch->mtx); ahci_ch_intr(data); - xpt_batch_done(ch->sim); mtx_unlock(&ch->mtx); + xpt_batch_done(ch->sim); } static void Modified: projects/camlock/sys/dev/ata/ata-all.c ============================================================================== --- projects/camlock/sys/dev/ata/ata-all.c Sun Aug 25 22:18:05 2013 (r254890) +++ projects/camlock/sys/dev/ata/ata-all.c Sun Aug 25 23:16:52 2013 (r254891) @@ -352,11 +352,11 @@ ata_interrupt(void *data) { struct ata_channel *ch = (struct ata_channel *)data; - mtx_lock(&ch->state_mtx); xpt_batch_start(ch->sim); + mtx_lock(&ch->state_mtx); ata_interrupt_locked(data); - xpt_batch_done(ch->sim); mtx_unlock(&ch->state_mtx); + xpt_batch_done(ch->sim); } static void Modified: projects/camlock/sys/dev/mvs/mvs.c ============================================================================== --- projects/camlock/sys/dev/mvs/mvs.c Sun Aug 25 22:18:05 2013 (r254890) +++ projects/camlock/sys/dev/mvs/mvs.c Sun Aug 25 23:16:52 2013 (r254891) @@ -653,11 +653,11 @@ mvs_ch_intr_locked(void *data) device_t dev = (device_t)arg->arg; struct mvs_channel *ch = device_get_softc(dev); - mtx_lock(&ch->mtx); xpt_batch_start(ch->sim); + mtx_lock(&ch->mtx); mvs_ch_intr(data); - xpt_batch_done(ch->sim); mtx_unlock(&ch->mtx); + xpt_batch_done(ch->sim); } static void Modified: projects/camlock/sys/dev/siis/siis.c ============================================================================== --- projects/camlock/sys/dev/siis/siis.c Sun Aug 25 22:18:05 2013 (r254890) +++ projects/camlock/sys/dev/siis/siis.c Sun Aug 25 23:16:52 2013 (r254891) @@ -837,11 +837,11 @@ siis_ch_intr_locked(void *data) device_t dev = (device_t)data; struct siis_channel *ch = device_get_softc(dev); - mtx_lock(&ch->mtx); xpt_batch_start(ch->sim); + mtx_lock(&ch->mtx); siis_ch_intr(data); - xpt_batch_done(ch->sim); mtx_unlock(&ch->mtx); + xpt_batch_done(ch->sim); } static void From owner-svn-src-projects@FreeBSD.ORG Sun Aug 25 23:26:44 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 2030F990; Sun, 25 Aug 2013 23:26:44 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 0DF7428E7; Sun, 25 Aug 2013 23:26:44 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id r7PNQheP021792; Sun, 25 Aug 2013 23:26:43 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id r7PNQhr4021791; Sun, 25 Aug 2013 23:26:43 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201308252326.r7PNQhr4021791@svn.freebsd.org> From: Alexander Motin Date: Sun, 25 Aug 2013 23:26:43 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r254892 - projects/camlock/sys/dev/ahci X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 25 Aug 2013 23:26:44 -0000 Author: mav Date: Sun Aug 25 23:26:43 2013 New Revision: 254892 URL: http://svnweb.freebsd.org/changeset/base/254892 Log: With GEOM direct dispatch support there is finally a good reason to enable multi-vector MSI interrupts. Single interrupt thread may have insufficient performance to handle completion from all ports of the controller. At least on synthetic tests 6 SSDs can outperform it. Modified: projects/camlock/sys/dev/ahci/ahci.c Modified: projects/camlock/sys/dev/ahci/ahci.c ============================================================================== --- projects/camlock/sys/dev/ahci/ahci.c Sun Aug 25 23:16:52 2013 (r254891) +++ projects/camlock/sys/dev/ahci/ahci.c Sun Aug 25 23:26:43 2013 (r254892) @@ -676,7 +676,7 @@ static int ahci_setup_interrupt(device_t dev) { struct ahci_controller *ctlr = device_get_softc(dev); - int i, msi = 1; + int i, msi = 2; /* Process hints. */ if (ctlr->quirks & AHCI_Q_NOMSI) From owner-svn-src-projects@FreeBSD.ORG Mon Aug 26 07:03:09 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 4BAEF856; Mon, 26 Aug 2013 07:03:09 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 20E912D00; Mon, 26 Aug 2013 07:03:09 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id r7Q738ZM066137; Mon, 26 Aug 2013 07:03:08 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id r7Q7381q066136; Mon, 26 Aug 2013 07:03:08 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201308260703.r7Q7381q066136@svn.freebsd.org> From: Alexander Motin Date: Mon, 26 Aug 2013 07:03:08 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r254895 - projects/camlock/sys/geom/zero X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 26 Aug 2013 07:03:09 -0000 Author: mav Date: Mon Aug 26 07:03:08 2013 New Revision: 254895 URL: http://svnweb.freebsd.org/changeset/base/254895 Log: Add unmapped BIO support to GEOM ZERO if kern.geom.zero.clear is cleared. Modified: projects/camlock/sys/geom/zero/g_zero.c Modified: projects/camlock/sys/geom/zero/g_zero.c ============================================================================== --- projects/camlock/sys/geom/zero/g_zero.c Mon Aug 26 06:31:57 2013 (r254894) +++ projects/camlock/sys/geom/zero/g_zero.c Mon Aug 26 07:03:08 2013 (r254895) @@ -41,16 +41,37 @@ __FBSDID("$FreeBSD$"); #define G_ZERO_CLASS_NAME "ZERO" +static int g_zero_clear_sysctl(SYSCTL_HANDLER_ARGS); + SYSCTL_DECL(_kern_geom); static SYSCTL_NODE(_kern_geom, OID_AUTO, zero, CTLFLAG_RW, 0, "GEOM_ZERO stuff"); static int g_zero_clear = 1; -SYSCTL_INT(_kern_geom_zero, OID_AUTO, clear, CTLFLAG_RW, &g_zero_clear, 0, - "Clear read data buffer"); +SYSCTL_PROC(_kern_geom_zero, OID_AUTO, clear, CTLTYPE_INT|CTLFLAG_RW, + &g_zero_clear, 0, g_zero_clear_sysctl, "I", "Clear read data buffer"); static int g_zero_byte = 0; SYSCTL_INT(_kern_geom_zero, OID_AUTO, byte, CTLFLAG_RW, &g_zero_byte, 0, "Byte (octet) value to clear the buffers with"); +static struct g_provider *gpp; + +static int +g_zero_clear_sysctl(SYSCTL_HANDLER_ARGS) +{ + int error; + + error = sysctl_handle_int(oidp, &g_zero_clear, 0, req); + if (error != 0 || req->newptr == NULL) + return (error); + if (gpp == NULL) + return (ENXIO); + if (g_zero_clear) + gpp->flags &= ~G_PF_ACCEPT_UNMAPPED; + else + gpp->flags |= G_PF_ACCEPT_UNMAPPED; + return (0); +} + static void g_zero_start(struct bio *bp) { @@ -58,7 +79,7 @@ g_zero_start(struct bio *bp) switch (bp->bio_cmd) { case BIO_READ: - if (g_zero_clear) + if (g_zero_clear && (bp->bio_flags & BIO_UNMAPPED) == 0) memset(bp->bio_data, g_zero_byte, bp->bio_length); /* FALLTHROUGH */ case BIO_DELETE: @@ -84,7 +105,9 @@ g_zero_init(struct g_class *mp) gp = g_new_geomf(mp, "gzero"); gp->start = g_zero_start; gp->access = g_std_access; - pp = g_new_providerf(gp, "%s", gp->name); + gpp = pp = g_new_providerf(gp, "%s", gp->name); + if (!g_zero_clear) + pp->flags |= G_PF_ACCEPT_UNMAPPED; pp->mediasize = 1152921504606846976LLU; pp->sectorsize = 512; g_error_provider(pp, 0); @@ -104,6 +127,7 @@ g_zero_destroy_geom(struct gctl_req *req return (0); if (pp->acr > 0 || pp->acw > 0 || pp->ace > 0) return (EBUSY); + gpp = NULL; g_wither_geom(gp, ENXIO); return (0); } From owner-svn-src-projects@FreeBSD.ORG Mon Aug 26 07:07:42 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 6A2F2A71; Mon, 26 Aug 2013 07:07:42 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 465022D37; Mon, 26 Aug 2013 07:07:42 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id r7Q77gqf067811; Mon, 26 Aug 2013 07:07:42 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id r7Q77f8c067808; Mon, 26 Aug 2013 07:07:41 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201308260707.r7Q77f8c067808@svn.freebsd.org> From: Alexander Motin Date: Mon, 26 Aug 2013 07:07:41 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r254896 - in projects/camlock/sys/geom: multipath part zero X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 26 Aug 2013 07:07:42 -0000 Author: mav Date: Mon Aug 26 07:07:41 2013 New Revision: 254896 URL: http://svnweb.freebsd.org/changeset/base/254896 Log: Declare GEOM direct dispatch support for PART, ZERO and MULTIPATH classes. First two have nothing to protect, the last is already locked properly. Modified: projects/camlock/sys/geom/multipath/g_multipath.c projects/camlock/sys/geom/part/g_part.c projects/camlock/sys/geom/zero/g_zero.c Modified: projects/camlock/sys/geom/multipath/g_multipath.c ============================================================================== --- projects/camlock/sys/geom/multipath/g_multipath.c Mon Aug 26 07:03:08 2013 (r254895) +++ projects/camlock/sys/geom/multipath/g_multipath.c Mon Aug 26 07:07:41 2013 (r254896) @@ -442,6 +442,7 @@ g_multipath_create(struct g_class *mp, s gp->dumpconf = g_multipath_dumpconf; pp = g_new_providerf(gp, "multipath/%s", md->md_name); + pp->flags |= G_PF_DIRECT_SEND | G_PF_DIRECT_RECEIVE; if (md->md_size != 0) { pp->mediasize = md->md_size - ((md->md_uuid[0] != 0) ? md->md_sectorsize : 0); @@ -479,6 +480,7 @@ g_multipath_add_disk(struct g_geom *gp, } nxtcp = LIST_FIRST(&gp->consumer); cp = g_new_consumer(gp); + cp->flags |= G_CF_DIRECT_SEND | G_CF_DIRECT_RECEIVE; cp->private = NULL; cp->index = MP_NEW; error = g_attach(cp, pp); Modified: projects/camlock/sys/geom/part/g_part.c ============================================================================== --- projects/camlock/sys/geom/part/g_part.c Mon Aug 26 07:03:08 2013 (r254895) +++ projects/camlock/sys/geom/part/g_part.c Mon Aug 26 07:07:41 2013 (r254896) @@ -416,6 +416,7 @@ g_part_new_provider(struct g_geom *gp, s sbuf_finish(sb); entry->gpe_pp = g_new_providerf(gp, "%s", sbuf_data(sb)); sbuf_delete(sb); + entry->gpe_pp->flags |= G_PF_DIRECT_SEND | G_PF_DIRECT_RECEIVE; entry->gpe_pp->private = entry; /* Close the circle. */ } entry->gpe_pp->index = entry->gpe_index - 1; /* index is 1-based. */ @@ -928,6 +929,7 @@ g_part_ctl_create(struct gctl_req *req, LIST_INIT(&table->gpt_entry); if (null == NULL) { cp = g_new_consumer(gp); + cp->flags |= G_CF_DIRECT_SEND | G_CF_DIRECT_RECEIVE; error = g_attach(cp, pp); if (error == 0) error = g_access(cp, 1, 1, 1); @@ -1884,6 +1886,7 @@ g_part_taste(struct g_class *mp, struct */ gp = g_new_geomf(mp, "%s", pp->name); cp = g_new_consumer(gp); + cp->flags |= G_CF_DIRECT_SEND | G_CF_DIRECT_RECEIVE; error = g_attach(cp, pp); if (error == 0) error = g_access(cp, 1, 0, 0); Modified: projects/camlock/sys/geom/zero/g_zero.c ============================================================================== --- projects/camlock/sys/geom/zero/g_zero.c Mon Aug 26 07:03:08 2013 (r254895) +++ projects/camlock/sys/geom/zero/g_zero.c Mon Aug 26 07:07:41 2013 (r254896) @@ -106,6 +106,7 @@ g_zero_init(struct g_class *mp) gp->start = g_zero_start; gp->access = g_std_access; gpp = pp = g_new_providerf(gp, "%s", gp->name); + pp->flags |= G_PF_DIRECT_SEND | G_PF_DIRECT_RECEIVE; if (!g_zero_clear) pp->flags |= G_PF_ACCEPT_UNMAPPED; pp->mediasize = 1152921504606846976LLU; From owner-svn-src-projects@FreeBSD.ORG Mon Aug 26 07:48:52 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 278F5144; Mon, 26 Aug 2013 07:48:52 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 152D32F83; Mon, 26 Aug 2013 07:48:52 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id r7Q7mp5t089881; Mon, 26 Aug 2013 07:48:51 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id r7Q7mots089832; Mon, 26 Aug 2013 07:48:50 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201308260748.r7Q7mots089832@svn.freebsd.org> From: Alexander Motin Date: Mon, 26 Aug 2013 07:48:50 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r254898 - projects/camlock/sys/geom/raid X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 26 Aug 2013 07:48:52 -0000 Author: mav Date: Mon Aug 26 07:48:50 2013 New Revision: 254898 URL: http://svnweb.freebsd.org/changeset/base/254898 Log: Declare partial (receive sides only) direct dispatch support for GEOM RAID. All real work is done in separate thread, so this just allows to switch there easier. System-wide this saves up to 25% of context switches per request. Unfortunately we can't allow direct send there due to the sxlock held during respective calls. Modified: projects/camlock/sys/geom/raid/g_raid.c projects/camlock/sys/geom/raid/md_ddf.c projects/camlock/sys/geom/raid/md_intel.c projects/camlock/sys/geom/raid/md_jmicron.c projects/camlock/sys/geom/raid/md_nvidia.c projects/camlock/sys/geom/raid/md_promise.c projects/camlock/sys/geom/raid/md_sii.c Modified: projects/camlock/sys/geom/raid/g_raid.c ============================================================================== --- projects/camlock/sys/geom/raid/g_raid.c Mon Aug 26 07:17:41 2013 (r254897) +++ projects/camlock/sys/geom/raid/g_raid.c Mon Aug 26 07:48:50 2013 (r254898) @@ -792,6 +792,7 @@ g_raid_open_consumer(struct g_raid_softc if (pp == NULL) return (NULL); cp = g_new_consumer(sc->sc_geom); + cp->flags |= G_CF_DIRECT_RECEIVE; if (g_attach(cp, pp) != 0) { g_destroy_consumer(cp); return (NULL); @@ -1673,6 +1674,7 @@ g_raid_launch_provider(struct g_raid_vol } pp = g_new_providerf(sc->sc_geom, "%s", name); + pp->flags |= G_PF_DIRECT_RECEIVE; pp->private = vol; pp->mediasize = vol->v_mediasize; pp->sectorsize = vol->v_sectorsize; @@ -2247,6 +2249,7 @@ g_raid_taste(struct g_class *mp, struct */ gp->orphan = g_raid_taste_orphan; cp = g_new_consumer(gp); + cp->flags |= G_CF_DIRECT_RECEIVE; g_attach(cp, pp); geom = NULL; Modified: projects/camlock/sys/geom/raid/md_ddf.c ============================================================================== --- projects/camlock/sys/geom/raid/md_ddf.c Mon Aug 26 07:17:41 2013 (r254897) +++ projects/camlock/sys/geom/raid/md_ddf.c Mon Aug 26 07:48:50 2013 (r254898) @@ -2143,6 +2143,7 @@ g_raid_md_taste_ddf(struct g_raid_md_obj } rcp = g_new_consumer(geom); + rcp->flags |= G_CF_DIRECT_RECEIVE; g_attach(rcp, pp); if (g_access(rcp, 1, 1, 1) != 0) ; //goto fail1; Modified: projects/camlock/sys/geom/raid/md_intel.c ============================================================================== --- projects/camlock/sys/geom/raid/md_intel.c Mon Aug 26 07:17:41 2013 (r254897) +++ projects/camlock/sys/geom/raid/md_intel.c Mon Aug 26 07:48:50 2013 (r254898) @@ -1477,6 +1477,7 @@ search: } rcp = g_new_consumer(geom); + rcp->flags |= G_CF_DIRECT_RECEIVE; g_attach(rcp, pp); if (g_access(rcp, 1, 1, 1) != 0) ; //goto fail1; Modified: projects/camlock/sys/geom/raid/md_jmicron.c ============================================================================== --- projects/camlock/sys/geom/raid/md_jmicron.c Mon Aug 26 07:17:41 2013 (r254897) +++ projects/camlock/sys/geom/raid/md_jmicron.c Mon Aug 26 07:48:50 2013 (r254898) @@ -923,6 +923,7 @@ search: } rcp = g_new_consumer(geom); + rcp->flags |= G_CF_DIRECT_RECEIVE; g_attach(rcp, pp); if (g_access(rcp, 1, 1, 1) != 0) ; //goto fail1; Modified: projects/camlock/sys/geom/raid/md_nvidia.c ============================================================================== --- projects/camlock/sys/geom/raid/md_nvidia.c Mon Aug 26 07:17:41 2013 (r254897) +++ projects/camlock/sys/geom/raid/md_nvidia.c Mon Aug 26 07:48:50 2013 (r254898) @@ -919,6 +919,7 @@ search: } rcp = g_new_consumer(geom); + rcp->flags |= G_CF_DIRECT_RECEIVE; g_attach(rcp, pp); if (g_access(rcp, 1, 1, 1) != 0) ; //goto fail1; Modified: projects/camlock/sys/geom/raid/md_promise.c ============================================================================== --- projects/camlock/sys/geom/raid/md_promise.c Mon Aug 26 07:17:41 2013 (r254897) +++ projects/camlock/sys/geom/raid/md_promise.c Mon Aug 26 07:48:50 2013 (r254898) @@ -1176,6 +1176,7 @@ search: } rcp = g_new_consumer(geom); + rcp->flags |= G_CF_DIRECT_RECEIVE; g_attach(rcp, pp); if (g_access(rcp, 1, 1, 1) != 0) ; //goto fail1; Modified: projects/camlock/sys/geom/raid/md_sii.c ============================================================================== --- projects/camlock/sys/geom/raid/md_sii.c Mon Aug 26 07:17:41 2013 (r254897) +++ projects/camlock/sys/geom/raid/md_sii.c Mon Aug 26 07:48:50 2013 (r254898) @@ -1012,6 +1012,7 @@ search: } rcp = g_new_consumer(geom); + rcp->flags |= G_CF_DIRECT_RECEIVE; g_attach(rcp, pp); if (g_access(rcp, 1, 1, 1) != 0) ; //goto fail1; From owner-svn-src-projects@FreeBSD.ORG Mon Aug 26 10:32:37 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id A1D39B4E; Mon, 26 Aug 2013 10:32:37 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 7752322E4; Mon, 26 Aug 2013 10:32:37 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id r7QAWb25080409; Mon, 26 Aug 2013 10:32:37 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id r7QAWbPr080408; Mon, 26 Aug 2013 10:32:37 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201308261032.r7QAWbPr080408@svn.freebsd.org> From: Alexander Motin Date: Mon, 26 Aug 2013 10:32:37 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r254903 - projects/camlock/sys/geom X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 26 Aug 2013 10:32:37 -0000 Author: mav Date: Mon Aug 26 10:32:36 2013 New Revision: 254903 URL: http://svnweb.freebsd.org/changeset/base/254903 Log: Declare GEOM direct dispatch support for geom_slice.c unless hotspots are used. In general case hotspots may cause any of direct dispatch problems. Fortunately they are used very rarely. Modified: projects/camlock/sys/geom/geom_slice.c Modified: projects/camlock/sys/geom/geom_slice.c ============================================================================== --- projects/camlock/sys/geom/geom_slice.c Mon Aug 26 10:27:15 2013 (r254902) +++ projects/camlock/sys/geom/geom_slice.c Mon Aug 26 10:32:36 2013 (r254903) @@ -396,8 +396,10 @@ g_slice_config(struct g_geom *gp, u_int pp->stripeoffset = pp2->stripeoffset + offset; if (pp->stripesize > 0) pp->stripeoffset %= pp->stripesize; - if (gsp->nhotspot == 0) + if (gsp->nhotspot == 0) { pp->flags |= pp2->flags & G_PF_ACCEPT_UNMAPPED; + pp->flags |= G_PF_DIRECT_SEND | G_PF_DIRECT_RECEIVE; + } if (0 && bootverbose) printf("GEOM: Configure %s, start %jd length %jd end %jd\n", pp->name, (intmax_t)offset, (intmax_t)length, @@ -430,16 +432,20 @@ g_slice_conf_hot(struct g_geom *gp, u_in { struct g_slicer *gsp; struct g_slice_hot *gsl, *gsl2; + struct g_consumer *cp; struct g_provider *pp; g_trace(G_T_TOPOLOGY, "g_slice_conf_hot(%s, idx: %d, off: %jd, len: %jd)", gp->name, idx, (intmax_t)offset, (intmax_t)length); g_topology_assert(); gsp = gp->softc; - /* Deny unmapped I/O if hotspots are used. */ + /* Deny unmapped I/O and direct dispatch if hotspots are used. */ if (gsp->nhotspot == 0) { LIST_FOREACH(pp, &gp->provider, provider) - pp->flags &= ~G_PF_ACCEPT_UNMAPPED; + pp->flags &= ~(G_PF_ACCEPT_UNMAPPED | + G_PF_DIRECT_SEND | G_PF_DIRECT_RECEIVE); + LIST_FOREACH(cp, &gp->consumer, consumer) + cp->flags &= ~(G_CF_DIRECT_SEND | G_CF_DIRECT_RECEIVE); } gsl = gsp->hotspot; if(idx >= gsp->nhotspot) { @@ -511,6 +517,7 @@ g_slice_new(struct g_class *mp, u_int sl if (gp->class->destroy_geom == NULL) gp->class->destroy_geom = g_slice_destroy_geom; cp = g_new_consumer(gp); + cp->flags |= G_CF_DIRECT_SEND | G_CF_DIRECT_RECEIVE; error = g_attach(cp, pp); if (error == 0) error = g_access(cp, 1, 0, 0); From owner-svn-src-projects@FreeBSD.ORG Mon Aug 26 10:40:29 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 6A932EEB; Mon, 26 Aug 2013 10:40:29 +0000 (UTC) (envelope-from markm@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 55476233F; Mon, 26 Aug 2013 10:40:29 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id r7QAeTgV083592; Mon, 26 Aug 2013 10:40:29 GMT (envelope-from markm@svn.freebsd.org) Received: (from markm@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id r7QAeQaw083565; Mon, 26 Aug 2013 10:40:26 GMT (envelope-from markm@svn.freebsd.org) Message-Id: <201308261040.r7QAeQaw083565@svn.freebsd.org> From: Mark Murray Date: Mon, 26 Aug 2013 10:40:26 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r254904 - in projects/random_number_generator: bin/sh cddl/lib/libdtrace contrib/llvm/tools/lldb/source contrib/llvm/tools/lldb/source/Plugins/Process/gdb-remote sys/arm/arm sys/arm/con... X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 26 Aug 2013 10:40:29 -0000 Author: markm Date: Mon Aug 26 10:40:25 2013 New Revision: 254904 URL: http://svnweb.freebsd.org/changeset/base/254904 Log: MFC Added: projects/random_number_generator/cddl/lib/libdtrace/ip.d - copied unchanged from r254903, head/cddl/lib/libdtrace/ip.d projects/random_number_generator/cddl/lib/libdtrace/tcp.d - copied unchanged from r254903, head/cddl/lib/libdtrace/tcp.d projects/random_number_generator/cddl/lib/libdtrace/udp.d - copied unchanged from r254903, head/cddl/lib/libdtrace/udp.d projects/random_number_generator/sys/contrib/dev/drm2/ - copied from r254903, head/sys/contrib/dev/drm2/ projects/random_number_generator/sys/dev/drm2/ati_pcigart.c - copied unchanged from r254903, head/sys/dev/drm2/ati_pcigart.c projects/random_number_generator/sys/dev/drm2/drm_fixed.h - copied unchanged from r254903, head/sys/dev/drm2/drm_fixed.h projects/random_number_generator/sys/dev/drm2/drm_os_freebsd.h - copied unchanged from r254903, head/sys/dev/drm2/drm_os_freebsd.h projects/random_number_generator/sys/dev/drm2/radeon/ - copied from r254903, head/sys/dev/drm2/radeon/ projects/random_number_generator/sys/modules/drm2/radeonkms/ - copied from r254903, head/sys/modules/drm2/radeonkms/ projects/random_number_generator/sys/modules/drm2/radeonkmsfw/ - copied from r254903, head/sys/modules/drm2/radeonkmsfw/ projects/random_number_generator/sys/netinet/in_kdtrace.c - copied unchanged from r254903, head/sys/netinet/in_kdtrace.c projects/random_number_generator/sys/netinet/in_kdtrace.h - copied unchanged from r254903, head/sys/netinet/in_kdtrace.h projects/random_number_generator/tools/regression/bin/sh/builtins/alias4.0 - copied unchanged from r254903, head/tools/regression/bin/sh/builtins/alias4.0 projects/random_number_generator/tools/regression/bin/sh/parser/empty-cmd1.0 - copied unchanged from r254903, head/tools/regression/bin/sh/parser/empty-cmd1.0 projects/random_number_generator/tools/regression/file/fcntlflags/ - copied from r254903, head/tools/regression/file/fcntlflags/ projects/random_number_generator/tools/tools/drm/ - copied from r254903, head/tools/tools/drm/ Modified: projects/random_number_generator/bin/sh/alias.c projects/random_number_generator/bin/sh/parser.c projects/random_number_generator/cddl/lib/libdtrace/Makefile projects/random_number_generator/contrib/llvm/tools/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp projects/random_number_generator/contrib/llvm/tools/lldb/source/lldb.cpp projects/random_number_generator/sys/arm/arm/irq_dispatch.S projects/random_number_generator/sys/arm/arm/pmap-v6.c projects/random_number_generator/sys/arm/arm/swtch.S projects/random_number_generator/sys/arm/conf/VERSATILEPB projects/random_number_generator/sys/compat/ndis/kern_ndis.c projects/random_number_generator/sys/compat/ndis/ndis_var.h projects/random_number_generator/sys/conf/files projects/random_number_generator/sys/dev/cas/if_cas.c projects/random_number_generator/sys/dev/drm2/drmP.h projects/random_number_generator/sys/dev/drm2/drm_atomic.h projects/random_number_generator/sys/dev/drm2/drm_gem.c projects/random_number_generator/sys/dev/drm2/drm_ioctl.c projects/random_number_generator/sys/dev/drm2/drm_irq.c projects/random_number_generator/sys/dev/drm2/drm_linux_list.h projects/random_number_generator/sys/dev/drm2/drm_pci.c projects/random_number_generator/sys/dev/drm2/drm_pciids.h projects/random_number_generator/sys/dev/drm2/ttm/ttm_bo.c projects/random_number_generator/sys/dev/drm2/ttm/ttm_bo_driver.h projects/random_number_generator/sys/dev/drm2/ttm/ttm_bo_util.c projects/random_number_generator/sys/dev/drm2/ttm/ttm_bo_vm.c projects/random_number_generator/sys/dev/drm2/ttm/ttm_execbuf_util.c projects/random_number_generator/sys/dev/drm2/ttm/ttm_page_alloc.c projects/random_number_generator/sys/dev/drm2/ttm/ttm_tt.c projects/random_number_generator/sys/dev/hatm/if_hatm_intr.c projects/random_number_generator/sys/dev/hwpmc/hwpmc_core.c projects/random_number_generator/sys/dev/hwpmc/pmc_events.h projects/random_number_generator/sys/dev/if_ndis/if_ndis.c projects/random_number_generator/sys/dev/iscsi_initiator/isc_soc.c projects/random_number_generator/sys/dev/lge/if_lge.c projects/random_number_generator/sys/dev/mwl/if_mwl.c projects/random_number_generator/sys/dev/pci/pcivar.h projects/random_number_generator/sys/dev/pci/vga_pci.c projects/random_number_generator/sys/dev/wb/if_wb.c projects/random_number_generator/sys/kern/subr_mbpool.c projects/random_number_generator/sys/kern/uipc_cow.c projects/random_number_generator/sys/kern/uipc_mbuf.c projects/random_number_generator/sys/kern/uipc_syscalls.c projects/random_number_generator/sys/modules/drm2/Makefile projects/random_number_generator/sys/modules/drm2/drm2/Makefile projects/random_number_generator/sys/net80211/ieee80211_output.c projects/random_number_generator/sys/net80211/ieee80211_proto.h projects/random_number_generator/sys/net80211/ieee80211_superg.c projects/random_number_generator/sys/netinet/ip_fastfwd.c projects/random_number_generator/sys/netinet/ip_input.c projects/random_number_generator/sys/netinet/ip_output.c projects/random_number_generator/sys/netinet/sctp_input.c projects/random_number_generator/sys/netinet/tcp_input.c projects/random_number_generator/sys/netinet/tcp_output.c projects/random_number_generator/sys/netinet/tcp_subr.c projects/random_number_generator/sys/netinet/tcp_syncache.c projects/random_number_generator/sys/netinet/tcp_usrreq.c projects/random_number_generator/sys/netinet/tcp_var.h projects/random_number_generator/sys/netinet/udp_usrreq.c projects/random_number_generator/sys/netinet/udp_var.h projects/random_number_generator/sys/netinet6/ip6_input.c projects/random_number_generator/sys/netinet6/ip6_mroute.c projects/random_number_generator/sys/netinet6/nd6.c projects/random_number_generator/sys/netinet6/sctp6_usrreq.c projects/random_number_generator/sys/netinet6/send.c projects/random_number_generator/sys/netinet6/udp6_usrreq.c projects/random_number_generator/sys/sys/fcntl.h projects/random_number_generator/sys/sys/mbpool.h projects/random_number_generator/sys/sys/mbuf.h projects/random_number_generator/sys/sys/param.h projects/random_number_generator/sys/sys/sf_buf.h projects/random_number_generator/tools/tools/README Directory Properties: projects/random_number_generator/ (props changed) projects/random_number_generator/cddl/ (props changed) projects/random_number_generator/contrib/llvm/ (props changed) projects/random_number_generator/sys/ (props changed) projects/random_number_generator/sys/conf/ (props changed) Modified: projects/random_number_generator/bin/sh/alias.c ============================================================================== --- projects/random_number_generator/bin/sh/alias.c Mon Aug 26 10:32:36 2013 (r254903) +++ projects/random_number_generator/bin/sh/alias.c Mon Aug 26 10:40:25 2013 (r254904) @@ -237,17 +237,19 @@ printaliases(void) } int -aliascmd(int argc, char **argv) +aliascmd(int argc __unused, char **argv __unused) { char *n, *v; int ret = 0; struct alias *ap; - if (argc == 1) { + nextopt(""); + + if (*argptr == NULL) { printaliases(); return (0); } - while ((n = *++argv) != NULL) { + while ((n = *argptr++) != NULL) { if ((v = strchr(n+1, '=')) == NULL) /* n+1: funny ksh stuff */ if ((ap = lookupalias(n, 0)) == NULL) { warning("%s: not found", n); Modified: projects/random_number_generator/bin/sh/parser.c ============================================================================== --- projects/random_number_generator/bin/sh/parser.c Mon Aug 26 10:32:36 2013 (r254903) +++ projects/random_number_generator/bin/sh/parser.c Mon Aug 26 10:40:25 2013 (r254904) @@ -573,7 +573,7 @@ TRACE(("expecting DO got %s %s\n", tokna synexpect(TEND); checkkwd = CHKKWD | CHKALIAS; break; - /* Handle an empty command like other simple commands. */ + /* A simple command must have at least one redirection or word. */ case TBACKGND: case TSEMI: case TAND: @@ -581,16 +581,12 @@ TRACE(("expecting DO got %s %s\n", tokna case TPIPE: case TENDCASE: case TFALLTHRU: - /* - * An empty command before a ; doesn't make much sense, and - * should certainly be disallowed in the case of `if ;'. - */ + case TEOF: + case TNL: + case TRP: if (!redir) synexpect(-1); - case TNL: - case TEOF: case TWORD: - case TRP: tokpushback++; n1 = simplecmd(rpp, redir); return n1; Modified: projects/random_number_generator/cddl/lib/libdtrace/Makefile ============================================================================== --- projects/random_number_generator/cddl/lib/libdtrace/Makefile Mon Aug 26 10:32:36 2013 (r254903) +++ projects/random_number_generator/cddl/lib/libdtrace/Makefile Mon Aug 26 10:40:25 2013 (r254904) @@ -48,8 +48,11 @@ SRCS= dt_aggregate.c \ DSRCS= errno.d \ io.d \ + ip.d \ psinfo.d \ signal.d \ + tcp.d \ + udp.d \ unistd.d WARNS?= 1 Copied: projects/random_number_generator/cddl/lib/libdtrace/ip.d (from r254903, head/cddl/lib/libdtrace/ip.d) ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/random_number_generator/cddl/lib/libdtrace/ip.d Mon Aug 26 10:40:25 2013 (r254904, copy of r254903, head/cddl/lib/libdtrace/ip.d) @@ -0,0 +1,285 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + * + * $FreeBSD$ + */ +/* + * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013 Mark Johnston + */ + +#pragma D depends_on provider ip + +/* + * pktinfo is where packet ID info can be made available for deeper + * analysis if packet IDs become supported by the kernel in the future. + * The pkt_addr member is currently always NULL. + */ +typedef struct pktinfo { + uintptr_t pkt_addr; +} pktinfo_t; + +/* + * csinfo is where connection state info is made available. + */ +typedef uint32_t zoneid_t; +typedef struct csinfo { + uintptr_t cs_addr; + uint64_t cs_cid; + pid_t cs_pid; + zoneid_t cs_zoneid; +} csinfo_t; + +/* + * ipinfo contains common IP info for both IPv4 and IPv6. + */ +typedef struct ipinfo { + uint8_t ip_ver; /* IP version (4, 6) */ + uint32_t ip_plength; /* payload length */ + string ip_saddr; /* source address */ + string ip_daddr; /* destination address */ +} ipinfo_t; + +/* + * ifinfo contains network interface info. + */ +typedef struct ifinfo { + string if_name; /* interface name */ + int8_t if_local; /* is delivered locally */ + /*netstackid_t if_ipstack;*/ /* ipstack ID */ + uintptr_t if_addr; /* pointer to raw ill_t */ +} ifinfo_t; + +typedef uint32_t ipaddr_t; +typedef struct { + uint8_t ipha_version_and_hdr_length; + uint8_t ipha_type_of_service; + uint16_t ipha_length; + uint16_t ipha_ident; + uint16_t ipha_fragment_offset_and_flags; + uint8_t ipha_ttl; + uint8_t ipha_protocol; + uint16_t ipha_hdr_checksum; + ipaddr_t ipha_src; + ipaddr_t ipha_dst; +} ipha_t; + +/* + * ipv4info is a translated version of the IPv4 header (with raw pointer). + * These values are NULL if the packet is not IPv4. + */ +typedef struct ipv4info { + uint8_t ipv4_ver; /* IP version (4) */ + uint8_t ipv4_ihl; /* header length, bytes */ + uint8_t ipv4_tos; /* type of service field */ + uint16_t ipv4_length; /* length (header + payload) */ + uint16_t ipv4_ident; /* identification */ + uint8_t ipv4_flags; /* IP flags */ + uint16_t ipv4_offset; /* fragment offset */ + uint8_t ipv4_ttl; /* time to live */ + uint8_t ipv4_protocol; /* next level protocol */ + string ipv4_protostr; /* next level protocol, as a string */ + uint16_t ipv4_checksum; /* header checksum */ + ipaddr_t ipv4_src; /* source address */ + ipaddr_t ipv4_dst; /* destination address */ + string ipv4_saddr; /* source address, string */ + string ipv4_daddr; /* destination address, string */ + ipha_t *ipv4_hdr; /* pointer to raw header */ +} ipv4info_t; + +/* + * ipv6info is a translated version of the IPv6 header (with raw pointer). + * These values are NULL if the packet is not IPv6. + */ +typedef struct in6_addr in6_addr_t; +typedef struct ip6_hdr ip6_t; +typedef struct ipv6info { + uint8_t ipv6_ver; /* IP version (6) */ + uint8_t ipv6_tclass; /* traffic class */ + uint32_t ipv6_flow; /* flow label */ + uint16_t ipv6_plen; /* payload length */ + uint8_t ipv6_nexthdr; /* next header protocol */ + string ipv6_nextstr; /* next header protocol, as a string */ + uint8_t ipv6_hlim; /* hop limit */ + in6_addr_t *ipv6_src; /* source address */ + in6_addr_t *ipv6_dst; /* destination address */ + string ipv6_saddr; /* source address, string */ + string ipv6_daddr; /* destination address, string */ + ip6_t *ipv6_hdr; /* pointer to raw header */ +} ipv6info_t; + +#pragma D binding "1.0" IPPROTO_IP +inline short IPPROTO_IP = 0; +#pragma D binding "1.0" IPPROTO_ICMP +inline short IPPROTO_ICMP = 1; +#pragma D binding "1.0" IPPROTO_IGMP +inline short IPPROTO_IGMP = 2; +#pragma D binding "1.0" IPPROTO_IPV4 +inline short IPPROTO_IPV4 = 4; +#pragma D binding "1.0" IPPROTO_TCP +inline short IPPROTO_TCP = 6; +#pragma D binding "1.0" IPPROTO_UDP +inline short IPPROTO_UDP = 17; +#pragma D binding "1.0" IPPROTO_IPV6 +inline short IPPROTO_IPV6 = 41; +#pragma D binding "1.0" IPPROTO_ROUTING +inline short IPPROTO_ROUTING = 43; +#pragma D binding "1.0" IPPROTO_FRAGMENT +inline short IPPROTO_FRAGMENT = 44; +#pragma D binding "1.0" IPPROTO_RSVP +inline short IPPROTO_RSVP = 46; +#pragma D binding "1.0" IPPROTO_GRE +inline short IPPROTO_GRE = 47; +#pragma D binding "1.0" IPPROTO_ESP +inline short IPPROTO_ESP = 50; +#pragma D binding "1.0" IPPROTO_AH +inline short IPPROTO_AH = 51; +#pragma D binding "1.0" IPPROTO_MOBILE +inline short IPPROTO_MOBILE = 55; +#pragma D binding "1.0" IPPROTO_ICMPV6 +inline short IPPROTO_ICMPV6 = 58; +#pragma D binding "1.0" IPPROTO_DSTOPTS +inline short IPPROTO_DSTOPTS = 60; +#pragma D binding "1.0" IPPROTO_ETHERIP +inline short IPPROTO_ETHERIP = 97; +#pragma D binding "1.0" IPPROTO_PIM +inline short IPPROTO_PIM = 103; +#pragma D binding "1.0" IPPROTO_IPCOMP +inline short IPPROTO_IPCOMP = 108; +#pragma D binding "1.0" IPPROTO_SCTP +inline short IPPROTO_SCTP = 132; +#pragma D binding "1.0" IPPROTO_RAW +inline short IPPROTO_RAW = 255; + +inline uint8_t INP_IPV4 = 0x01; +inline uint8_t INP_IPV6 = 0x02; + +#pragma D binding "1.0" protocols +inline string protocols[int proto] = + proto == IPPROTO_IP ? "IP" : + proto == IPPROTO_ICMP ? "ICMP" : + proto == IPPROTO_IGMP ? "IGMP" : + proto == IPPROTO_IPV4 ? "IPV4" : + proto == IPPROTO_TCP ? "TCP" : + proto == IPPROTO_UDP ? "UDP" : + proto == IPPROTO_IPV6 ? "IPV6" : + proto == IPPROTO_ROUTING ? "ROUTING" : + proto == IPPROTO_FRAGMENT ? "FRAGMENT" : + proto == IPPROTO_RSVP ? "RSVP" : + proto == IPPROTO_GRE ? "GRE" : + proto == IPPROTO_ESP ? "ESP" : + proto == IPPROTO_AH ? "AH" : + proto == IPPROTO_MOBILE ? "MOBILE" : + proto == IPPROTO_ICMPV6 ? "ICMPV6" : + proto == IPPROTO_DSTOPTS ? "DSTOPTS" : + proto == IPPROTO_ETHERIP ? "ETHERIP" : + proto == IPPROTO_PIM ? "PIM" : + proto == IPPROTO_IPCOMP ? "IPCOMP" : + proto == IPPROTO_SCTP ? "SCTP" : + proto == IPPROTO_RAW ? "RAW" : + ""; + +/* + * This field is always NULL according to the current definition of the ip + * probes. + */ +#pragma D binding "1.0" translator +translator pktinfo_t < void *p > { + pkt_addr = NULL; +}; + +#pragma D binding "1.0" translator +translator csinfo_t < void *p > { + cs_addr = NULL; + cs_cid = (uint64_t)p; + cs_pid = 0; + cs_zoneid = 0; +}; + +#pragma D binding "1.0" translator +translator csinfo_t < struct inpcb *p > { + cs_addr = NULL; + cs_cid = (uint64_t)p; + cs_pid = 0; /* XXX */ + cs_zoneid = 0; +}; + +#pragma D binding "1.0" translator +translator ipinfo_t < uint8_t *p > { + ip_ver = p == NULL ? 0 : ((struct ip *)p)->ip_v; + ip_plength = p == NULL ? 0 : + ((struct ip *)p)->ip_v == 4 ? + ntohs(((struct ip *)p)->ip_len) - (((struct ip *)p)->ip_hl << 2): + ntohs(((struct ip6_hdr *)p)->ip6_ctlun.ip6_un1.ip6_un1_plen); + ip_saddr = p == NULL ? 0 : + ((struct ip *)p)->ip_v == 4 ? + inet_ntoa(&((struct ip *)p)->ip_src.s_addr) : + inet_ntoa6(&((struct ip6_hdr *)p)->ip6_src); + ip_daddr = p == NULL ? 0 : + ((struct ip *)p)->ip_v == 4 ? + inet_ntoa(&((struct ip *)p)->ip_dst.s_addr) : + inet_ntoa6(&((struct ip6_hdr *)p)->ip6_dst); +}; + +#pragma D binding "1.0" IFF_LOOPBACK +inline int IFF_LOOPBACK = 0x8; + +#pragma D binding "1.0" translator +translator ifinfo_t < struct ifnet *p > { + if_name = p->if_xname; + if_local = (p->if_flags & IFF_LOOPBACK) == 0 ? 0 : 1; + if_addr = (uintptr_t)p; +}; + +#pragma D binding "1.0" translator +translator ipv4info_t < struct ip *p > { + ipv4_ver = p == NULL ? 0 : p->ip_v; + ipv4_ihl = p == NULL ? 0 : p->ip_hl; + ipv4_tos = p == NULL ? 0 : p->ip_tos; + ipv4_length = p == NULL ? 0 : ntohs(p->ip_len); + ipv4_ident = p == NULL ? 0 : ntohs(p->ip_id); + ipv4_flags = p == NULL ? 0 : (p->ip_off & 0xe000); + ipv4_offset = p == NULL ? 0 : p->ip_off; + ipv4_ttl = p == NULL ? 0 : p->ip_ttl; + ipv4_protocol = p == NULL ? 0 : p->ip_p; + ipv4_protostr = p == NULL ? "" : protocols[p->ip_p]; + ipv4_checksum = p == NULL ? 0 : ntohs(p->ip_sum); + ipv4_src = p == NULL ? 0 : (ipaddr_t)ntohl(p->ip_src.s_addr); + ipv4_dst = p == NULL ? 0 : (ipaddr_t)ntohl(p->ip_dst.s_addr); + ipv4_saddr = p == NULL ? 0 : inet_ntoa(&p->ip_src.s_addr); + ipv4_daddr = p == NULL ? 0 : inet_ntoa(&p->ip_dst.s_addr); + ipv4_hdr = (ipha_t *)p; +}; + +#pragma D binding "1.0" translator +translator ipv6info_t < struct ip6_hdr *p > { + ipv6_ver = p == NULL ? 0 : (ntohl(p->ip6_ctlun.ip6_un1.ip6_un1_flow) & 0xf0000000) >> 28; + ipv6_tclass = p == NULL ? 0 : (ntohl(p->ip6_ctlun.ip6_un1.ip6_un1_flow) & 0x0ff00000) >> 20; + ipv6_flow = p == NULL ? 0 : ntohl(p->ip6_ctlun.ip6_un1.ip6_un1_flow) & 0x000fffff; + ipv6_plen = p == NULL ? 0 : ntohs(p->ip6_ctlun.ip6_un1.ip6_un1_plen); + ipv6_nexthdr = p == NULL ? 0 : p->ip6_ctlun.ip6_un1.ip6_un1_nxt; + ipv6_nextstr = p == NULL ? "" : protocols[p->ip6_ctlun.ip6_un1.ip6_un1_nxt]; + ipv6_hlim = p == NULL ? 0 : p->ip6_ctlun.ip6_un1.ip6_un1_hlim; + ipv6_src = p == NULL ? 0 : (in6_addr_t *)&p->ip6_src; + ipv6_dst = p == NULL ? 0 : (in6_addr_t *)&p->ip6_dst; + ipv6_saddr = p == NULL ? 0 : inet_ntoa6(&p->ip6_src); + ipv6_daddr = p == NULL ? 0 : inet_ntoa6(&p->ip6_dst); + ipv6_hdr = (ip6_t *)p; +}; Copied: projects/random_number_generator/cddl/lib/libdtrace/tcp.d (from r254903, head/cddl/lib/libdtrace/tcp.d) ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/random_number_generator/cddl/lib/libdtrace/tcp.d Mon Aug 26 10:40:25 2013 (r254904, copy of r254903, head/cddl/lib/libdtrace/tcp.d) @@ -0,0 +1,203 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + * + * $FreeBSD$ + */ +/* + * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013 Mark Johnston + */ + +#pragma D depends_on library ip.d +#pragma D depends_on provider tcp + +/* + * Convert a TCP state value to a string. + */ +#pragma D binding "1.0" TCPS_CLOSED +inline int TCPS_CLOSED = 0; +#pragma D binding "1.0" TCPS_LISTEN +inline int TCPS_LISTEN = 1; +#pragma D binding "1.0" TCPS_SYN_SENT +inline int TCPS_SYN_SENT = 2; +#pragma D binding "1.0" TCPS_SYN_RECEIVED +inline int TCPS_SYN_RECEIVED = 3; +#pragma D binding "1.0" TCPS_ESTABLISHED +inline int TCPS_ESTABLISHED = 4; +#pragma D binding "1.0" TCPS_CLOSE_WAIT +inline int TCPS_CLOSE_WAIT = 5; +#pragma D binding "1.0" TCPS_FIN_WAIT_1 +inline int TCPS_FIN_WAIT_1 = 6; +#pragma D binding "1.0" TCPS_CLOSING +inline int TCPS_CLOSING = 7; +#pragma D binding "1.0" TCPS_LAST_ACK +inline int TCPS_LAST_ACK = 8; +#pragma D binding "1.0" TCPS_FIN_WAIT_2 +inline int TCPS_FIN_WAIT_2 = 9; +#pragma D binding "1.0" TCPS_TIME_WAIT +inline int TCPS_TIME_WAIT = 10; + +/* TCP segment flags. */ +#pragma D binding "1.0" TH_FIN +inline uint8_t TH_FIN = 0x01; +#pragma D binding "1.0" TH_SYN +inline uint8_t TH_SYN = 0x02; +#pragma D binding "1.0" TH_RST +inline uint8_t TH_RST = 0x04; +#pragma D binding "1.0" TH_PUSH +inline uint8_t TH_PUSH = 0x08; +#pragma D binding "1.0" TH_ACK +inline uint8_t TH_ACK = 0x10; +#pragma D binding "1.0" TH_URG +inline uint8_t TH_URG = 0x20; +#pragma D binding "1.0" TH_ECE +inline uint8_t TH_ECE = 0x40; +#pragma D binding "1.0" TH_CWR +inline uint8_t TH_CWR = 0x80; + +/* TCP connection state strings. */ +#pragma D binding "1.0" tcp_state_string +inline string tcp_state_string[int32_t state] = + state == TCPS_CLOSED ? "state-closed" : + state == TCPS_LISTEN ? "state-listen" : + state == TCPS_SYN_SENT ? "state-syn-sent" : + state == TCPS_SYN_RECEIVED ? "state-syn-received" : + state == TCPS_ESTABLISHED ? "state-established" : + state == TCPS_CLOSE_WAIT ? "state-close-wait" : + state == TCPS_FIN_WAIT_1 ? "state-fin-wait-1" : + state == TCPS_CLOSING ? "state-closing" : + state == TCPS_LAST_ACK ? "state-last-ack" : + state == TCPS_FIN_WAIT_2 ? "state-fin-wait-2" : + state == TCPS_TIME_WAIT ? "state-time-wait" : + ""; + +/* + * tcpsinfo contains stable TCP details from tcp_t. + */ +typedef struct tcpsinfo { + uintptr_t tcps_addr; + int tcps_local; /* is delivered locally, boolean */ + int tcps_active; /* active open (from here), boolean */ + uint16_t tcps_lport; /* local port */ + uint16_t tcps_rport; /* remote port */ + string tcps_laddr; /* local address, as a string */ + string tcps_raddr; /* remote address, as a string */ + int32_t tcps_state; /* TCP state */ + uint32_t tcps_iss; /* Initial sequence # sent */ + uint32_t tcps_suna; /* sequence # sent but unacked */ + uint32_t tcps_snxt; /* next sequence # to send */ + uint32_t tcps_rack; /* sequence # we have acked */ + uint32_t tcps_rnxt; /* next sequence # expected */ + uint32_t tcps_swnd; /* send window size */ + int32_t tcps_snd_ws; /* send window scaling */ + uint32_t tcps_rwnd; /* receive window size */ + int32_t tcps_rcv_ws; /* receive window scaling */ + uint32_t tcps_cwnd; /* congestion window */ + uint32_t tcps_cwnd_ssthresh; /* threshold for congestion avoidance */ + uint32_t tcps_sack_fack; /* SACK sequence # we have acked */ + uint32_t tcps_sack_snxt; /* next SACK seq # for retransmission */ + uint32_t tcps_rto; /* round-trip timeout, msec */ + uint32_t tcps_mss; /* max segment size */ + int tcps_retransmit; /* retransmit send event, boolean */ +} tcpsinfo_t; + +/* + * tcplsinfo provides the old tcp state for state changes. + */ +typedef struct tcplsinfo { + int32_t tcps_state; /* previous TCP state */ +} tcplsinfo_t; + +/* + * tcpinfo is the TCP header fields. + */ +typedef struct tcpinfo { + uint16_t tcp_sport; /* source port */ + uint16_t tcp_dport; /* destination port */ + uint32_t tcp_seq; /* sequence number */ + uint32_t tcp_ack; /* acknowledgment number */ + uint8_t tcp_offset; /* data offset, in bytes */ + uint8_t tcp_flags; /* flags */ + uint16_t tcp_window; /* window size */ + uint16_t tcp_checksum; /* checksum */ + uint16_t tcp_urgent; /* urgent data pointer */ + struct tcphdr *tcp_hdr; /* raw TCP header */ +} tcpinfo_t; + +#pragma D binding "1.0" translator +translator csinfo_t < struct tcpcb *p > { + cs_addr = NULL; + cs_cid = (uint64_t)p; + cs_pid = 0; + cs_zoneid = 0; +}; + +#pragma D binding "1.0" translator +translator tcpsinfo_t < struct tcpcb *p > { + tcps_addr = (uintptr_t)p; + tcps_local = -1; /* XXX */ + tcps_active = -1; /* XXX */ + tcps_lport = p == NULL ? 0 : ntohs(p->t_inpcb->inp_inc.inc_ie.ie_lport); + tcps_rport = p == NULL ? 0 : ntohs(p->t_inpcb->inp_inc.inc_ie.ie_fport); + tcps_laddr = p == NULL ? 0 : + p->t_inpcb->inp_vflag == INP_IPV4 ? + inet_ntoa(&p->t_inpcb->inp_inc.inc_ie.ie_dependladdr.ie46_local.ia46_addr4.s_addr) : + inet_ntoa6(&p->t_inpcb->inp_inc.inc_ie.ie_dependladdr.ie6_local); + tcps_raddr = p == NULL ? 0 : + p->t_inpcb->inp_vflag == INP_IPV4 ? + inet_ntoa(&p->t_inpcb->inp_inc.inc_ie.ie_dependfaddr.ie46_foreign.ia46_addr4.s_addr) : + inet_ntoa6(&p->t_inpcb->inp_inc.inc_ie.ie_dependfaddr.ie6_foreign); + tcps_state = p == NULL ? -1 : p->t_state; + tcps_iss = p == NULL ? 0 : p->iss; + tcps_suna = p == NULL ? 0 : p->snd_una; + tcps_snxt = p == NULL ? 0 : p->snd_nxt; + tcps_rack = p == NULL ? 0 : p->last_ack_sent; + tcps_rnxt = p == NULL ? 0 : p->rcv_nxt; + tcps_swnd = p == NULL ? -1 : p->snd_wnd; + tcps_snd_ws = p == NULL ? -1 : p->snd_scale; + tcps_rwnd = p == NULL ? -1 : p->rcv_wnd; + tcps_rcv_ws = p == NULL ? -1 : p->rcv_scale; + tcps_cwnd = p == NULL ? -1 : p->snd_cwnd; + tcps_cwnd_ssthresh = p == NULL ? -1 : p->snd_ssthresh; + tcps_sack_fack = p == NULL ? 0 : p->snd_fack; + tcps_sack_snxt = p == NULL ? 0 : p->sack_newdata; + tcps_rto = p == NULL ? -1 : p->t_rxtcur / 1000; /* XXX */ + tcps_mss = p == NULL ? -1 : p->t_maxseg; + tcps_retransmit = -1; /* XXX */ +}; + +#pragma D binding "1.0" translator +translator tcpinfo_t < struct tcphdr *p > { + tcp_sport = p == NULL ? 0 : ntohs(p->th_sport); + tcp_dport = p == NULL ? 0 : ntohs(p->th_dport); + tcp_seq = p == NULL ? -1 : ntohl(p->th_seq); + tcp_ack = p == NULL ? -1 : ntohl(p->th_ack); + tcp_offset = p == NULL ? -1 : (p->th_off >> 2); + tcp_flags = p == NULL ? 0 : p->th_flags; + tcp_window = p == NULL ? 0 : ntohs(p->th_win); + tcp_checksum = p == NULL ? 0 : ntohs(p->th_sum); + tcp_urgent = p == NULL ? 0 : ntohs(p->th_urp); + tcp_hdr = (struct tcphdr *)p; +}; + +#pragma D binding "1.0" translator +translator tcplsinfo_t < int s > { + tcps_state = s; +}; Copied: projects/random_number_generator/cddl/lib/libdtrace/udp.d (from r254903, head/cddl/lib/libdtrace/udp.d) ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/random_number_generator/cddl/lib/libdtrace/udp.d Mon Aug 26 10:40:25 2013 (r254904, copy of r254903, head/cddl/lib/libdtrace/udp.d) @@ -0,0 +1,75 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + * + * $FreeBSD$ + */ +/* + * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013 Mark Johnston + */ + +#pragma D depends_on library ip.d +#pragma D depends_on provider udp + +/* + * udpsinfo contains stable UDP details. + */ +typedef struct udpsinfo { + uintptr_t udps_addr; + uint16_t udps_lport; /* local port */ + uint16_t udps_rport; /* remote port */ + string udps_laddr; /* local address, as a string */ + string udps_raddr; /* remote address, as a string */ +} udpsinfo_t; + +/* + * udpinfo is the UDP header fields. + */ +typedef struct udpinfo { + uint16_t udp_sport; /* source port */ + uint16_t udp_dport; /* destination port */ + uint16_t udp_length; /* total length */ + uint16_t udp_checksum; /* headers + data checksum */ + struct udphdr *udp_hdr; /* raw UDP header */ +} udpinfo_t; + +#pragma D binding "1.0" translator +translator udpsinfo_t < struct inpcb *p > { + udps_addr = (uintptr_t)p; + udps_lport = p == NULL ? 0 : ntohs(p->inp_inc.inc_ie.ie_lport); + udps_rport = p == NULL ? 0 : ntohs(p->inp_inc.inc_ie.ie_fport); + udps_laddr = p == NULL ? "" : + p->inp_vflag == INP_IPV4 ? + inet_ntoa(&p->inp_inc.inc_ie.ie_dependladdr.ie46_local.ia46_addr4.s_addr) : + inet_ntoa6(&p->inp_inc.inc_ie.ie_dependladdr.ie6_local); + udps_raddr = p == NULL ? "" : + p->inp_vflag == INP_IPV4 ? + inet_ntoa(&p->inp_inc.inc_ie.ie_dependfaddr.ie46_foreign.ia46_addr4.s_addr) : + inet_ntoa6(&p->inp_inc.inc_ie.ie_dependfaddr.ie6_foreign); +}; + +#pragma D binding "1.0" translator +translator udpinfo_t < struct udphdr *p > { + udp_sport = p == NULL ? 0 : ntohs(p->uh_sport); + udp_dport = p == NULL ? 0 : ntohs(p->uh_dport); + udp_length = p == NULL ? 0 : ntohs(p->uh_ulen); + udp_checksum = p == NULL ? 0 : ntohs(p->uh_sum); + udp_hdr = p; +}; Modified: projects/random_number_generator/contrib/llvm/tools/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp ============================================================================== --- projects/random_number_generator/contrib/llvm/tools/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp Mon Aug 26 10:32:36 2013 (r254903) +++ projects/random_number_generator/contrib/llvm/tools/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp Mon Aug 26 10:40:25 2013 (r254904) @@ -57,7 +57,6 @@ #include "lldb/Host/Host.h" #include "Plugins/Process/Utility/InferiorCallPOSIX.h" #include "Plugins/Process/Utility/StopInfoMachException.h" -#include "Plugins/Platform/MacOSX/PlatformRemoteiOS.h" #include "Utility/StringExtractorGDBRemote.h" #include "GDBRemoteRegisterContext.h" #include "ProcessGDBRemote.h" @@ -1809,6 +1808,7 @@ ProcessGDBRemote::DoDestroy () if (log) log->Printf ("ProcessGDBRemote::DoDestroy()"); +#if 0 // XXX Currently no iOS target support on FreeBSD // There is a bug in older iOS debugservers where they don't shut down the process // they are debugging properly. If the process is sitting at a breakpoint or an exception, // this can cause problems with restarting. So we check to see if any of our threads are stopped @@ -1912,6 +1912,7 @@ ProcessGDBRemote::DoDestroy () } } } +#endif // Interrupt if our inferior is running... int exit_status = SIGABRT; Modified: projects/random_number_generator/contrib/llvm/tools/lldb/source/lldb.cpp ============================================================================== --- projects/random_number_generator/contrib/llvm/tools/lldb/source/lldb.cpp Mon Aug 26 10:32:36 2013 (r254903) +++ projects/random_number_generator/contrib/llvm/tools/lldb/source/lldb.cpp Mon Aug 26 10:40:25 2013 (r254904) @@ -29,7 +29,6 @@ #include "Plugins/ABI/SysV-x86_64/ABISysV_x86_64.h" #include "Plugins/Disassembler/llvm/DisassemblerLLVMC.h" #include "Plugins/Instruction/ARM/EmulateInstructionARM.h" -#include "Plugins/SymbolVendor/MacOSX/SymbolVendorMacOSX.h" #include "Plugins/SymbolVendor/ELF/SymbolVendorELF.h" #include "Plugins/ObjectContainer/BSD-Archive/ObjectContainerBSDArchive.h" #include "Plugins/ObjectFile/ELF/ObjectFileELF.h" @@ -38,10 +37,8 @@ #include "Plugins/SymbolFile/Symtab/SymbolFileSymtab.h" #include "Plugins/UnwindAssembly/x86/UnwindAssembly-x86.h" #include "Plugins/UnwindAssembly/InstEmulation/UnwindAssemblyInstEmulation.h" -#include "Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.h" #include "Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.h" #include "Plugins/Platform/FreeBSD/PlatformFreeBSD.h" -#include "Plugins/Platform/Linux/PlatformLinux.h" #include "Plugins/LanguageRuntime/CPlusPlus/ItaniumABI/ItaniumABILanguageRuntime.h" #ifndef LLDB_DISABLE_PYTHON #include "Plugins/OperatingSystem/Python/OperatingSystemPython.h" @@ -60,8 +57,6 @@ #include "Plugins/Platform/MacOSX/PlatformiOSSimulator.h" #endif -#include "Plugins/Process/mach-core/ProcessMachCore.h" - #if defined(__linux__) or defined(__FreeBSD__) #include "Plugins/Process/elf-core/ProcessElfCore.h" #endif @@ -109,10 +104,8 @@ lldb_private::Initialize () UnwindAssemblyInstEmulation::Initialize(); UnwindAssembly_x86::Initialize(); EmulateInstructionARM::Initialize (); - ObjectFilePECOFF::Initialize (); DynamicLoaderPOSIXDYLD::Initialize (); PlatformFreeBSD::Initialize(); - PlatformLinux::Initialize(); SymbolFileDWARFDebugMap::Initialize(); ItaniumABILanguageRuntime::Initialize(); #ifndef LLDB_DISABLE_PYTHON @@ -130,8 +123,6 @@ lldb_private::Initialize () ObjectContainerUniversalMachO::Initialize(); ObjectFileMachO::Initialize(); ProcessKDP::Initialize(); - ProcessMachCore::Initialize(); - SymbolVendorMacOSX::Initialize(); PlatformDarwinKernel::Initialize(); PlatformRemoteiOS::Initialize(); PlatformMacOSX::Initialize(); @@ -193,10 +184,8 @@ lldb_private::Terminate () UnwindAssembly_x86::Terminate(); UnwindAssemblyInstEmulation::Terminate(); EmulateInstructionARM::Terminate (); - ObjectFilePECOFF::Terminate (); DynamicLoaderPOSIXDYLD::Terminate (); PlatformFreeBSD::Terminate(); - PlatformLinux::Terminate(); SymbolFileDWARFDebugMap::Terminate(); ItaniumABILanguageRuntime::Terminate(); #ifndef LLDB_DISABLE_PYTHON @@ -210,9 +199,7 @@ lldb_private::Terminate () AppleObjCRuntimeV1::Terminate(); ObjectContainerUniversalMachO::Terminate(); ObjectFileMachO::Terminate(); - ProcessMachCore::Terminate(); ProcessKDP::Terminate(); - SymbolVendorMacOSX::Terminate(); PlatformMacOSX::Terminate(); PlatformDarwinKernel::Terminate(); PlatformRemoteiOS::Terminate(); Modified: projects/random_number_generator/sys/arm/arm/irq_dispatch.S ============================================================================== --- projects/random_number_generator/sys/arm/arm/irq_dispatch.S Mon Aug 26 10:32:36 2013 (r254903) +++ projects/random_number_generator/sys/arm/arm/irq_dispatch.S Mon Aug 26 10:40:25 2013 (r254904) @@ -89,6 +89,7 @@ AST_LOCALS ASENTRY_NP(irq_entry) sub lr, lr, #0x00000004 /* Adjust the lr */ PUSHFRAMEINSVC /* Push an interrupt frame */ + UNWINDSVCFRAME mov r0, sp /* arg for dispatcher */ mov r1, #0 Modified: projects/random_number_generator/sys/arm/arm/pmap-v6.c ============================================================================== --- projects/random_number_generator/sys/arm/arm/pmap-v6.c Mon Aug 26 10:32:36 2013 (r254903) +++ projects/random_number_generator/sys/arm/arm/pmap-v6.c Mon Aug 26 10:40:25 2013 (r254904) @@ -2944,126 +2944,6 @@ void pmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vm_offset_t dst_addr, vm_size_t len, vm_offset_t src_addr) { - struct l2_bucket *l2b_src, *l2b_dst; - struct pv_entry *pve; - vm_offset_t addr; - vm_offset_t end_addr; - vm_offset_t next_bucket; - u_int flags; - boolean_t l2b_alloc; - - CTR4(KTR_PMAP, "%s: VA = 0x%08x, len = 0x%08x. Will %s\n", __func__, - src_addr, len, (dst_addr != src_addr) ? "exit" : "copy"); - - if (dst_addr != src_addr) - return; - - rw_wlock(&pvh_global_lock); - if (dst_pmap < src_pmap) { - PMAP_LOCK(dst_pmap); - PMAP_LOCK(src_pmap); - } else { - PMAP_LOCK(src_pmap); - PMAP_LOCK(dst_pmap); - } - - end_addr = src_addr + len; - addr = src_addr; - /* - * Iterate through all used l2_buckets in a given range. - */ - while (addr < end_addr) { - pt_entry_t *src_ptep, *dst_ptep; - pt_entry_t src_pte; - - next_bucket = L2_NEXT_BUCKET(addr); - /* - * If the next bucket VA is out of the - * copy range then set it to end_addr in order - * to copy all mappings until the given limit. - */ - if (next_bucket > end_addr) - next_bucket = end_addr; - - l2b_src = pmap_get_l2_bucket(src_pmap, addr); - if (l2b_src == NULL) { - addr = next_bucket; - continue; - } - src_ptep = &l2b_src->l2b_kva[l2pte_index(addr)]; - - while (addr < next_bucket) { - vm_page_t srcmpte; - - src_pte = *src_ptep; - srcmpte = PHYS_TO_VM_PAGE(l2pte_pa(src_pte)); - /* - * We only virtual copy managed pages - */ - if (srcmpte && (srcmpte->oflags & VPO_UNMANAGED) == 0) { - l2b_alloc = FALSE; - l2b_dst = pmap_get_l2_bucket(dst_pmap, addr); - /* - * Check if the allocation of another - * l2_bucket is necessary. - */ - if (l2b_dst == NULL) { - l2b_dst = pmap_alloc_l2_bucket(dst_pmap, - addr); - l2b_alloc = TRUE; - } - if (l2b_dst == NULL) - goto out; - - dst_ptep = &l2b_dst->l2b_kva[l2pte_index(addr)]; - - if (*dst_ptep == 0 && - (pve = pmap_get_pv_entry(dst_pmap, TRUE))) { - /* - * Check whether the source mapping is - * writable and set the proper flag - * for a copied mapping so that right - * permissions could be set on the - * access fault. - */ - flags = 0; - if ((src_pte & L2_APX) == 0) - flags = PVF_WRITE; - pmap_enter_pv(srcmpte, pve, dst_pmap, - addr, flags); - /* - * Clear the modified and - * accessed (referenced) flags - * and don't set the wired flag - * during the copy. - */ - *dst_ptep = src_pte; - *dst_ptep &= ~L2_S_REF; - *dst_ptep |= L2_APX; - /* - * Update stats - */ - l2b_dst->l2b_occupancy++; - dst_pmap->pm_stats.resident_count++; - } else { - /* - * If the l2_bucket was acquired as - * a result of allocation then free it. - */ - if (l2b_alloc) - pmap_free_l2_bucket(dst_pmap, - l2b_dst, 1); - goto out; - } - } - addr += PAGE_SIZE; - src_ptep++; - } - } -out: - rw_wunlock(&pvh_global_lock); - PMAP_UNLOCK(src_pmap); - PMAP_UNLOCK(dst_pmap); } Modified: projects/random_number_generator/sys/arm/arm/swtch.S ============================================================================== --- projects/random_number_generator/sys/arm/arm/swtch.S Mon Aug 26 10:32:36 2013 (r254903) +++ projects/random_number_generator/sys/arm/arm/swtch.S Mon Aug 26 10:40:25 2013 (r254904) @@ -218,6 +218,11 @@ END(cpu_throw) ENTRY(cpu_switch) stmfd sp!, {r4-r7, lr} sub sp, sp, #4; +#ifdef __ARM_EABI__ + .save {r4-r7, lr} + .pad #4 +#endif + mov r6, r2 /* Save the mutex */ .Lswitch_resume: Modified: projects/random_number_generator/sys/arm/conf/VERSATILEPB ============================================================================== --- projects/random_number_generator/sys/arm/conf/VERSATILEPB Mon Aug 26 10:32:36 2013 (r254903) +++ projects/random_number_generator/sys/arm/conf/VERSATILEPB Mon Aug 26 10:40:25 2013 (r254904) @@ -53,7 +53,7 @@ options SYSVMSG #SYSV-style message q options SYSVSEM #SYSV-style semaphores options _KPOSIX_PRIORITY_SCHEDULING #Posix P1003_1B real-time extensions options KBD_INSTALL_CDEV # install a CDEV entry in /dev -options ROOTDEVNAME=\"ufs:da0s2a\" +options ROOTDEVNAME=\"ufs:da0s1a\" options VFP # vfp/neon options PREEMPTION Modified: projects/random_number_generator/sys/compat/ndis/kern_ndis.c ============================================================================== --- projects/random_number_generator/sys/compat/ndis/kern_ndis.c Mon Aug 26 10:32:36 2013 (r254903) +++ projects/random_number_generator/sys/compat/ndis/kern_ndis.c Mon Aug 26 10:40:25 2013 (r254904) @@ -482,16 +482,14 @@ ndis_return(dobj, arg) KeReleaseSpinLock(&block->nmb_returnlock, irql); } -void -ndis_return_packet(buf, arg) - void *buf; /* not used */ - void *arg; +int +ndis_return_packet(struct mbuf *m, void *buf, void *arg) { ndis_packet *p; ndis_miniport_block *block; if (arg == NULL) - return; + return (EXT_FREE_OK); p = arg; @@ -500,7 +498,7 @@ ndis_return_packet(buf, arg) /* Release packet when refcount hits zero, otherwise return. */ if (p->np_refcnt) - return; + return (EXT_FREE_OK); block = ((struct ndis_softc *)p->np_softc)->ndis_block; @@ -512,6 +510,8 @@ ndis_return_packet(buf, arg) IoQueueWorkItem(block->nmb_returnitem, (io_workitem_func)kernndis_functbl[7].ipt_wrap, WORKQUEUE_CRITICAL, block); + + return (EXT_FREE_OK); } void Modified: projects/random_number_generator/sys/compat/ndis/ndis_var.h ============================================================================== --- projects/random_number_generator/sys/compat/ndis/ndis_var.h Mon Aug 26 10:32:36 2013 (r254903) +++ projects/random_number_generator/sys/compat/ndis/ndis_var.h Mon Aug 26 10:40:25 2013 (r254904) @@ -1743,7 +1743,7 @@ extern int ndis_halt_nic(void *); extern int ndis_shutdown_nic(void *); extern int ndis_pnpevent_nic(void *, int); extern int ndis_init_nic(void *); -extern void ndis_return_packet(void *, void *); +extern int ndis_return_packet(struct mbuf *, void *, void *); extern int ndis_init_dma(void *); extern int ndis_destroy_dma(void *); extern int ndis_create_sysctls(void *); Modified: projects/random_number_generator/sys/conf/files ============================================================================== --- projects/random_number_generator/sys/conf/files Mon Aug 26 10:32:36 2013 (r254903) +++ projects/random_number_generator/sys/conf/files Mon Aug 26 10:40:25 2013 (r254904) @@ -3228,6 +3228,7 @@ netinet/if_ether.c optional inet ether netinet/igmp.c optional inet netinet/in.c optional inet netinet/in_debug.c optional inet ddb +netinet/in_kdtrace.c optional inet | inet6 netinet/ip_carp.c optional inet carp | inet6 carp netinet/in_gif.c optional gif inet | netgraph_gif inet netinet/ip_gre.c optional gre inet Modified: projects/random_number_generator/sys/dev/cas/if_cas.c ============================================================================== --- projects/random_number_generator/sys/dev/cas/if_cas.c Mon Aug 26 10:32:36 2013 (r254903) +++ projects/random_number_generator/sys/dev/cas/if_cas.c Mon Aug 26 10:40:25 2013 (r254904) @@ -132,7 +132,7 @@ static void cas_detach(struct cas_softc static int cas_disable_rx(struct cas_softc *sc); static int cas_disable_tx(struct cas_softc *sc); static void cas_eint(struct cas_softc *sc, u_int status); -static void cas_free(struct mbuf *m, void *arg1, void* arg2); +static int cas_free(struct mbuf *m, void *arg1, void* arg2); static void cas_init(void *xsc); static void cas_init_locked(struct cas_softc *sc); static void cas_init_regs(struct cas_softc *sc); @@ -1887,7 +1887,7 @@ cas_rint(struct cas_softc *sc) #endif } -static void +static int cas_free(struct mbuf *m, void *arg1, void *arg2) { struct cas_rxdsoft *rxds; @@ -1904,7 +1904,7 @@ cas_free(struct mbuf *m, void *arg1, voi rxds = &sc->sc_rxdsoft[idx]; #endif if (refcount_release(&rxds->rxds_refcount) == 0) - return; + return (EXT_FREE_OK); /* * NB: this function can be called via m_freem(9) within @@ -1915,6 +1915,7 @@ cas_free(struct mbuf *m, void *arg1, voi cas_add_rxdesc(sc, idx); if (locked == 0) CAS_UNLOCK(sc); + return (EXT_FREE_OK); } *** DIFF OUTPUT TRUNCATED AT 1000 LINES *** From owner-svn-src-projects@FreeBSD.ORG Mon Aug 26 12:04:24 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id E43F9200; Mon, 26 Aug 2013 12:04:23 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id D1F052E22; Mon, 26 Aug 2013 12:04:23 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id r7QC4N5K030110; Mon, 26 Aug 2013 12:04:23 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id r7QC4NpR030103; Mon, 26 Aug 2013 12:04:23 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201308261204.r7QC4NpR030103@svn.freebsd.org> From: Alexander Motin Date: Mon, 26 Aug 2013 12:04:23 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r254905 - in projects/camlock/sys: geom kern sys X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 26 Aug 2013 12:04:24 -0000 Author: mav Date: Mon Aug 26 12:04:22 2013 New Revision: 254905 URL: http://svnweb.freebsd.org/changeset/base/254905 Log: Introduce new function devstat_end_transaction_bio_bt(), adding new argument to specify present time. Use this function to move binuptime() out of lock, substantially reducing lock congestion when slow timecounter is used. Modified: projects/camlock/sys/geom/geom_disk.c projects/camlock/sys/geom/geom_io.c projects/camlock/sys/kern/subr_devstat.c projects/camlock/sys/sys/devicestat.h Modified: projects/camlock/sys/geom/geom_disk.c ============================================================================== --- projects/camlock/sys/geom/geom_disk.c Mon Aug 26 10:40:25 2013 (r254904) +++ projects/camlock/sys/geom/geom_disk.c Mon Aug 26 12:04:22 2013 (r254905) @@ -230,6 +230,7 @@ g_disk_setstate(struct bio *bp, struct g static void g_disk_done(struct bio *bp) { + struct bintime now; struct bio *bp2; struct g_disk_softc *sc; @@ -238,12 +239,13 @@ g_disk_done(struct bio *bp) bp2 = bp->bio_parent; sc = bp2->bio_to->private; bp->bio_completed = bp->bio_length - bp->bio_resid; + binuptime(&now); mtx_lock(&sc->done_mtx); if (bp2->bio_error == 0) bp2->bio_error = bp->bio_error; bp2->bio_completed += bp->bio_completed; if ((bp->bio_cmd & (BIO_READ|BIO_WRITE|BIO_DELETE)) != 0) - devstat_end_transaction_bio(sc->dp->d_devstat, bp); + devstat_end_transaction_bio_bt(sc->dp->d_devstat, bp, &now); g_destroy_bio(bp); bp2->bio_inbed++; if (bp2->bio_children == bp2->bio_inbed) { Modified: projects/camlock/sys/geom/geom_io.c ============================================================================== --- projects/camlock/sys/geom/geom_io.c Mon Aug 26 10:40:25 2013 (r254904) +++ projects/camlock/sys/geom/geom_io.c Mon Aug 26 12:04:22 2013 (r254905) @@ -583,6 +583,7 @@ g_io_request(struct bio *bp, struct g_co void g_io_deliver(struct bio *bp, int error) { + struct bintime now; struct g_consumer *cp; struct g_provider *pp; struct thread *td; @@ -653,11 +654,13 @@ g_io_deliver(struct bio *bp, int error) * can not update one instance of the statistics from more * than one thread at a time, so grab the lock first. */ + if (g_collectstats) + binuptime(&now); g_bioq_lock(&g_bio_run_up); if (g_collectstats & 1) - devstat_end_transaction_bio(pp->stat, bp); + devstat_end_transaction_bio_bt(pp->stat, bp, &now); if (g_collectstats & 2) - devstat_end_transaction_bio(cp->stat, bp); + devstat_end_transaction_bio_bt(cp->stat, bp, &now); cp->nend++; pp->nend++; Modified: projects/camlock/sys/kern/subr_devstat.c ============================================================================== --- projects/camlock/sys/kern/subr_devstat.c Mon Aug 26 10:40:25 2013 (r254904) +++ projects/camlock/sys/kern/subr_devstat.c Mon Aug 26 12:04:22 2013 (r254905) @@ -374,6 +374,14 @@ devstat_end_transaction(struct devstat * void devstat_end_transaction_bio(struct devstat *ds, struct bio *bp) { + + devstat_end_transaction_bio_bt(ds, bp, NULL); +} + +void +devstat_end_transaction_bio_bt(struct devstat *ds, struct bio *bp, + struct bintime *now) +{ devstat_trans_flags flg; /* sanity check */ @@ -390,7 +398,7 @@ devstat_end_transaction_bio(struct devst flg = DEVSTAT_NO_DATA; devstat_end_transaction(ds, bp->bio_bcount - bp->bio_resid, - DEVSTAT_TAG_SIMPLE, flg, NULL, &bp->bio_t0); + DEVSTAT_TAG_SIMPLE, flg, now, &bp->bio_t0); DTRACE_DEVSTAT_BIO_DONE(); } Modified: projects/camlock/sys/sys/devicestat.h ============================================================================== --- projects/camlock/sys/sys/devicestat.h Mon Aug 26 10:40:25 2013 (r254904) +++ projects/camlock/sys/sys/devicestat.h Mon Aug 26 12:04:22 2013 (r254905) @@ -199,6 +199,8 @@ void devstat_end_transaction(struct devs devstat_trans_flags flags, struct bintime *now, struct bintime *then); void devstat_end_transaction_bio(struct devstat *ds, struct bio *bp); +void devstat_end_transaction_bio_bt(struct devstat *ds, struct bio *bp, + struct bintime *now); #endif #endif /* _DEVICESTAT_H */ From owner-svn-src-projects@FreeBSD.ORG Mon Aug 26 12:18:52 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id F37867CC; Mon, 26 Aug 2013 12:18:51 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id E04F12EEE; Mon, 26 Aug 2013 12:18:51 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id r7QCIp5o037324; Mon, 26 Aug 2013 12:18:51 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id r7QCIpvY037321; Mon, 26 Aug 2013 12:18:51 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201308261218.r7QCIpvY037321@svn.freebsd.org> From: Alexander Motin Date: Mon, 26 Aug 2013 12:18:51 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r254907 - projects/camlock/sys/geom X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 26 Aug 2013 12:18:52 -0000 Author: mav Date: Mon Aug 26 12:18:51 2013 New Revision: 254907 URL: http://svnweb.freebsd.org/changeset/base/254907 Log: Move g_io_deliver() out of the lock, as required for direct dispatch. Move g_destroy_bio() out too to reduce lock scope even more. Modified: projects/camlock/sys/geom/geom_disk.c Modified: projects/camlock/sys/geom/geom_disk.c ============================================================================== --- projects/camlock/sys/geom/geom_disk.c Mon Aug 26 12:05:38 2013 (r254906) +++ projects/camlock/sys/geom/geom_disk.c Mon Aug 26 12:18:51 2013 (r254907) @@ -246,13 +246,14 @@ g_disk_done(struct bio *bp) bp2->bio_completed += bp->bio_completed; if ((bp->bio_cmd & (BIO_READ|BIO_WRITE|BIO_DELETE)) != 0) devstat_end_transaction_bio_bt(sc->dp->d_devstat, bp, &now); - g_destroy_bio(bp); bp2->bio_inbed++; if (bp2->bio_children == bp2->bio_inbed) { + mtx_unlock(&sc->done_mtx); bp2->bio_resid = bp2->bio_bcount - bp2->bio_completed; g_io_deliver(bp2, bp2->bio_error); - } - mtx_unlock(&sc->done_mtx); + } else + mtx_unlock(&sc->done_mtx); + g_destroy_bio(bp); } static int From owner-svn-src-projects@FreeBSD.ORG Mon Aug 26 12:55:54 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 8D1873EB; Mon, 26 Aug 2013 12:55:54 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 6BB95219F; Mon, 26 Aug 2013 12:55:54 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id r7QCts55057865; Mon, 26 Aug 2013 12:55:54 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id r7QCts7t057864; Mon, 26 Aug 2013 12:55:54 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201308261255.r7QCts7t057864@svn.freebsd.org> From: Alexander Motin Date: Mon, 26 Aug 2013 12:55:54 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r254908 - projects/camlock/sys/geom X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 26 Aug 2013 12:55:54 -0000 Author: mav Date: Mon Aug 26 12:55:53 2013 New Revision: 254908 URL: http://svnweb.freebsd.org/changeset/base/254908 Log: Use per-consumer/provider locks from mtx_pool() to serialize the statistics update instead of global ones. Additional lock acquisition for queued dispatch may add some overhead, but instead it removes any collisions for direct dispatch. Modified: projects/camlock/sys/geom/geom_io.c Modified: projects/camlock/sys/geom/geom_io.c ============================================================================== --- projects/camlock/sys/geom/geom_io.c Mon Aug 26 12:18:51 2013 (r254907) +++ projects/camlock/sys/geom/geom_io.c Mon Aug 26 12:55:53 2013 (r254908) @@ -465,6 +465,7 @@ g_io_request(struct bio *bp, struct g_co { struct g_provider *pp; struct thread *td; + struct mtx *mtxp; int direct, error, first; KASSERT(cp != NULL, ("NULL cp in g_io_request")); @@ -538,27 +539,28 @@ g_io_request(struct bio *bp, struct g_co direct = 0; #endif + if (!TAILQ_EMPTY(&g_classifier_tailq) && !bp->bio_classifier1) { + g_bioq_lock(&g_bio_run_down); + g_run_classifiers(bp); + g_bioq_unlock(&g_bio_run_down); + } + /* * The statistics collection is lockless, as such, but we * can not update one instance of the statistics from more * than one thread at a time, so grab the lock first. - * - * We also use the lock to protect the list of classifiers. */ - g_bioq_lock(&g_bio_run_down); - - if (!TAILQ_EMPTY(&g_classifier_tailq) && !bp->bio_classifier1) - g_run_classifiers(bp); - + mtxp = mtx_pool_find(mtxpool_sleep, pp); + mtx_lock(mtxp); if (g_collectstats & 1) devstat_start_transaction(pp->stat, &bp->bio_t0); if (g_collectstats & 2) devstat_start_transaction(cp->stat, &bp->bio_t0); - pp->nstart++; cp->nstart++; + mtx_unlock(mtxp); + if (direct) { - g_bioq_unlock(&g_bio_run_down); error = g_io_check(bp); if (error >= 0) { CTR3(KTR_GEOM, "g_io_request g_io_check on bp %p " @@ -569,6 +571,7 @@ g_io_request(struct bio *bp, struct g_co } bp->bio_to->geom->start(bp); } else { + g_bioq_lock(&g_bio_run_down); first = TAILQ_EMPTY(&g_bio_run_down.bio_queue); TAILQ_INSERT_TAIL(&g_bio_run_down.bio_queue, bp, bio_queue); bp->bio_flags |= BIO_ONQUEUE; @@ -587,6 +590,7 @@ g_io_deliver(struct bio *bp, int error) struct g_consumer *cp; struct g_provider *pp; struct thread *td; + struct mtx *mtxp; int direct, first; KASSERT(bp != NULL, ("NULL bp in g_io_deliver")); @@ -656,20 +660,22 @@ g_io_deliver(struct bio *bp, int error) */ if (g_collectstats) binuptime(&now); - g_bioq_lock(&g_bio_run_up); + mtxp = mtx_pool_find(mtxpool_sleep, cp); + mtx_lock(mtxp); if (g_collectstats & 1) devstat_end_transaction_bio_bt(pp->stat, bp, &now); if (g_collectstats & 2) devstat_end_transaction_bio_bt(cp->stat, bp, &now); - cp->nend++; pp->nend++; + mtx_unlock(mtxp); + if (error != ENOMEM) { bp->bio_error = error; if (direct) { - g_bioq_unlock(&g_bio_run_up); biodone(bp); } else { + g_bioq_lock(&g_bio_run_up); first = TAILQ_EMPTY(&g_bio_run_up.bio_queue); TAILQ_INSERT_TAIL(&g_bio_run_up.bio_queue, bp, bio_queue); bp->bio_flags |= BIO_ONQUEUE; @@ -680,7 +686,6 @@ g_io_deliver(struct bio *bp, int error) } return; } - g_bioq_unlock(&g_bio_run_up); if (bootverbose) printf("ENOMEM %p on %p(%s)\n", bp, pp, pp->name); From owner-svn-src-projects@FreeBSD.ORG Mon Aug 26 13:00:26 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id A4FF875F; Mon, 26 Aug 2013 13:00:26 +0000 (UTC) (envelope-from andrew@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 79ADB2218; Mon, 26 Aug 2013 13:00:26 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id r7QD0QWx059936; Mon, 26 Aug 2013 13:00:26 GMT (envelope-from andrew@svn.freebsd.org) Received: (from andrew@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id r7QD0Qkm059922; Mon, 26 Aug 2013 13:00:26 GMT (envelope-from andrew@svn.freebsd.org) Message-Id: <201308261300.r7QD0Qkm059922@svn.freebsd.org> From: Andrew Turner Date: Mon, 26 Aug 2013 13:00:26 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r254909 - projects/arm_eabi_vfp X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 26 Aug 2013 13:00:26 -0000 Author: andrew Date: Mon Aug 26 13:00:25 2013 New Revision: 254909 URL: http://svnweb.freebsd.org/changeset/base/254909 Log: Create a project branch for ARM EABI hard-float. This will be armv6 only and require clang to build as GCC is too old. It is intended this will be a new TARGET_ARCH, for example armv6hf. Added: - copied from r254908, head/ Directory Properties: projects/arm_eabi_vfp/ (props changed) From owner-svn-src-projects@FreeBSD.ORG Mon Aug 26 15:34:19 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 99D7198F; Mon, 26 Aug 2013 15:34:19 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 6D10A2BEF; Mon, 26 Aug 2013 15:34:19 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id r7QFYJaj045323; Mon, 26 Aug 2013 15:34:19 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id r7QFYJAT045321; Mon, 26 Aug 2013 15:34:19 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201308261534.r7QFYJAT045321@svn.freebsd.org> From: Alexander Motin Date: Mon, 26 Aug 2013 15:34:18 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r254912 - projects/camlock/sys/geom/nop X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 26 Aug 2013 15:34:19 -0000 Author: mav Date: Mon Aug 26 15:34:18 2013 New Revision: 254912 URL: http://svnweb.freebsd.org/changeset/base/254912 Log: Make GEOM NOP support direct dispatch by locking statistics update. Modified: projects/camlock/sys/geom/nop/g_nop.c projects/camlock/sys/geom/nop/g_nop.h Modified: projects/camlock/sys/geom/nop/g_nop.c ============================================================================== --- projects/camlock/sys/geom/nop/g_nop.c Mon Aug 26 14:14:25 2013 (r254911) +++ projects/camlock/sys/geom/nop/g_nop.c Mon Aug 26 15:34:18 2013 (r254912) @@ -107,6 +107,7 @@ g_nop_start(struct bio *bp) gp = bp->bio_to->geom; sc = gp->softc; G_NOP_LOGREQ(bp, "Request received."); + mtx_lock(&sc->sc_lock); switch (bp->bio_cmd) { case BIO_READ: sc->sc_reads++; @@ -119,6 +120,7 @@ g_nop_start(struct bio *bp) failprob = sc->sc_wfailprob; break; } + mtx_unlock(&sc->sc_lock); if (failprob > 0) { u_int rval; @@ -224,6 +226,7 @@ g_nop_create(struct gctl_req *req, struc sc->sc_writes = 0; sc->sc_readbytes = 0; sc->sc_wrotebytes = 0; + mtx_init(&sc->sc_lock, "gnop lock", NULL, MTX_DEF); gp->softc = sc; gp->start = g_nop_start; gp->orphan = g_nop_orphan; @@ -232,10 +235,12 @@ g_nop_create(struct gctl_req *req, struc gp->dumpconf = g_nop_dumpconf; newpp = g_new_providerf(gp, "%s", gp->name); + newpp->flags |= G_PF_DIRECT_SEND | G_PF_DIRECT_RECEIVE; newpp->mediasize = size; newpp->sectorsize = secsize; cp = g_new_consumer(gp); + cp->flags |= G_CF_DIRECT_SEND | G_CF_DIRECT_RECEIVE; error = g_attach(cp, pp); if (error != 0) { gctl_error(req, "Cannot attach to provider %s.", pp->name); @@ -251,6 +256,7 @@ fail: g_detach(cp); g_destroy_consumer(cp); g_destroy_provider(newpp); + mtx_destroy(&sc->sc_lock); g_free(gp->softc); g_destroy_geom(gp); return (error); @@ -259,10 +265,12 @@ fail: static int g_nop_destroy(struct g_geom *gp, boolean_t force) { + struct g_nop_softc *sc; struct g_provider *pp; g_topology_assert(); - if (gp->softc == NULL) + sc = gp->softc; + if (sc == NULL) return (ENXIO); pp = LIST_FIRST(&gp->provider); if (pp != NULL && (pp->acr != 0 || pp->acw != 0 || pp->ace != 0)) { @@ -277,8 +285,9 @@ g_nop_destroy(struct g_geom *gp, boolean } else { G_NOP_DEBUG(0, "Device %s removed.", gp->name); } - g_free(gp->softc); gp->softc = NULL; + mtx_destroy(&sc->sc_lock); + g_free(sc); g_wither_geom(gp, ENXIO); return (0); Modified: projects/camlock/sys/geom/nop/g_nop.h ============================================================================== --- projects/camlock/sys/geom/nop/g_nop.h Mon Aug 26 14:14:25 2013 (r254911) +++ projects/camlock/sys/geom/nop/g_nop.h Mon Aug 26 15:34:18 2013 (r254912) @@ -65,6 +65,7 @@ struct g_nop_softc { uintmax_t sc_writes; uintmax_t sc_readbytes; uintmax_t sc_wrotebytes; + struct mtx sc_lock; }; #endif /* _KERNEL */ From owner-svn-src-projects@FreeBSD.ORG Mon Aug 26 16:04:53 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 6A4A264E; Mon, 26 Aug 2013 16:04:53 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 48BC82DA7; Mon, 26 Aug 2013 16:04:53 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id r7QG4ruY061528; Mon, 26 Aug 2013 16:04:53 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id r7QG4qVh061525; Mon, 26 Aug 2013 16:04:52 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201308261604.r7QG4qVh061525@svn.freebsd.org> From: Alexander Motin Date: Mon, 26 Aug 2013 16:04:52 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r254914 - projects/camlock/sys/geom/stripe X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 26 Aug 2013 16:04:53 -0000 Author: mav Date: Mon Aug 26 16:04:52 2013 New Revision: 254914 URL: http://svnweb.freebsd.org/changeset/base/254914 Log: Make GEOM STRIPE support direct dispatch by locking g_stripe_done() method. Modified: projects/camlock/sys/geom/stripe/g_stripe.c projects/camlock/sys/geom/stripe/g_stripe.h Modified: projects/camlock/sys/geom/stripe/g_stripe.c ============================================================================== --- projects/camlock/sys/geom/stripe/g_stripe.c Mon Aug 26 15:38:27 2013 (r254913) +++ projects/camlock/sys/geom/stripe/g_stripe.c Mon Aug 26 16:04:52 2013 (r254914) @@ -284,22 +284,25 @@ g_stripe_done(struct bio *bp) pbp = bp->bio_parent; sc = pbp->bio_to->geom->softc; - if (pbp->bio_error == 0) - pbp->bio_error = bp->bio_error; - pbp->bio_completed += bp->bio_completed; if (bp->bio_cmd == BIO_READ && bp->bio_caller1 != NULL) { g_stripe_copy(sc, bp->bio_data, bp->bio_caller1, bp->bio_offset, bp->bio_length, 1); bp->bio_data = bp->bio_caller1; bp->bio_caller1 = NULL; } - g_destroy_bio(bp); + mtx_lock(&sc->sc_lock); + if (pbp->bio_error == 0) + pbp->bio_error = bp->bio_error; + pbp->bio_completed += bp->bio_completed; pbp->bio_inbed++; if (pbp->bio_children == pbp->bio_inbed) { + mtx_unlock(&sc->sc_lock); if (pbp->bio_driver1 != NULL) uma_zfree(g_stripe_zone, pbp->bio_driver1); g_io_deliver(pbp, pbp->bio_error); - } + } else + mtx_unlock(&sc->sc_lock); + g_destroy_bio(bp); } static int @@ -651,6 +654,7 @@ g_stripe_check_and_run(struct g_stripe_s sc->sc_provider = g_new_providerf(sc->sc_geom, "stripe/%s", sc->sc_name); + sc->sc_provider->flags |= G_PF_DIRECT_SEND | G_PF_DIRECT_RECEIVE; /* * Find the smallest disk. */ @@ -729,6 +733,7 @@ g_stripe_add_disk(struct g_stripe_softc fcp = LIST_FIRST(&gp->consumer); cp = g_new_consumer(gp); + cp->flags |= G_CF_DIRECT_SEND | G_CF_DIRECT_RECEIVE; cp->private = NULL; cp->index = no; error = g_attach(cp, pp); @@ -830,6 +835,7 @@ g_stripe_create(struct g_class *mp, cons for (no = 0; no < sc->sc_ndisks; no++) sc->sc_disks[no] = NULL; sc->sc_type = type; + mtx_init(&sc->sc_lock, "gstripe lock", NULL, MTX_DEF); gp->softc = sc; sc->sc_geom = gp; @@ -878,6 +884,7 @@ g_stripe_destroy(struct g_stripe_softc * KASSERT(sc->sc_provider == NULL, ("Provider still exists? (device=%s)", gp->name)); free(sc->sc_disks, M_STRIPE); + mtx_destroy(&sc->sc_lock); free(sc, M_STRIPE); G_STRIPE_DEBUG(0, "Device %s destroyed.", gp->name); g_wither_geom(gp, ENXIO); Modified: projects/camlock/sys/geom/stripe/g_stripe.h ============================================================================== --- projects/camlock/sys/geom/stripe/g_stripe.h Mon Aug 26 15:38:27 2013 (r254913) +++ projects/camlock/sys/geom/stripe/g_stripe.h Mon Aug 26 16:04:52 2013 (r254914) @@ -76,6 +76,7 @@ struct g_stripe_softc { uint16_t sc_ndisks; uint32_t sc_stripesize; uint32_t sc_stripebits; + struct mtx sc_lock; }; #define sc_name sc_geom->name #endif /* _KERNEL */ From owner-svn-src-projects@FreeBSD.ORG Mon Aug 26 16:32:56 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 936CC166; Mon, 26 Aug 2013 16:32:56 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 7FE252F7D; Mon, 26 Aug 2013 16:32:56 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id r7QGWuMK077927; Mon, 26 Aug 2013 16:32:56 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id r7QGWuUZ077926; Mon, 26 Aug 2013 16:32:56 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201308261632.r7QGWuUZ077926@svn.freebsd.org> From: Alexander Motin Date: Mon, 26 Aug 2013 16:32:56 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r254916 - projects/camlock/sys/geom/stripe X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 26 Aug 2013 16:32:56 -0000 Author: mav Date: Mon Aug 26 16:32:56 2013 New Revision: 254916 URL: http://svnweb.freebsd.org/changeset/base/254916 Log: In addition to r254914 switch from using g_std_done() to g_stripe_done(). It is required for direct dispatch because g_std_done() is unlocked. Modified: projects/camlock/sys/geom/stripe/g_stripe.c Modified: projects/camlock/sys/geom/stripe/g_stripe.c ============================================================================== --- projects/camlock/sys/geom/stripe/g_stripe.c Mon Aug 26 16:23:54 2013 (r254915) +++ projects/camlock/sys/geom/stripe/g_stripe.c Mon Aug 26 16:32:56 2013 (r254916) @@ -457,7 +457,7 @@ g_stripe_start_economic(struct bio *bp, /* * Fill in the component buf structure. */ - cbp->bio_done = g_std_done; + cbp->bio_done = g_stripe_done; cbp->bio_offset = offset; cbp->bio_data = addr; cbp->bio_length = length; @@ -482,7 +482,7 @@ g_stripe_start_economic(struct bio *bp, /* * Fill in the component buf structure. */ - cbp->bio_done = g_std_done; + cbp->bio_done = g_stripe_done; cbp->bio_offset = offset; cbp->bio_data = addr; /* @@ -539,15 +539,15 @@ g_stripe_flush(struct g_stripe_softc *sc return; } bioq_insert_tail(&queue, cbp); - cbp->bio_done = g_std_done; - cbp->bio_caller1 = sc->sc_disks[no]; + cbp->bio_done = g_stripe_done; + cbp->bio_caller2 = sc->sc_disks[no]; cbp->bio_to = sc->sc_disks[no]->provider; } for (cbp = bioq_first(&queue); cbp != NULL; cbp = bioq_first(&queue)) { bioq_remove(&queue, cbp); G_STRIPE_LOGREQ(cbp, "Sending request."); - cp = cbp->bio_caller1; - cbp->bio_caller1 = NULL; + cp = cbp->bio_caller2; + cbp->bio_caller2 = NULL; g_io_request(cbp, cp); } } From owner-svn-src-projects@FreeBSD.ORG Mon Aug 26 18:21:06 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id E7AAA7F9; Mon, 26 Aug 2013 18:21:05 +0000 (UTC) (envelope-from markm@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id D282625D5; Mon, 26 Aug 2013 18:21:05 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id r7QIL5Gr038693; Mon, 26 Aug 2013 18:21:05 GMT (envelope-from markm@svn.freebsd.org) Received: (from markm@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id r7QIL4pe038660; Mon, 26 Aug 2013 18:21:04 GMT (envelope-from markm@svn.freebsd.org) Message-Id: <201308261821.r7QIL4pe038660@svn.freebsd.org> From: Mark Murray Date: Mon, 26 Aug 2013 18:21:04 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r254926 - in projects/random_number_generator: . share/man/man5 share/man/man9 share/misc sys/arm/arm sys/arm/include sys/dev/amdtemp sys/dev/xen/netback sys/vm tools/build/mk tools/bui... X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 26 Aug 2013 18:21:06 -0000 Author: markm Date: Mon Aug 26 18:21:04 2013 New Revision: 254926 URL: http://svnweb.freebsd.org/changeset/base/254926 Log: MFC Added: projects/random_number_generator/tools/build/options/WITHOUT_ICONV - copied unchanged from r254924, head/tools/build/options/WITHOUT_ICONV projects/random_number_generator/tools/build/options/WITH_LIBICONV_COMPAT - copied unchanged from r254924, head/tools/build/options/WITH_LIBICONV_COMPAT projects/random_number_generator/tools/build/options/WITH_USB_GADGET_EXAMPLES - copied unchanged from r254924, head/tools/build/options/WITH_USB_GADGET_EXAMPLES Deleted: projects/random_number_generator/tools/build/options/WITH_ICONV Modified: projects/random_number_generator/ObsoleteFiles.inc projects/random_number_generator/share/man/man5/src.conf.5 projects/random_number_generator/share/man/man9/Makefile projects/random_number_generator/share/misc/committers-src.dot projects/random_number_generator/sys/arm/arm/pmap-v6.c projects/random_number_generator/sys/arm/include/param.h projects/random_number_generator/sys/arm/include/pmap.h projects/random_number_generator/sys/arm/include/pte.h projects/random_number_generator/sys/arm/include/vmparam.h projects/random_number_generator/sys/dev/amdtemp/amdtemp.c projects/random_number_generator/sys/dev/xen/netback/netback.c projects/random_number_generator/sys/vm/vm_page.c projects/random_number_generator/tools/build/mk/OptionalObsoleteFiles.inc projects/random_number_generator/usr.bin/kdump/kdump.c projects/random_number_generator/usr.bin/kdump/mksubr projects/random_number_generator/usr.sbin/mfiutil/mfi_drive.c projects/random_number_generator/usr.sbin/mfiutil/mfiutil.8 projects/random_number_generator/usr.sbin/mfiutil/mfiutil.c Directory Properties: projects/random_number_generator/ (props changed) projects/random_number_generator/sys/ (props changed) Modified: projects/random_number_generator/ObsoleteFiles.inc ============================================================================== --- projects/random_number_generator/ObsoleteFiles.inc Mon Aug 26 18:16:05 2013 (r254925) +++ projects/random_number_generator/ObsoleteFiles.inc Mon Aug 26 18:21:04 2013 (r254926) @@ -38,6 +38,14 @@ # xargs -n1 | sort | uniq -d; # done +# 20130822: bind 9.9.3-P2 import +OLD_LIBS+=usr/lib/liblwres.so.80 +# 20130814: vm_page_busy(9) +OLD_FILES+=usr/share/man/man9/vm_page_flash.9.gz +OLD_FILES+=usr/share/man/man9/vm_page_io.9.gz +OLD_FILES+=usr/share/man/man9/vm_page_io_finish.9.gz +OLD_FILES+=usr/share/man/man9/vm_page_io_start.9.gz +OLD_FILES+=usr/share/man/man9/vm_page_wakeup.9.gz # 20130710: libkvm version bump OLD_LIBS+=lib/libkvm.so.5 OLD_LIBS+=usr/lib32/libkvm.so.5 @@ -114,6 +122,7 @@ OLD_FILES+=usr/include/clang/3.2/xmmintr OLD_FILES+=usr/include/clang/3.2/xopintrin.h OLD_DIRS+=usr/include/clang/3.2 # 20130404: legacy ATA stack removed +OLD_FILES+=etc/periodic/daily/405.status-ata-raid OLD_FILES+=rescue/atacontrol OLD_FILES+=sbin/atacontrol OLD_FILES+=usr/share/man/man8/atacontrol.8.gz Modified: projects/random_number_generator/share/man/man5/src.conf.5 ============================================================================== --- projects/random_number_generator/share/man/man5/src.conf.5 Mon Aug 26 18:16:05 2013 (r254925) +++ projects/random_number_generator/share/man/man5/src.conf.5 Mon Aug 26 18:21:04 2013 (r254926) @@ -1,7 +1,7 @@ .\" DO NOT EDIT-- this file is automatically generated. .\" from FreeBSD: head/tools/build/options/makeman 253304 2013-07-12 23:08:44Z bapt .\" $FreeBSD$ -.Dd July 16, 2013 +.Dd August 26, 2013 .Dt SRC.CONF 5 .Os .Sh NAME @@ -245,9 +245,6 @@ Set to not build the BSD licensed versio .It Va WITH_BSD_GREP .\" from FreeBSD: head/tools/build/options/WITH_BSD_GREP 222273 2011-05-25 01:04:12Z obrien Install BSD-licensed grep as '[ef]grep' instead of GNU grep. -.It Va WITH_BSD_PATCH -.\" from FreeBSD: head/tools/build/options/WITH_BSD_PATCH 246074 2013-01-29 17:03:18Z gabor -Install BSD-licensed patch as 'patch' instead of GNU patch. .It Va WITHOUT_BSNMP .\" from FreeBSD: head/tools/build/options/WITHOUT_BSNMP 183306 2008-09-23 16:15:42Z sam Set to not build or install @@ -506,6 +503,9 @@ When set, it also enforces the following .It .Va WITHOUT_GNU_SUPPORT .El +.It Va WITH_GNU_PATCH +.\" from FreeBSD: head/tools/build/options/WITH_GNU_PATCH 253689 2013-07-26 21:25:18Z pfg +Install GNU-licensed patch as 'patch' instead of BSD patch. .It Va WITHOUT_GNU_SUPPORT .\" from FreeBSD: head/tools/build/options/WITHOUT_GNU_SUPPORT 156932 2006-03-21 07:50:50Z ru Set to build some programs without optional GNU support. @@ -538,9 +538,15 @@ Set to build Hesiod support. .It Va WITHOUT_HTML .\" from FreeBSD: head/tools/build/options/WITHOUT_HTML 156932 2006-03-21 07:50:50Z ru Set to not build HTML docs. -.It Va WITH_ICONV -.\" from FreeBSD: head/tools/build/options/WITH_ICONV 219020 2011-02-25 00:10:26Z gabor -Set to build iconv as part of libc. +.It Va WITHOUT_ICONV +.\" from FreeBSD: head/tools/build/options/WITHOUT_ICONV 254919 2013-08-26 17:15:56Z antoine +Set to not build iconv as part of libc. +When set, it also enforces the following options: +.Pp +.Bl -item -compact +.It +.Va WITHOUT_LIBICONV_COMPAT +.El .It Va WITHOUT_INET .\" from FreeBSD: head/tools/build/options/WITHOUT_INET 221266 2011-04-30 17:58:28Z bz Set to not build programs and libraries related to IPv4 networking. @@ -701,6 +707,9 @@ runtime linker. .It Va WITHOUT_LIBCPLUSPLUS .\" from FreeBSD: head/tools/build/options/WITHOUT_LIBCPLUSPLUS 246262 2013-02-02 22:42:46Z dim Set to avoid building libcxxrt and libc++. +.It Va WITH_LIBICONV_COMPAT +.\" from FreeBSD: head/tools/build/options/WITH_LIBICONV_COMPAT 254919 2013-08-26 17:15:56Z antoine +Set to build libiconv API and link time compatibility. .It Va WITHOUT_LIBPTHREAD .\" from FreeBSD: head/tools/build/options/WITHOUT_LIBPTHREAD 188848 2009-02-20 11:09:55Z mtm Set to not build the @@ -1129,6 +1138,9 @@ When set, it also enforces the following .It Va WITHOUT_USB .\" from FreeBSD: head/tools/build/options/WITHOUT_USB 156932 2006-03-21 07:50:50Z ru Set to not build USB-related programs and libraries. +.It Va WITH_USB_GADGET_EXAMPLES +.\" from FreeBSD: head/tools/build/options/WITH_USB_GADGET_EXAMPLES 254919 2013-08-26 17:15:56Z antoine +Set to build USB gadget kernel modules. .It Va WITHOUT_UTMPX .\" from FreeBSD: head/tools/build/options/WITHOUT_UTMPX 231530 2012-02-11 20:28:42Z ed Set to not build user accounting tools such as Modified: projects/random_number_generator/share/man/man9/Makefile ============================================================================== --- projects/random_number_generator/share/man/man9/Makefile Mon Aug 26 18:16:05 2013 (r254925) +++ projects/random_number_generator/share/man/man9/Makefile Mon Aug 26 18:21:04 2013 (r254926) @@ -324,6 +324,7 @@ MAN= accept_filter.9 \ vm_map_wire.9 \ vm_page_alloc.9 \ vm_page_bits.9 \ + vm_page_busy.9 \ vm_page_cache.9 \ vm_page_deactivate.9 \ vm_page_dontneed.9 \ Modified: projects/random_number_generator/share/misc/committers-src.dot ============================================================================== --- projects/random_number_generator/share/misc/committers-src.dot Mon Aug 26 18:16:05 2013 (r254925) +++ projects/random_number_generator/share/misc/committers-src.dot Mon Aug 26 18:21:04 2013 (r254926) @@ -187,6 +187,7 @@ jkim [label="Jung-uk Kim\njkim@FreeBSD.o jkoshy [label="A. Joseph Koshy\njkoshy@FreeBSD.org\n1998/05/13"] jlh [label="Jeremie Le Hen\njlh@FreeBSD.org\n2012/04/22"] jls [label="Jordan Sissel\njls@FreeBSD.org\n2006/12/06"] +jmg [label="John-Mark Gurney\njmg@FreeBSD.org\n1997/02/13"] joerg [label="Joerg Wunsch\njoerg@FreeBSD.org\n1993/11/14"] jon [label="Jonathan Chen\njon@FreeBSD.org\n2000/10/17"] jonathan [label="Jonathan Anderson\njonathan@FreeBSD.org\n2010/10/07"] @@ -495,6 +496,7 @@ jlemon -> brooks joerg -> brian joerg -> eik +joerg -> jmg joerg -> le joerg -> netchild joerg -> schweikh Modified: projects/random_number_generator/sys/arm/arm/pmap-v6.c ============================================================================== --- projects/random_number_generator/sys/arm/arm/pmap-v6.c Mon Aug 26 18:16:05 2013 (r254925) +++ projects/random_number_generator/sys/arm/arm/pmap-v6.c Mon Aug 26 18:21:04 2013 (r254926) @@ -171,6 +171,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include @@ -201,6 +202,8 @@ int pmap_debug_level = 0; #define PV_STAT(x) do { } while (0) #endif +#define pa_to_pvh(pa) (&pv_table[pa_index(pa)]) + #ifdef ARM_L2_PIPT #define pmap_l2cache_wbinv_range(va, pa, size) cpu_l2cache_wbinv_range((pa), (size)) #define pmap_l2cache_inv_range(va, pa, size) cpu_l2cache_inv_range((pa), (size)) @@ -215,10 +218,16 @@ extern struct pv_addr systempage; * Internal function prototypes */ +static PMAP_INLINE +struct pv_entry *pmap_find_pv(struct md_page *, pmap_t, vm_offset_t); static void pmap_free_pv_chunk(struct pv_chunk *pc); static void pmap_free_pv_entry(pmap_t pmap, pv_entry_t pv); static pv_entry_t pmap_get_pv_entry(pmap_t pmap, boolean_t try); static vm_page_t pmap_pv_reclaim(pmap_t locked_pmap); +static boolean_t pmap_pv_insert_section(pmap_t, vm_offset_t, + vm_paddr_t); +static struct pv_entry *pmap_remove_pv(struct vm_page *, pmap_t, vm_offset_t); +static int pmap_pvh_wired_mappings(struct md_page *, int); static void pmap_enter_locked(pmap_t, vm_offset_t, vm_prot_t, vm_page_t, vm_prot_t, boolean_t, int); @@ -226,6 +235,14 @@ static vm_paddr_t pmap_extract_locked(pm static void pmap_alloc_l1(pmap_t); static void pmap_free_l1(pmap_t); +static void pmap_map_section(pmap_t, vm_offset_t, vm_offset_t, + vm_prot_t, boolean_t); +static void pmap_promote_section(pmap_t, vm_offset_t); +static boolean_t pmap_demote_section(pmap_t, vm_offset_t); +static boolean_t pmap_enter_section(pmap_t, vm_offset_t, vm_page_t, + vm_prot_t); +static void pmap_remove_section(pmap_t, vm_offset_t); + static int pmap_clearbit(struct vm_page *, u_int); static struct l2_bucket *pmap_get_l2_bucket(pmap_t, vm_offset_t); @@ -403,6 +420,7 @@ int pmap_needs_pte_sync; */ static TAILQ_HEAD(pch, pv_chunk) pv_chunks = TAILQ_HEAD_INITIALIZER(pv_chunks); static int pv_entry_count, pv_entry_max, pv_entry_high_water; +static struct md_page *pv_table; static int shpgperproc = PMAP_SHPGPERPROC; struct pv_chunk *pv_chunkbase; /* KVA block for pv_chunks */ @@ -433,6 +451,11 @@ static const uint32_t pc_freemask[_NPCM] static SYSCTL_NODE(_vm, OID_AUTO, pmap, CTLFLAG_RD, 0, "VM/pmap parameters"); +/* Superpages utilization enabled = 1 / disabled = 0 */ +static int sp_enabled = 0; +SYSCTL_INT(_vm_pmap, OID_AUTO, sp_enabled, CTLFLAG_RDTUN, &sp_enabled, 0, + "Are large page mappings enabled?"); + SYSCTL_INT(_vm_pmap, OID_AUTO, pv_entry_count, CTLFLAG_RD, &pv_entry_count, 0, "Current number of pv entries"); @@ -891,7 +914,9 @@ static int pmap_clearbit(struct vm_page *m, u_int maskbits) { struct l2_bucket *l2b; - struct pv_entry *pv; + struct pv_entry *pv, *pve, *next_pv; + struct md_page *pvh; + pd_entry_t *pl1pd; pt_entry_t *ptep, npte, opte; pmap_t pmap; vm_offset_t va; @@ -899,7 +924,79 @@ pmap_clearbit(struct vm_page *m, u_int m int count = 0; rw_wlock(&pvh_global_lock); + if ((m->flags & PG_FICTITIOUS) != 0) + goto small_mappings; + pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m)); + TAILQ_FOREACH_SAFE(pv, &pvh->pv_list, pv_list, next_pv) { + va = pv->pv_va; + pmap = PV_PMAP(pv); + PMAP_LOCK(pmap); + pl1pd = &pmap->pm_l1->l1_kva[L1_IDX(va)]; + KASSERT((*pl1pd & L1_TYPE_MASK) == L1_S_PROTO, + ("pmap_clearbit: valid section mapping expected")); + if ((maskbits & PVF_WRITE) && (pv->pv_flags & PVF_WRITE)) + (void)pmap_demote_section(pmap, va); + else if ((maskbits & PVF_REF) && L1_S_REFERENCED(*pl1pd)) { + if (pmap_demote_section(pmap, va)) { + if ((pv->pv_flags & PVF_WIRED) == 0) { + /* + * Remove the mapping to a single page + * so that a subsequent access may + * repromote. Since the underlying + * l2_bucket is fully populated, this + * removal never frees an entire + * l2_bucket. + */ + va += (VM_PAGE_TO_PHYS(m) & + L1_S_OFFSET); + l2b = pmap_get_l2_bucket(pmap, va); + KASSERT(l2b != NULL, + ("pmap_clearbit: no l2 bucket for " + "va 0x%#x, pmap 0x%p", va, pmap)); + ptep = &l2b->l2b_kva[l2pte_index(va)]; + *ptep = 0; + PTE_SYNC(ptep); + pmap_free_l2_bucket(pmap, l2b, 1); + pve = pmap_remove_pv(m, pmap, va); + KASSERT(pve != NULL, ("pmap_clearbit: " + "no PV entry for managed mapping")); + pmap_free_pv_entry(pmap, pve); + + } + } + } else if ((maskbits & PVF_MOD) && L1_S_WRITABLE(*pl1pd)) { + if (pmap_demote_section(pmap, va)) { + if ((pv->pv_flags & PVF_WIRED) == 0) { + /* + * Write protect the mapping to a + * single page so that a subsequent + * write access may repromote. + */ + va += (VM_PAGE_TO_PHYS(m) & + L1_S_OFFSET); + l2b = pmap_get_l2_bucket(pmap, va); + KASSERT(l2b != NULL, + ("pmap_clearbit: no l2 bucket for " + "va 0x%#x, pmap 0x%p", va, pmap)); + ptep = &l2b->l2b_kva[l2pte_index(va)]; + if ((*ptep & L2_S_PROTO) != 0) { + pve = pmap_find_pv(&m->md, + pmap, va); + KASSERT(pve != NULL, + ("pmap_clearbit: no PV " + "entry for managed mapping")); + pve->pv_flags &= ~PVF_WRITE; + *ptep &= ~L2_APX; + PTE_SYNC(ptep); + } + } + } + } + PMAP_UNLOCK(pmap); + } + +small_mappings: if (TAILQ_EMPTY(&m->md.pv_list)) { rw_wunlock(&pvh_global_lock); return (0); @@ -917,6 +1014,8 @@ pmap_clearbit(struct vm_page *m, u_int m PMAP_LOCK(pmap); l2b = pmap_get_l2_bucket(pmap, va); + KASSERT(l2b != NULL, ("pmap_clearbit: no l2 bucket for " + "va 0x%#x, pmap 0x%p", va, pmap)); ptep = &l2b->l2b_kva[l2pte_index(va)]; npte = opte = *ptep; @@ -999,14 +1098,15 @@ pmap_enter_pv(struct vm_page *m, struct * => caller should hold lock on vm_page */ static PMAP_INLINE struct pv_entry * -pmap_find_pv(struct vm_page *m, pmap_t pmap, vm_offset_t va) +pmap_find_pv(struct md_page *md, pmap_t pmap, vm_offset_t va) { struct pv_entry *pv; rw_assert(&pvh_global_lock, RA_WLOCKED); - TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) - if (pmap == PV_PMAP(pv) && va == pv->pv_va) - break; + TAILQ_FOREACH(pv, &md->pv_list, pv_list) + if (pmap == PV_PMAP(pv) && va == pv->pv_va) + break; + return (pv); } @@ -1075,7 +1175,7 @@ pmap_remove_pv(struct vm_page *m, pmap_t rw_assert(&pvh_global_lock, RA_WLOCKED); PMAP_ASSERT_LOCKED(pmap); - pve = pmap_find_pv(m, pmap, va); /* find corresponding pve */ + pve = pmap_find_pv(&m->md, pmap, va); /* find corresponding pve */ if (pve != NULL) { TAILQ_REMOVE(&m->md.pv_list, pve, pv_list); if (pve->pv_flags & PVF_WIRED) @@ -1106,7 +1206,7 @@ pmap_modify_pv(struct vm_page *m, pmap_t PMAP_ASSERT_LOCKED(pmap); rw_assert(&pvh_global_lock, RA_WLOCKED); - if ((npv = pmap_find_pv(m, pmap, va)) == NULL) + if ((npv = pmap_find_pv(&m->md, pmap, va)) == NULL) return (0); /* @@ -1143,6 +1243,7 @@ pmap_pinit0(struct pmap *pmap) bcopy(kernel_pmap, pmap, sizeof(*pmap)); bzero(&pmap->pm_mtx, sizeof(pmap->pm_mtx)); PMAP_LOCK_INIT(pmap); + TAILQ_INIT(&pmap->pm_pvchunk); } /* @@ -1206,6 +1307,8 @@ pmap_ptelist_init(vm_offset_t *head, voi void pmap_init(void) { + vm_size_t s; + int i, pv_npg; PDEBUG(1, printf("pmap_init: phys_start = %08x\n", PHYSADDR)); @@ -1215,6 +1318,32 @@ pmap_init(void) NULL, NULL, NULL, UMA_ALIGN_PTR, UMA_ZONE_VM | UMA_ZONE_NOFREE); /* + * Are large page mappings supported and enabled? + */ + TUNABLE_INT_FETCH("vm.pmap.sp_enabled", &sp_enabled); + if (sp_enabled) { + KASSERT(MAXPAGESIZES > 1 && pagesizes[1] == 0, + ("pmap_init: can't assign to pagesizes[1]")); + pagesizes[1] = NBPDR; + } + + /* + * Calculate the size of the pv head table for superpages. + */ + for (i = 0; phys_avail[i + 1]; i += 2); + pv_npg = round_1mpage(phys_avail[(i - 2) + 1]) / NBPDR; + + /* + * Allocate memory for the pv head table for superpages. + */ + s = (vm_size_t)(pv_npg * sizeof(struct md_page)); + s = round_page(s); + pv_table = (struct md_page *)kmem_malloc(kernel_arena, s, + M_WAITOK | M_ZERO); + for (i = 0; i < pv_npg; i++) + TAILQ_INIT(&pv_table[i].pv_list); + + /* * Initialize the address space for the pv chunks. */ @@ -1243,6 +1372,25 @@ SYSCTL_INT(_vm_pmap, OID_AUTO, pv_entry_ SYSCTL_INT(_vm_pmap, OID_AUTO, shpgperproc, CTLFLAG_RD, &shpgperproc, 0, "Page share factor per proc"); +static SYSCTL_NODE(_vm_pmap, OID_AUTO, section, CTLFLAG_RD, 0, + "1MB page mapping counters"); + +static u_long pmap_section_demotions; +SYSCTL_ULONG(_vm_pmap_section, OID_AUTO, demotions, CTLFLAG_RD, + &pmap_section_demotions, 0, "1MB page demotions"); + +static u_long pmap_section_mappings; +SYSCTL_ULONG(_vm_pmap_section, OID_AUTO, mappings, CTLFLAG_RD, + &pmap_section_mappings, 0, "1MB page mappings"); + +static u_long pmap_section_p_failures; +SYSCTL_ULONG(_vm_pmap_section, OID_AUTO, p_failures, CTLFLAG_RD, + &pmap_section_p_failures, 0, "1MB page promotion failures"); + +static u_long pmap_section_promotions; +SYSCTL_ULONG(_vm_pmap_section, OID_AUTO, promotions, CTLFLAG_RD, + &pmap_section_promotions, 0, "1MB page promotions"); + int pmap_fault_fixup(pmap_t pmap, vm_offset_t va, vm_prot_t ftype, int user) { @@ -1257,7 +1405,47 @@ pmap_fault_fixup(pmap_t pmap, vm_offset_ l1idx = L1_IDX(va); rw_wlock(&pvh_global_lock); PMAP_LOCK(pmap); - + /* + * Check and possibly fix-up L1 section mapping + * only when superpage mappings are enabled to speed up. + */ + if (sp_enabled) { + pl1pd = &pmap->pm_l1->l1_kva[l1idx]; + l1pd = *pl1pd; + if ((l1pd & L1_TYPE_MASK) == L1_S_PROTO) { + /* Catch an access to the vectors section */ + if (l1idx == L1_IDX(vector_page)) + goto out; + /* + * Stay away from the kernel mappings. + * None of them should fault from L1 entry. + */ + if (pmap == pmap_kernel()) + goto out; + /* + * Catch a forbidden userland access + */ + if (user && !(l1pd & L1_S_PROT_U)) + goto out; + /* + * Superpage is always either mapped read only + * or it is modified and permitted to be written + * by default. Therefore, process only reference + * flag fault and demote page in case of write fault. + */ + if ((ftype & VM_PROT_WRITE) && !L1_S_WRITABLE(l1pd) && + L1_S_REFERENCED(l1pd)) { + (void)pmap_demote_section(pmap, va); + goto out; + } else if (!L1_S_REFERENCED(l1pd)) { + /* Mark the page "referenced" */ + *pl1pd = l1pd | L1_S_REF; + PTE_SYNC(pl1pd); + goto l1_section_out; + } else + goto out; + } + } /* * If there is no l2_dtable for this address, then the process * has no business accessing it. @@ -1310,7 +1498,7 @@ pmap_fault_fixup(pmap_t pmap, vm_offset_ } /* Get the current flags for this page. */ - pv = pmap_find_pv(m, pmap, va); + pv = pmap_find_pv(&m->md, pmap, va); if (pv == NULL) { goto out; } @@ -1345,7 +1533,7 @@ pmap_fault_fixup(pmap_t pmap, vm_offset_ if ((m = PHYS_TO_VM_PAGE(pa)) == NULL) goto out; /* Get the current flags for this page. */ - pv = pmap_find_pv(m, pmap, va); + pv = pmap_find_pv(&m->md, pmap, va); if (pv == NULL) goto out; @@ -1410,6 +1598,7 @@ pmap_fault_fixup(pmap_t pmap, vm_offset_ } #endif +l1_section_out: cpu_tlb_flushID_SE(va); cpu_cpwait(); @@ -1976,6 +2165,24 @@ pmap_growkernel(vm_offset_t addr) kernel_vm_end = pmap_curmaxkvaddr; } +/* + * Returns TRUE if the given page is mapped individually or as part of + * a 1MB section. Otherwise, returns FALSE. + */ +boolean_t +pmap_page_is_mapped(vm_page_t m) +{ + boolean_t rv; + + if ((m->oflags & VPO_UNMANAGED) != 0) + return (FALSE); + rw_wlock(&pvh_global_lock); + rv = !TAILQ_EMPTY(&m->md.pv_list) || + ((m->flags & PG_FICTITIOUS) == 0 && + !TAILQ_EMPTY(&pa_to_pvh(VM_PAGE_TO_PHYS(m))->pv_list)); + rw_wunlock(&pvh_global_lock); + return (rv); +} /* * Remove all pages from specified address space @@ -1990,9 +2197,12 @@ pmap_remove_pages(pmap_t pmap) { struct pv_entry *pv; struct l2_bucket *l2b = NULL; - vm_page_t m; - pt_entry_t *ptep; struct pv_chunk *pc, *npc; + struct md_page *pvh; + pd_entry_t *pl1pd, l1pd; + pt_entry_t *ptep; + vm_page_t m, mt; + vm_offset_t va; uint32_t inuse, bitmask; int allfree, bit, field, idx; @@ -2008,33 +2218,63 @@ pmap_remove_pages(pmap_t pmap) bitmask = 1ul << bit; idx = field * sizeof(inuse) * NBBY + bit; pv = &pc->pc_pventry[idx]; + va = pv->pv_va; inuse &= ~bitmask; if (pv->pv_flags & PVF_WIRED) { /* Cannot remove wired pages now. */ allfree = 0; continue; } - l2b = pmap_get_l2_bucket(pmap, pv->pv_va); - KASSERT(l2b != NULL, - ("No L2 bucket in pmap_remove_pages")); - ptep = &l2b->l2b_kva[l2pte_index(pv->pv_va)]; - m = PHYS_TO_VM_PAGE(*ptep & L2_ADDR_MASK); - KASSERT((vm_offset_t)m >= KERNBASE, - ("Trying to access non-existent page " - "va %x pte %x", pv->pv_va, *ptep)); - *ptep = 0; - PTE_SYNC(ptep); + pl1pd = &pmap->pm_l1->l1_kva[L1_IDX(va)]; + l1pd = *pl1pd; + l2b = pmap_get_l2_bucket(pmap, va); + if ((l1pd & L1_TYPE_MASK) == L1_S_PROTO) { + pvh = pa_to_pvh(l1pd & L1_S_FRAME); + TAILQ_REMOVE(&pvh->pv_list, pv, pv_list); + if (TAILQ_EMPTY(&pvh->pv_list)) { + m = PHYS_TO_VM_PAGE(l1pd & L1_S_FRAME); + KASSERT((vm_offset_t)m >= KERNBASE, + ("Trying to access non-existent page " + "va %x l1pd %x", trunc_1mpage(va), l1pd)); + for (mt = m; mt < &m[L2_PTE_NUM_TOTAL]; mt++) { + if (TAILQ_EMPTY(&mt->md.pv_list)) + vm_page_aflag_clear(mt, PGA_WRITEABLE); + } + } + if (l2b != NULL) { + KASSERT(l2b->l2b_occupancy == L2_PTE_NUM_TOTAL, + ("pmap_remove_pages: l2_bucket occupancy error")); + pmap_free_l2_bucket(pmap, l2b, L2_PTE_NUM_TOTAL); + } + pmap->pm_stats.resident_count -= L2_PTE_NUM_TOTAL; + *pl1pd = 0; + PTE_SYNC(pl1pd); + } else { + KASSERT(l2b != NULL, + ("No L2 bucket in pmap_remove_pages")); + ptep = &l2b->l2b_kva[l2pte_index(va)]; + m = PHYS_TO_VM_PAGE(l2pte_pa(*ptep)); + KASSERT((vm_offset_t)m >= KERNBASE, + ("Trying to access non-existent page " + "va %x pte %x", va, *ptep)); + TAILQ_REMOVE(&m->md.pv_list, pv, pv_list); + if (TAILQ_EMPTY(&m->md.pv_list) && + (m->flags & PG_FICTITIOUS) == 0) { + pvh = pa_to_pvh(l2pte_pa(*ptep)); + if (TAILQ_EMPTY(&pvh->pv_list)) + vm_page_aflag_clear(m, PGA_WRITEABLE); + } + *ptep = 0; + PTE_SYNC(ptep); + pmap_free_l2_bucket(pmap, l2b, 1); + pmap->pm_stats.resident_count--; + } /* Mark free */ PV_STAT(pv_entry_frees++); PV_STAT(pv_entry_spare++); pv_entry_count--; - pmap->pm_stats.resident_count--; pc->pc_map[field] |= bitmask; - TAILQ_REMOVE(&m->md.pv_list, pv, pv_list); - if (TAILQ_EMPTY(&m->md.pv_list)) - vm_page_aflag_clear(m, PGA_WRITEABLE); - pmap_free_l2_bucket(pmap, l2b, 1); } } if (allfree) { @@ -2063,7 +2303,8 @@ pmap_kenter_supersection(vm_offset_t va, { pd_entry_t pd = L1_S_PROTO | L1_S_SUPERSEC | (pa & L1_SUP_FRAME) | (((pa >> 32) & 0xf) << 20) | L1_S_PROT(PTE_KERNEL, - VM_PROT_READ|VM_PROT_WRITE) | L1_S_DOM(PMAP_DOMAIN_KERNEL); + VM_PROT_READ|VM_PROT_WRITE|VM_PROT_EXECUTE) | + L1_S_DOM(PMAP_DOMAIN_KERNEL); struct l1_ttable *l1; vm_offset_t va0, va_end; @@ -2092,7 +2333,8 @@ void pmap_kenter_section(vm_offset_t va, vm_offset_t pa, int flags) { pd_entry_t pd = L1_S_PROTO | pa | L1_S_PROT(PTE_KERNEL, - VM_PROT_READ|VM_PROT_WRITE) | L1_S_DOM(PMAP_DOMAIN_KERNEL); + VM_PROT_READ|VM_PROT_WRITE|VM_PROT_EXECUTE) | L1_S_REF | + L1_S_DOM(PMAP_DOMAIN_KERNEL); struct l1_ttable *l1; KASSERT(((va | pa) & L1_S_OFFSET) == 0, @@ -2327,9 +2569,11 @@ pmap_is_prefaultable(pmap_t pmap, vm_off if (!pmap_get_pde_pte(pmap, addr, &pdep, &ptep)) return (FALSE); - KASSERT(ptep != NULL, ("Valid mapping but no pte ?")); - if (*ptep == 0) - return (TRUE); + KASSERT((pdep != NULL && (l1pte_section_p(*pdep) || ptep != NULL)), + ("Valid mapping but no pte ?")); + if (*pdep != 0 && !l1pte_section_p(*pdep)) + if (*ptep == 0) + return (TRUE); return (FALSE); } @@ -2398,6 +2642,7 @@ pmap_get_pde_pte(pmap_t pmap, vm_offset_ void pmap_remove_all(vm_page_t m) { + struct md_page *pvh; pv_entry_t pv; pmap_t pmap; pt_entry_t *ptep; @@ -2406,12 +2651,23 @@ pmap_remove_all(vm_page_t m) pmap_t curpmap; u_int is_exec = 0; - KASSERT((m->flags & PG_FICTITIOUS) == 0, - ("pmap_remove_all: page %p is fictitious", m)); - - if (TAILQ_EMPTY(&m->md.pv_list)) - return; + KASSERT((m->oflags & VPO_UNMANAGED) == 0, + ("pmap_remove_all: page %p is not managed", m)); rw_wlock(&pvh_global_lock); + if ((m->flags & PG_FICTITIOUS) != 0) + goto small_mappings; + pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m)); + while ((pv = TAILQ_FIRST(&pvh->pv_list)) != NULL) { + pmap = PV_PMAP(pv); + PMAP_LOCK(pmap); + pd_entry_t *pl1pd; + pl1pd = &pmap->pm_l1->l1_kva[L1_IDX(pv->pv_va)]; + KASSERT((*pl1pd & L1_TYPE_MASK) == L1_S_PROTO, + ("pmap_remove_all: valid section mapping expected")); + (void)pmap_demote_section(pmap, pv->pv_va); + PMAP_UNLOCK(pmap); + } +small_mappings: curpmap = vmspace_pmap(curproc->p_vmspace); while ((pv = TAILQ_FIRST(&m->md.pv_list)) != NULL) { pmap = PV_PMAP(pv); @@ -2513,6 +2769,9 @@ void pmap_protect(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot) { struct l2_bucket *l2b; + struct md_page *pvh; + struct pv_entry *pve; + pd_entry_t *pl1pd, l1pd; pt_entry_t *ptep, pte; vm_offset_t next_bucket; u_int is_exec, is_refd; @@ -2544,9 +2803,47 @@ pmap_protect(pmap_t pmap, vm_offset_t sv while (sva < eva) { next_bucket = L2_NEXT_BUCKET(sva); + /* + * Check for large page. + */ + pl1pd = &pmap->pm_l1->l1_kva[L1_IDX(sva)]; + l1pd = *pl1pd; + if ((l1pd & L1_TYPE_MASK) == L1_S_PROTO) { + KASSERT(pmap != pmap_kernel(), + ("pmap_protect: trying to modify " + "kernel section protections")); + /* + * Are we protecting the entire large page? If not, + * demote the mapping and fall through. + */ + if (sva + L1_S_SIZE == L2_NEXT_BUCKET(sva) && + eva >= L2_NEXT_BUCKET(sva)) { + l1pd &= ~(L1_S_PROT_MASK | L1_S_XN); + if (!(prot & VM_PROT_EXECUTE)) + *pl1pd |= L1_S_XN; + /* + * At this point we are always setting + * write-protect bit. + */ + l1pd |= L1_S_APX; + /* All managed superpages are user pages. */ + l1pd |= L1_S_PROT_U; + *pl1pd = l1pd; + PTE_SYNC(pl1pd); + pvh = pa_to_pvh(l1pd & L1_S_FRAME); + pve = pmap_find_pv(pvh, pmap, + trunc_1mpage(sva)); + pve->pv_flags &= ~PVF_WRITE; + sva = next_bucket; + continue; + } else if (!pmap_demote_section(pmap, sva)) { + /* The large page mapping was destroyed. */ + sva = next_bucket; + continue; + } + } if (next_bucket > eva) next_bucket = eva; - l2b = pmap_get_l2_bucket(pmap, sva); if (l2b == NULL) { sva = next_bucket; @@ -2632,6 +2929,7 @@ pmap_enter_locked(pmap_t pmap, vm_offset struct l2_bucket *l2b = NULL; struct vm_page *om; struct pv_entry *pve = NULL; + pd_entry_t *pl1pd, l1pd; pt_entry_t *ptep, npte, opte; u_int nflags; u_int is_exec, is_refd; @@ -2650,6 +2948,10 @@ pmap_enter_locked(pmap_t pmap, vm_offset pa = VM_PAGE_TO_PHYS(m); } + pl1pd = &pmap->pm_l1->l1_kva[L1_IDX(va)]; + if ((*pl1pd & L1_TYPE_MASK) == L1_S_PROTO) + panic("pmap_enter_locked: attempt pmap_enter_on 1MB page"); + user = 0; /* * Make sure userland mappings get the right permissions @@ -2824,9 +3126,6 @@ validate: * L1 entry to avoid taking another * page/domain fault. */ - pd_entry_t *pl1pd, l1pd; - - pl1pd = &pmap->pm_l1->l1_kva[L1_IDX(va)]; l1pd = l2b->l2b_phys | L1_C_DOM(pmap->pm_domain) | L1_C_PROTO; if (*pl1pd != l1pd) { @@ -2844,6 +3143,14 @@ validate: if ((pmap != pmap_kernel()) && (pmap == &curproc->p_vmspace->vm_pmap)) cpu_icache_sync_range(va, PAGE_SIZE); + /* + * If both the l2b_occupancy and the reservation are fully + * populated, then attempt promotion. + */ + if ((l2b->l2b_occupancy == L2_PTE_NUM_TOTAL) && + sp_enabled && (m->flags & PG_FICTITIOUS) == 0 && + vm_reserv_level_iffullpop(m) == 0) + pmap_promote_section(pmap, va); } /* @@ -2862,6 +3169,7 @@ void pmap_enter_object(pmap_t pmap, vm_offset_t start, vm_offset_t end, vm_page_t m_start, vm_prot_t prot) { + vm_offset_t va; vm_page_t m; vm_pindex_t diff, psize; vm_prot_t access; @@ -2874,8 +3182,15 @@ pmap_enter_object(pmap_t pmap, vm_offset rw_wlock(&pvh_global_lock); PMAP_LOCK(pmap); while (m != NULL && (diff = m->pindex - m_start->pindex) < psize) { - pmap_enter_locked(pmap, start + ptoa(diff), access, m, prot, - FALSE, M_NOWAIT); + va = start + ptoa(diff); + if ((va & L1_S_OFFSET) == 0 && L2_NEXT_BUCKET(va) <= end && + (VM_PAGE_TO_PHYS(m) & L1_S_OFFSET) == 0 && + sp_enabled && vm_reserv_level_iffullpop(m) == 0 && + pmap_enter_section(pmap, va, m, prot)) + m = &m[L1_S_SIZE / PAGE_SIZE - 1]; + else + pmap_enter_locked(pmap, va, access, m, prot, + FALSE, M_NOWAIT); m = TAILQ_NEXT(m, listq); } PMAP_UNLOCK(pmap); @@ -2915,11 +3230,32 @@ void pmap_change_wiring(pmap_t pmap, vm_offset_t va, boolean_t wired) { struct l2_bucket *l2b; + struct md_page *pvh; + struct pv_entry *pve; + pd_entry_t *pl1pd, l1pd; pt_entry_t *ptep, pte; vm_page_t m; rw_wlock(&pvh_global_lock); PMAP_LOCK(pmap); + pl1pd = &pmap->pm_l1->l1_kva[L1_IDX(va)]; + l1pd = *pl1pd; + if ((l1pd & L1_TYPE_MASK) == L1_S_PROTO) { + m = PHYS_TO_VM_PAGE(l1pd & L1_S_FRAME); + KASSERT((m != NULL) && ((m->oflags & VPO_UNMANAGED) == 0), + ("pmap_change_wiring: unmanaged superpage should not " + "be changed")); + KASSERT(pmap != pmap_kernel(), + ("pmap_change_wiring: managed kernel superpage " + "should not exist")); + pvh = pa_to_pvh(l1pd & L1_S_FRAME); + pve = pmap_find_pv(pvh, pmap, trunc_1mpage(va)); + if (!wired != ((pve->pv_flags & PVF_WIRED) == 0)) { + if (!pmap_demote_section(pmap, va)) + panic("pmap_change_wiring: demotion failed"); + } else + goto out; + } l2b = pmap_get_l2_bucket(pmap, va); KASSERT(l2b, ("No l2b bucket in pmap_change_wiring")); ptep = &l2b->l2b_kva[l2pte_index(va)]; @@ -2928,6 +3264,7 @@ pmap_change_wiring(pmap_t pmap, vm_offse if (m != NULL) pmap_modify_pv(m, pmap, va, PVF_WIRED, wired == TRUE ? PVF_WIRED : 0); +out: rw_wunlock(&pvh_global_lock); PMAP_UNLOCK(pmap); } @@ -3034,10 +3371,6 @@ pmap_extract_and_hold(pmap_t pmap, vm_of retry: l1pd = pmap->pm_l1->l1_kva[l1idx]; if (l1pte_section_p(l1pd)) { - /* - * These should only happen for pmap_kernel() - */ - KASSERT(pmap == pmap_kernel(), ("huh")); /* XXX: what to do about the bits > 32 ? */ if (l1pd & L1_S_SUPERSEC) pa = (l1pd & L1_SUP_FRAME) | (va & L1_SUP_OFFSET); @@ -3122,6 +3455,520 @@ pmap_pinit(pmap_t pmap) /*************************************************** + * Superpage management routines. + ***************************************************/ + +static PMAP_INLINE struct pv_entry * +pmap_pvh_remove(struct md_page *pvh, pmap_t pmap, vm_offset_t va) +{ + pv_entry_t pv; + + rw_assert(&pvh_global_lock, RA_WLOCKED); + + pv = pmap_find_pv(pvh, pmap, va); + if (pv != NULL) + TAILQ_REMOVE(&pvh->pv_list, pv, pv_list); + + return (pv); +} + +static void +pmap_pvh_free(struct md_page *pvh, pmap_t pmap, vm_offset_t va) +{ + pv_entry_t pv; + + pv = pmap_pvh_remove(pvh, pmap, va); + KASSERT(pv != NULL, ("pmap_pvh_free: pv not found")); + pmap_free_pv_entry(pmap, pv); +} + +static boolean_t +pmap_pv_insert_section(pmap_t pmap, vm_offset_t va, vm_paddr_t pa) +{ + struct md_page *pvh; + pv_entry_t pv; + + rw_assert(&pvh_global_lock, RA_WLOCKED); + if (pv_entry_count < pv_entry_high_water && + (pv = pmap_get_pv_entry(pmap, TRUE)) != NULL) { + pv->pv_va = va; + pvh = pa_to_pvh(pa); + TAILQ_INSERT_TAIL(&pvh->pv_list, pv, pv_list); + return (TRUE); + } else + return (FALSE); +} + +/* + * Create the pv entries for each of the pages within a superpage. + */ +static void +pmap_pv_demote_section(pmap_t pmap, vm_offset_t va, vm_paddr_t pa) +{ + struct md_page *pvh; + pv_entry_t pve, pv; + vm_offset_t va_last; + vm_page_t m; + + rw_assert(&pvh_global_lock, RA_WLOCKED); + KASSERT((pa & L1_S_OFFSET) == 0, + ("pmap_pv_demote_section: pa is not 1mpage aligned")); + + /* + * Transfer the 1mpage's pv entry for this mapping to the first + * page's pv list. + */ + pvh = pa_to_pvh(pa); + va = trunc_1mpage(va); + pv = pmap_pvh_remove(pvh, pmap, va); + KASSERT(pv != NULL, ("pmap_pv_demote_section: pv not found")); + m = PHYS_TO_VM_PAGE(pa); + TAILQ_INSERT_HEAD(&m->md.pv_list, pv, pv_list); + /* Instantiate the remaining pv entries. */ + va_last = L2_NEXT_BUCKET(va) - PAGE_SIZE; + do { + m++; + KASSERT((m->oflags & VPO_UNMANAGED) == 0, + ("pmap_pv_demote_section: page %p is not managed", m)); + va += PAGE_SIZE; + pve = pmap_get_pv_entry(pmap, FALSE); + pmap_enter_pv(m, pve, pmap, va, pv->pv_flags); + } while (va < va_last); +} + +static void +pmap_pv_promote_section(pmap_t pmap, vm_offset_t va, vm_paddr_t pa) +{ + struct md_page *pvh; + pv_entry_t pv; + vm_offset_t va_last; + vm_page_t m; + + rw_assert(&pvh_global_lock, RA_WLOCKED); + KASSERT((pa & L1_S_OFFSET) == 0, + ("pmap_pv_promote_section: pa is not 1mpage aligned")); + + /* + * Transfer the first page's pv entry for this mapping to the + * 1mpage's pv list. Aside from avoiding the cost of a call + * to get_pv_entry(), a transfer avoids the possibility that + * get_pv_entry() calls pmap_pv_reclaim() and that pmap_pv_reclaim() + * removes one of the mappings that is being promoted. + */ + m = PHYS_TO_VM_PAGE(pa); + va = trunc_1mpage(va); + pv = pmap_pvh_remove(&m->md, pmap, va); + KASSERT(pv != NULL, ("pmap_pv_promote_section: pv not found")); + pvh = pa_to_pvh(pa); + TAILQ_INSERT_TAIL(&pvh->pv_list, pv, pv_list); + /* Free the remaining pv entries in the newly mapped section pages */ + va_last = L2_NEXT_BUCKET(va) - PAGE_SIZE; + do { + m++; + va += PAGE_SIZE; + /* + * Don't care the flags, first pv contains sufficient + * information for all of the pages so nothing is really lost. + */ + pmap_pvh_free(&m->md, pmap, va); + } while (va < va_last); +} + +/* + * Tries to create a 1MB page mapping. Returns TRUE if successful and + * FALSE otherwise. Fails if (1) page is unmanageg, kernel pmap or vectors + * page, (2) a mapping already exists at the specified virtual address, or + * (3) a pv entry cannot be allocated without reclaiming another pv entry. + */ +static boolean_t +pmap_enter_section(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot) +{ + pd_entry_t *pl1pd; + vm_offset_t pa; + struct l2_bucket *l2b; + + rw_assert(&pvh_global_lock, RA_WLOCKED); + PMAP_ASSERT_LOCKED(pmap); + + /* Skip kernel, vectors page and unmanaged mappings */ + if ((pmap == pmap_kernel()) || (L1_IDX(va) == L1_IDX(vector_page)) || + ((m->oflags & VPO_UNMANAGED) != 0)) { + CTR2(KTR_PMAP, "pmap_enter_section: failure for va %#lx" + " in pmap %p", va, pmap); + return (FALSE); *** DIFF OUTPUT TRUNCATED AT 1000 LINES *** From owner-svn-src-projects@FreeBSD.ORG Mon Aug 26 18:27:58 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 233A7DF7; Mon, 26 Aug 2013 18:27:58 +0000 (UTC) (envelope-from jhb@freebsd.org) Received: from bigwig.baldwin.cx (bigwig.baldwin.cx [IPv6:2001:470:1f11:75::1]) (using TLSv1 with cipher ADH-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id E39B82641; Mon, 26 Aug 2013 18:27:57 +0000 (UTC) Received: from jhbbsd.localnet (unknown [38.105.238.108]) by bigwig.baldwin.cx (Postfix) with ESMTPSA id B1D0EB962; Mon, 26 Aug 2013 14:27:56 -0400 (EDT) From: John Baldwin To: Alexander Motin Subject: Re: svn commit: r254846 - projects/camlock/sys/cddl/contrib/opensolaris/uts/common/fs/zfs Date: Mon, 26 Aug 2013 14:25:34 -0400 User-Agent: KMail/1.13.5 (FreeBSD/8.2-CBSD-20110714-p28; KDE/4.5.5; amd64; ; ) References: <201308251121.r7PBLA3v033536@svn.freebsd.org> <521A06A2.7050807@FreeBSD.org> In-Reply-To: <521A06A2.7050807@FreeBSD.org> MIME-Version: 1.0 Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Message-Id: <201308261425.34743.jhb@freebsd.org> X-Greylist: Sender succeeded SMTP AUTH, not delayed by milter-greylist-4.2.7 (bigwig.baldwin.cx); Mon, 26 Aug 2013 14:27:56 -0400 (EDT) Cc: svn-src-projects@freebsd.org, Adrian Chadd , "src-committers@freebsd.org" X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 26 Aug 2013 18:27:58 -0000 On Sunday, August 25, 2013 9:29:06 am Alexander Motin wrote: > On 25.08.2013 15:48, Adrian Chadd wrote: > > Surely there's a better way to check whether a thread can sleep besides > > digging around in curthread->td_no_sleeping ? What about adding an > > accessor macro along side THREAD_SLEEPING_OK and THREAD_NO_SLEEPING ? > > That sounds good to me. I was also surprised such macros are not there > yet when found some code doing these checks just the same way as I did. It was never intended to be public, only as a debugging aid for assertions. :( I had hoped that the calling code would know when it was in an ithread or not and call different routines as needed (i.e. that the programmer would intentionally think about the context they were in). Perhaps this is not realistic? Are you really queueing new I/O from ithreads and/or timers? -- John Baldwin From owner-svn-src-projects@FreeBSD.ORG Mon Aug 26 18:29:53 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 20CDD312; Mon, 26 Aug 2013 18:29:53 +0000 (UTC) (envelope-from markm@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 0D6B12686; Mon, 26 Aug 2013 18:29:53 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id r7QITrDC041602; Mon, 26 Aug 2013 18:29:53 GMT (envelope-from markm@svn.freebsd.org) Received: (from markm@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id r7QITpcW041592; Mon, 26 Aug 2013 18:29:51 GMT (envelope-from markm@svn.freebsd.org) Message-Id: <201308261829.r7QITpcW041592@svn.freebsd.org> From: Mark Murray Date: Mon, 26 Aug 2013 18:29:51 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r254927 - projects/random_number_generator/sys/dev/random X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 26 Aug 2013 18:29:53 -0000 Author: markm Date: Mon Aug 26 18:29:51 2013 New Revision: 254927 URL: http://svnweb.freebsd.org/changeset/base/254927 Log: Snapshot of current work; 1) Clean up namespace; only use "Yarrow" where it is Yarrow-specific or close enough to the Yarrow algorithm. For the rest use a neutral name. 2) Tidy up headers; put private stuff in private places. More could be done here. 3) Streamline the hashing/encryption; no need for a 256-bit counter; 128 bits will last for long enough. There are bits of debug code lying around; these will be removed at a later stage. Modified: projects/random_number_generator/sys/dev/random/harvest.c projects/random_number_generator/sys/dev/random/hash.c projects/random_number_generator/sys/dev/random/hash.h projects/random_number_generator/sys/dev/random/randomdev_soft.c projects/random_number_generator/sys/dev/random/randomdev_soft.h projects/random_number_generator/sys/dev/random/yarrow.c projects/random_number_generator/sys/dev/random/yarrow.h Modified: projects/random_number_generator/sys/dev/random/harvest.c ============================================================================== --- projects/random_number_generator/sys/dev/random/harvest.c Mon Aug 26 18:21:04 2013 (r254926) +++ projects/random_number_generator/sys/dev/random/harvest.c Mon Aug 26 18:29:51 2013 (r254927) @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2000-2004 Mark R V Murray + * Copyright (c) 2000-2013 Mark R V Murray * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -60,7 +60,7 @@ static int (*read_func)(void *, int) = r /* Initialise the harvester at load time */ void -random_yarrow_init_harvester(void (*reaper)(u_int64_t, const void *, u_int, +randomdev_init_harvester(void (*reaper)(u_int64_t, const void *, u_int, u_int, u_int, enum esource), int (*reader)(void *, int)) { reap_func = reaper; @@ -69,7 +69,7 @@ random_yarrow_init_harvester(void (*reap /* Deinitialise the harvester at unload time */ void -random_yarrow_deinit_harvester(void) +randomdev_deinit_harvester(void) { reap_func = NULL; read_func = read_random_phony; Modified: projects/random_number_generator/sys/dev/random/hash.c ============================================================================== --- projects/random_number_generator/sys/dev/random/hash.c Mon Aug 26 18:21:04 2013 (r254926) +++ projects/random_number_generator/sys/dev/random/hash.c Mon Aug 26 18:29:51 2013 (r254927) @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2000-2004 Mark R V Murray + * Copyright (c) 2000-2013 Mark R V Murray * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -36,46 +36,46 @@ __FBSDID("$FreeBSD$"); #include -/* initialise the hash */ +/* Initialise the hash */ void -yarrow_hash_init(struct yarrowhash *context) +randomdev_hash_init(struct randomdev_hash *context) { SHA256_Init(&context->sha); } -/* iterate the hash */ +/* Iterate the hash */ void -yarrow_hash_iterate(struct yarrowhash *context, void *data, size_t size) +randomdev_hash_iterate(struct randomdev_hash *context, void *data, size_t size) { SHA256_Update(&context->sha, data, size); } -/* Conclude by returning the hash in the supplied /buf/ which must be +/* Conclude by returning the hash in the supplied <*buf> which must be * KEYSIZE bytes long. */ void -yarrow_hash_finish(struct yarrowhash *context, void *buf) +randomdev_hash_finish(struct randomdev_hash *context, void *buf) { SHA256_Final(buf, &context->sha); } /* Initialise the encryption routine by setting up the key schedule - * from the supplied /data/ which must be KEYSIZE bytes of binary - * data. + * from the supplied <*data> which must be KEYSIZE bytes of binary + * data. Use CBC mode for better avalanche. */ void -yarrow_encrypt_init(struct yarrowkey *context, void *data) +randomdev_encrypt_init(struct randomdev_key *context, void *data) { rijndael_cipherInit(&context->cipher, MODE_CBC, NULL); rijndael_makeKey(&context->key, DIR_ENCRYPT, KEYSIZE*8, data); } /* Encrypt the supplied data using the key schedule preset in the context. - * KEYSIZE bytes are encrypted from /d_in/ to /d_out/. + * bytes are encrypted from <*d_in> to <*d_out>. must be + * a multiple of BLOCKSIZE. */ void -yarrow_encrypt(struct yarrowkey *context, void *d_in, void *d_out) +randomdev_encrypt(struct randomdev_key *context, void *d_in, void *d_out, unsigned length) { - rijndael_blockEncrypt(&context->cipher, &context->key, d_in, - KEYSIZE*8, d_out); + rijndael_blockEncrypt(&context->cipher, &context->key, d_in, length*8, d_out); } Modified: projects/random_number_generator/sys/dev/random/hash.h ============================================================================== --- projects/random_number_generator/sys/dev/random/hash.h Mon Aug 26 18:21:04 2013 (r254926) +++ projects/random_number_generator/sys/dev/random/hash.h Mon Aug 26 18:29:51 2013 (r254927) @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2000-2004 Mark R V Murray + * Copyright (c) 2000-2013 Mark R V Murray * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -26,19 +26,20 @@ * $FreeBSD$ */ -#define KEYSIZE 32 /* (in bytes) 32 bytes == 256 bits */ +#define KEYSIZE 32 /* (in bytes) == 256 bits */ +#define BLOCKSIZE 16 /* (in bytes) == 128 bits */ -struct yarrowhash { /* Big! Make static! */ +struct randomdev_hash { /* Big! Make static! */ SHA256_CTX sha; }; -struct yarrowkey { /* Big! Make static! */ +struct randomdev_key { /* Big! Make static! */ keyInstance key; /* Key schedule */ cipherInstance cipher; /* Rijndael internal */ }; -void yarrow_hash_init(struct yarrowhash *); -void yarrow_hash_iterate(struct yarrowhash *, void *, size_t); -void yarrow_hash_finish(struct yarrowhash *, void *); -void yarrow_encrypt_init(struct yarrowkey *, void *); -void yarrow_encrypt(struct yarrowkey *context, void *, void *); +void randomdev_hash_init(struct randomdev_hash *); +void randomdev_hash_iterate(struct randomdev_hash *, void *, size_t); +void randomdev_hash_finish(struct randomdev_hash *, void *); +void randomdev_encrypt_init(struct randomdev_key *, void *); +void randomdev_encrypt(struct randomdev_key *context, void *, void *, unsigned); Modified: projects/random_number_generator/sys/dev/random/randomdev_soft.c ============================================================================== --- projects/random_number_generator/sys/dev/random/randomdev_soft.c Mon Aug 26 18:21:04 2013 (r254926) +++ projects/random_number_generator/sys/dev/random/randomdev_soft.c Mon Aug 26 18:29:51 2013 (r254927) @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2000-2009 Mark R V Murray + * Copyright (c) 2000-2013 Mark R V Murray * Copyright (c) 2004 Robert N. M. Watson * All rights reserved. * @@ -26,6 +26,12 @@ * */ +#if !defined(YARROW_RNG) && !defined(FORTUNA_RNG) +#define YARROW_RNG +#elif defined(YARROW_RNG) && defined(FORTUNA_RNG) +#error "Must define either YARROW_RNG or FORTUNA_RNG" +#endif + #include __FBSDID("$FreeBSD$"); @@ -54,30 +60,56 @@ __FBSDID("$FreeBSD$"); #include #include #include +#if defined(YARROW_RNG) +#include +#endif +#if defined(FORTUNA_RNG) +#include +#endif #define RANDOM_FIFO_MAX 256 /* How many events to queue up */ static void random_kthread(void *); -static void -random_harvest_internal(u_int64_t, const void *, u_int, +static void random_harvest_internal(u_int64_t, const void *, u_int, u_int, u_int, enum esource); -static int random_yarrow_poll(int event,struct thread *td); -static int random_yarrow_block(int flag); -static void random_yarrow_flush_reseed(void); +static int randomdev_poll(int event, struct thread *td); +static int randomdev_block(int flag); +static void randomdev_flush_reseed(void); -struct random_adaptor random_yarrow = { +#if defined(YARROW_RNG) +static struct random_adaptor random_context = { .ident = "Software, Yarrow", - .init = random_yarrow_init, - .deinit = random_yarrow_deinit, - .block = random_yarrow_block, + .init = randomdev_init, + .deinit = randomdev_deinit, + .block = randomdev_block, .read = random_yarrow_read, - .write = random_yarrow_write, - .poll = random_yarrow_poll, - .reseed = random_yarrow_flush_reseed, - .seeded = 1, + .write = randomdev_write, + .poll = randomdev_poll, + .reseed = randomdev_flush_reseed, + .seeded = 0, +}; +#define RANDOM_MODULE_NAME yarrow +#define RANDOM_CSPRNG_NAME "yarrow" +#endif + +#if defined(FORTUNA_RNG) +static struct random_adaptor random_context = { + .ident = "Software, Fortuna", + .init = randomdev_init, + .deinit = randomdev_deinit, + .block = randomdev_block, + .read = random_fortuna_read, + .write = randomdev_write, + .poll = randomdev_poll, + .reseed = randomdev_flush_reseed, + .seeded = 0, }; +#define RANDOM_MODULE_NAME fortuna +#define RANDOM_CSPRNG_NAME "fortuna" -MALLOC_DEFINE(M_ENTROPY, "entropy", "Entropy harvesting buffers"); +#endif + +MALLOC_DEFINE(M_ENTROPY, "entropy", "Entropy harvesting buffers for " RANDOM_CSPRNG_NAME); /* * The harvest mutex protects the consistency of the entropy fifos and @@ -116,16 +148,20 @@ random_check_boolean(SYSCTL_HANDLER_ARGS return sysctl_handle_int(oidp, oidp->oid_arg1, oidp->oid_arg2, req); } -/* ARGSUSED */ void -random_yarrow_init(void) +randomdev_init(void) { int error, i; struct harvest *np; struct sysctl_oid *random_sys_o, *random_sys_harvest_o; enum esource e; +#if defined(YARROW_RNG) random_yarrow_init_alg(&random_clist); +#endif +#if defined(FORTUNA_RNG) + random_fortuna_init_alg(&random_clist); +#endif random_sys_o = SYSCTL_ADD_NODE(&random_clist, SYSCTL_STATIC_CHILDREN(_kern_random), @@ -135,7 +171,7 @@ random_yarrow_init(void) SYSCTL_ADD_PROC(&random_clist, SYSCTL_CHILDREN(random_sys_o), OID_AUTO, "seeded", CTLTYPE_INT | CTLFLAG_RW, - &random_yarrow.seeded, 1, random_check_boolean, "I", + &random_context.seeded, 1, random_check_boolean, "I", "Seeded State"); random_sys_harvest_o = SYSCTL_ADD_NODE(&random_clist, @@ -156,13 +192,18 @@ random_yarrow_init(void) SYSCTL_ADD_PROC(&random_clist, SYSCTL_CHILDREN(random_sys_harvest_o), OID_AUTO, "interrupt", CTLTYPE_INT | CTLFLAG_RW, - &harvest.interrupt, 1, random_check_boolean, "I", + &harvest.interrupt, 0, random_check_boolean, "I", "Harvest IRQ entropy"); SYSCTL_ADD_PROC(&random_clist, SYSCTL_CHILDREN(random_sys_harvest_o), OID_AUTO, "swi", CTLTYPE_INT | CTLFLAG_RW, &harvest.swi, 0, random_check_boolean, "I", "Harvest SWI entropy"); + SYSCTL_ADD_PROC(&random_clist, + SYSCTL_CHILDREN(random_sys_harvest_o), + OID_AUTO, "namei", CTLTYPE_INT | CTLFLAG_RW, + &harvest.namei, 0, random_check_boolean, "I", + "Harvest namei cache entropy"); /* Initialise the harvest fifos */ STAILQ_INIT(&emptyfifo.head); @@ -180,24 +221,23 @@ random_yarrow_init(void) /* Start the hash/reseed thread */ error = kproc_create(random_kthread, NULL, - &random_kthread_proc, RFHIGHPID, 0, "yarrow"); + &random_kthread_proc, RFHIGHPID, 0, RANDOM_CSPRNG_NAME); if (error != 0) panic("Cannot create entropy maintenance thread."); /* Register the randomness harvesting routine */ - random_yarrow_init_harvester(random_harvest_internal, - random_yarrow_read); + randomdev_init_harvester(random_harvest_internal, + random_context.read); } -/* ARGSUSED */ void -random_yarrow_deinit(void) +randomdev_deinit(void) { struct harvest *np; enum esource e; /* Deregister the randomness harvesting routine */ - random_yarrow_deinit_harvester(); + randomdev_deinit_harvester(); /* * Command the hash/reseed thread to end and wait for it to finish @@ -219,7 +259,12 @@ random_yarrow_deinit(void) } } +#if defined(YARROW_RNG) random_yarrow_deinit_alg(); +#endif +#if defined(FORTUNA_RNG) + random_fortuna_deinit_alg(); +#endif mtx_destroy(&harvest_mtx); @@ -298,10 +343,7 @@ random_harvest_internal(u_int64_t someco { struct harvest *event; - KASSERT(origin == RANDOM_START || origin == RANDOM_WRITE || - origin == RANDOM_KEYBOARD || origin == RANDOM_MOUSE || - origin == RANDOM_NET || origin == RANDOM_INTERRUPT || - origin == RANDOM_PURE, + KASSERT(origin >= RANDOM_START && origin <= RANDOM_PURE, ("random_harvest_internal: origin %d invalid\n", origin)); /* Lockless read to avoid lock operations if fifo is full. */ @@ -311,12 +353,13 @@ random_harvest_internal(u_int64_t someco mtx_lock_spin(&harvest_mtx); /* - * Don't make the harvest queues too big - help to prevent low-grade + * Don't make the harvest queues too big - help to thwart low-grade * entropy swamping */ if (harvestfifo[origin].count < RANDOM_FIFO_MAX) { event = STAILQ_FIRST(&emptyfifo.head); if (event != NULL) { + count = MIN(count, HARVESTSIZE); /* Add the harvested data to the fifo */ STAILQ_REMOVE_HEAD(&emptyfifo.head, next); harvestfifo[origin].count++; @@ -326,10 +369,20 @@ random_harvest_internal(u_int64_t someco event->frac = frac; event->source = origin; - /* XXXX Come back and make this dynamic! */ - count = MIN(count, HARVESTSIZE); memcpy(event->entropy, entropy, count); +#if 1 + { + int i; + printf("Harvest:%16jX ", event->somecounter); + for (i = 0; i < event->size; i++) + printf("%02X", event->entropy[i]); + for (; i < 16; i++) + printf(" "); + printf(" %2d 0x%2X.%03X %02X\n", event->size, event->bits, event->frac, event->source); + } +#endif + STAILQ_INSERT_TAIL(&harvestfifo[origin].head, event, next); } @@ -338,7 +391,7 @@ random_harvest_internal(u_int64_t someco } void -random_yarrow_write(void *buf, int count) +randomdev_write(void *buf, int count) { int i; u_int chunk; @@ -357,46 +410,46 @@ random_yarrow_write(void *buf, int count } void -random_yarrow_unblock(void) +randomdev_unblock(void) { - if (!random_yarrow.seeded) { - random_yarrow.seeded = 1; - selwakeuppri(&random_yarrow.rsel, PUSER); - wakeup(&random_yarrow); + if (!random_context.seeded) { + random_context.seeded = 1; + selwakeuppri(&random_context.rsel, PUSER); + wakeup(&random_context); } (void)atomic_cmpset_int(&arc4rand_iniseed_state, ARC4_ENTR_NONE, ARC4_ENTR_HAVE); } static int -random_yarrow_poll(int events, struct thread *td) +randomdev_poll(int events, struct thread *td) { int revents = 0; mtx_lock(&random_reseed_mtx); - if (random_yarrow.seeded) + if (random_context.seeded) revents = events & (POLLIN | POLLRDNORM); else - selrecord(td, &random_yarrow.rsel); + selrecord(td, &random_context.rsel); mtx_unlock(&random_reseed_mtx); return revents; } static int -random_yarrow_block(int flag) +randomdev_block(int flag) { int error = 0; mtx_lock(&random_reseed_mtx); /* Blocking logic */ - while (!random_yarrow.seeded && !error) { + while (!random_context.seeded && !error) { if (flag & O_NONBLOCK) error = EWOULDBLOCK; else { printf("Entropy device is blocking.\n"); - error = msleep(&random_yarrow, + error = msleep(&random_context, &random_reseed_mtx, PUSER | PCATCH, "block", 0); } @@ -408,23 +461,28 @@ random_yarrow_block(int flag) /* Helper routine to perform explicit reseeds */ static void -random_yarrow_flush_reseed(void) +randomdev_flush_reseed(void) { /* Command a entropy queue flush and wait for it to finish */ random_kthread_control = 1; while (random_kthread_control) pause("-", hz / 10); +#if defined(YARROW_RNG) random_yarrow_reseed(); +#endif +#if defined(FORTUNA_RNG) + random_fortuna_reseed(); +#endif } static int -yarrow_modevent(module_t mod, int type, void *unused) +randomdev_modevent(module_t mod, int type, void *unused) { switch (type) { case MOD_LOAD: - random_adaptor_register("yarrow", &random_yarrow); + random_adaptor_register(RANDOM_CSPRNG_NAME, &random_context); /* * For statically built kernels that contain both device * random and options PADLOCK_RNG/RDRAND_RNG/etc.., @@ -437,11 +495,11 @@ yarrow_modevent(module_t mod, int type, * (by dependency). This event handler is there to delay * creation of /dev/{u,}random and attachment of this *_rng.ko. */ - EVENTHANDLER_INVOKE(random_adaptor_attach, &random_yarrow); + EVENTHANDLER_INVOKE(random_adaptor_attach, &random_context); return (0); } return (EINVAL); } -RANDOM_ADAPTOR_MODULE(yarrow, yarrow_modevent, 1); +RANDOM_ADAPTOR_MODULE(RANDOM_MODULE_NAME, randomdev_modevent, 1); Modified: projects/random_number_generator/sys/dev/random/randomdev_soft.h ============================================================================== --- projects/random_number_generator/sys/dev/random/randomdev_soft.h Mon Aug 26 18:21:04 2013 (r254926) +++ projects/random_number_generator/sys/dev/random/randomdev_soft.h Mon Aug 26 18:29:51 2013 (r254927) @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2000-2004 Mark R V Murray + * Copyright (c) 2000-2013 Mark R V Murray * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -35,9 +35,6 @@ * an enum in sys/random.h */ -/* Cryptographic block size in bits */ -#define BLOCKSIZE 256 - /* The ring size _MUST_ be a power of 2 */ #define HARVEST_RING_SIZE 1024 /* harvest ring buffer size */ #define HARVEST_RING_MASK (HARVEST_RING_SIZE - 1) @@ -51,34 +48,28 @@ MALLOC_DECLARE(M_ENTROPY); */ struct harvest { uintmax_t somecounter; /* fast counter for clock jitter */ - u_char entropy[HARVESTSIZE]; /* the harvested entropy */ + uint8_t entropy[HARVESTSIZE]; /* the harvested entropy */ u_int size, bits, frac; /* stats about the entropy */ enum esource source; /* stats about the entropy */ STAILQ_ENTRY(harvest) next; /* next item on the list */ }; -void random_yarrow_init(void); -void random_yarrow_deinit(void); +void randomdev_init(void); +void randomdev_deinit(void); -int random_yarrow_read(void *, int); -void random_yarrow_write(void *, int); +void randomdev_write(void *, int); -void random_yarrow_init_harvester(void (*)(u_int64_t, const void *, u_int, +void randomdev_init_harvester(void (*)(u_int64_t, const void *, u_int, u_int, u_int, enum esource), int (*)(void *, int)); -void random_yarrow_deinit_harvester(void); +void randomdev_deinit_harvester(void); void random_set_wakeup_exit(void *); void random_process_event(struct harvest *event); -void random_yarrow_reseed(void); -void random_yarrow_unblock(void); - -void random_yarrow_init_alg(struct sysctl_ctx_list *); -void random_yarrow_deinit_alg(void); +void randomdev_unblock(void); -extern struct random_adaptor random_yarrow; extern struct mtx random_reseed_mtx; -/* If this was c++, this would be a template */ +/* If this was C++, the macro below would be a template */ #define RANDOM_CHECK_UINT(name, min, max) \ static int \ random_check_uint_##name(SYSCTL_HANDLER_ARGS) \ Modified: projects/random_number_generator/sys/dev/random/yarrow.c ============================================================================== --- projects/random_number_generator/sys/dev/random/yarrow.c Mon Aug 26 18:21:04 2013 (r254926) +++ projects/random_number_generator/sys/dev/random/yarrow.c Mon Aug 26 18:29:51 2013 (r254927) @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2000-2004 Mark R V Murray + * Copyright (c) 2000-2013 Mark R V Murray * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -45,21 +45,68 @@ __FBSDID("$FreeBSD$"); #include #include +#define TIMEBIN 16 /* max value for Pt/t */ + +#define FAST 0 +#define SLOW 1 + +/* This is the beastie that needs protecting. It contains all of the + * state that we are excited about. + * Exactly one is instantiated. + */ +static struct random_state { + union { + uint8_t byte[BLOCKSIZE]; + uint64_t qword[BLOCKSIZE/sizeof(uint64_t)]; + } counter; /* C */ + struct randomdev_key key; /* K */ + u_int gengateinterval; /* Pg */ + u_int bins; /* Pt/t */ + u_int outputblocks; /* count output blocks for gates */ + u_int slowoverthresh; /* slow pool overthreshhold reseed count */ + struct pool { + struct source { + u_int bits; /* estimated bits of entropy */ + u_int frac; /* fractional bits of entropy + (given as 1024/n) */ + } source[ENTROPYSOURCE]; + u_int thresh; /* pool reseed threshhold */ + struct randomdev_hash hash; /* accumulated entropy */ + } pool[2]; /* pool[0] is fast, pool[1] is slow */ + u_int which; /* toggle - sets the current insertion pool */ +} random_state; + RANDOM_CHECK_UINT(gengateinterval, 4, 64); RANDOM_CHECK_UINT(bins, 2, 16); -RANDOM_CHECK_UINT(fastthresh, BLOCKSIZE/4, BLOCKSIZE); -RANDOM_CHECK_UINT(slowthresh, BLOCKSIZE/4, BLOCKSIZE); +RANDOM_CHECK_UINT(fastthresh, (BLOCKSIZE*8)/4, (BLOCKSIZE*8)); /* Bit counts */ +RANDOM_CHECK_UINT(slowthresh, (BLOCKSIZE*8)/4, (BLOCKSIZE*8)); /* Bit counts */ RANDOM_CHECK_UINT(slowoverthresh, 1, 5); -/* Structure holding the entropy state */ -static struct random_state random_state; - static void generator_gate(void); static void reseed(u_int); /* The reseed thread mutex */ struct mtx random_reseed_mtx; +/* 128-bit C = 0 */ +/* Nothing to see here, folks, just an ugly mess. */ +static void +clear_counter(void) +{ + random_state.counter.qword[0] = 0UL; + random_state.counter.qword[1] = 0UL; +} + +/* 128-bit C = C + 1 */ +/* Nothing to see here, folks, just an ugly mess. */ +static void +increment_counter(void) +{ + random_state.counter.qword[0]++; + if (!random_state.counter.qword[0]) + random_state.counter.qword[1]++; +} + /* Process a single stochastic event off the harvest queue */ void random_process_event(struct harvest *event) @@ -71,13 +118,13 @@ random_process_event(struct harvest *eve /* Unpack the event into the appropriate source accumulator */ pl = random_state.which; source = &random_state.pool[pl].source[event->source]; - yarrow_hash_iterate(&random_state.pool[pl].hash, event->entropy, + randomdev_hash_iterate(&random_state.pool[pl].hash, event->entropy, sizeof(event->entropy)); - yarrow_hash_iterate(&random_state.pool[pl].hash, &event->somecounter, + randomdev_hash_iterate(&random_state.pool[pl].hash, &event->somecounter, sizeof(event->somecounter)); source->frac += event->frac; - source->bits += event->bits + source->frac/1024; - source->frac %= 1024; + source->bits += event->bits + (source->frac >> 12); /* bits + frac/0x1000 */ + source->frac &= 0xFFF; /* Keep the fractional bits */ /* Count the over-threshold sources in each pool */ for (pl = 0; pl < 2; pl++) { @@ -132,14 +179,14 @@ random_yarrow_init_alg(struct sysctl_ctx SYSCTL_ADD_PROC(clist, SYSCTL_CHILDREN(random_yarrow_o), OID_AUTO, "fastthresh", CTLTYPE_INT|CTLFLAG_RW, - &random_state.pool[0].thresh, (3*BLOCKSIZE)/4, + &random_state.pool[0].thresh, (3*(BLOCKSIZE*8))/4, random_check_uint_fastthresh, "I", "Fast reseed threshold"); SYSCTL_ADD_PROC(clist, SYSCTL_CHILDREN(random_yarrow_o), OID_AUTO, "slowthresh", CTLTYPE_INT|CTLFLAG_RW, - &random_state.pool[1].thresh, BLOCKSIZE, + &random_state.pool[1].thresh, (BLOCKSIZE*8), random_check_uint_slowthresh, "I", "Slow reseed threshold"); @@ -152,21 +199,20 @@ random_yarrow_init_alg(struct sysctl_ctx random_state.gengateinterval = 10; random_state.bins = 10; - random_state.pool[0].thresh = (3*BLOCKSIZE)/4; - random_state.pool[1].thresh = BLOCKSIZE; + random_state.pool[0].thresh = (3*(BLOCKSIZE*8))/4; + random_state.pool[1].thresh = (BLOCKSIZE*8); random_state.slowoverthresh = 2; random_state.which = FAST; /* Initialise the fast and slow entropy pools */ for (i = 0; i < 2; i++) - yarrow_hash_init(&random_state.pool[i].hash); + randomdev_hash_init(&random_state.pool[i].hash); /* Clear the counter */ - for (i = 0; i < 4; i++) - random_state.counter[i] = 0; + clear_counter(); /* Set up a lock for the reseed process */ - mtx_init(&random_reseed_mtx, "random reseed", NULL, MTX_DEF); + mtx_init(&random_reseed_mtx, "Yarrow reseed", NULL, MTX_DEF); } void @@ -181,10 +227,10 @@ reseed(u_int fastslow) /* Interrupt-context stack is a limited resource; make large * structures static. */ - static u_char v[TIMEBIN][KEYSIZE]; /* v[i] */ - static struct yarrowhash context; - u_char hash[KEYSIZE]; /* h' */ - u_char temp[KEYSIZE]; + static uint8_t v[TIMEBIN][KEYSIZE]; /* v[i] */ + static struct randomdev_hash context; + uint8_t hash[KEYSIZE]; /* h' */ + uint8_t temp[KEYSIZE]; u_int i; enum esource j; @@ -193,15 +239,15 @@ reseed(u_int fastslow) /* 1. Hash the accumulated entropy into v[0] */ - yarrow_hash_init(&context); + randomdev_hash_init(&context); /* Feed the slow pool hash in if slow */ if (fastslow == SLOW) - yarrow_hash_iterate(&context, + randomdev_hash_iterate(&context, &random_state.pool[SLOW].hash, - sizeof(struct yarrowhash)); - yarrow_hash_iterate(&context, - &random_state.pool[FAST].hash, sizeof(struct yarrowhash)); - yarrow_hash_finish(&context, v[0]); + sizeof(struct randomdev_hash)); + randomdev_hash_iterate(&context, + &random_state.pool[FAST].hash, sizeof(struct randomdev_hash)); + randomdev_hash_finish(&context, v[0]); /* 2. Compute hash values for all v. _Supposed_ to be computationally * intensive. @@ -210,34 +256,33 @@ reseed(u_int fastslow) if (random_state.bins > TIMEBIN) random_state.bins = TIMEBIN; for (i = 1; i < random_state.bins; i++) { - yarrow_hash_init(&context); + randomdev_hash_init(&context); /* v[i] #= h(v[i - 1]) */ - yarrow_hash_iterate(&context, v[i - 1], KEYSIZE); + randomdev_hash_iterate(&context, v[i - 1], KEYSIZE); /* v[i] #= h(v[0]) */ - yarrow_hash_iterate(&context, v[0], KEYSIZE); + randomdev_hash_iterate(&context, v[0], KEYSIZE); /* v[i] #= h(i) */ - yarrow_hash_iterate(&context, &i, sizeof(u_int)); + randomdev_hash_iterate(&context, &i, sizeof(u_int)); /* Return the hashval */ - yarrow_hash_finish(&context, v[i]); + randomdev_hash_finish(&context, v[i]); } /* 3. Compute a new key; h' is the identity function here; * it is not being ignored! */ - yarrow_hash_init(&context); - yarrow_hash_iterate(&context, &random_state.key, KEYSIZE); + randomdev_hash_init(&context); + randomdev_hash_iterate(&context, &random_state.key, KEYSIZE); for (i = 1; i < random_state.bins; i++) - yarrow_hash_iterate(&context, &v[i], KEYSIZE); - yarrow_hash_finish(&context, temp); - yarrow_encrypt_init(&random_state.key, temp); + randomdev_hash_iterate(&context, &v[i], KEYSIZE); + randomdev_hash_finish(&context, temp); + randomdev_encrypt_init(&random_state.key, temp); /* 4. Recompute the counter */ - for (i = 0; i < 4; i++) - random_state.counter[i] = 0; - yarrow_encrypt(&random_state.key, random_state.counter, temp); - memcpy(random_state.counter, temp, sizeof(random_state.counter)); + clear_counter(); + randomdev_encrypt(&random_state.key, random_state.counter.byte, temp, BLOCKSIZE); + memcpy(random_state.counter.byte, temp, BLOCKSIZE); /* 5. Reset entropy estimate accumulators to zero */ @@ -258,7 +303,7 @@ reseed(u_int fastslow) /* XXX Not done here yet */ /* Unblock the device if it was blocked due to being unseeded */ - random_yarrow_unblock(); + randomdev_unblock(); /* Release the reseed mutex */ mtx_unlock(&random_reseed_mtx); @@ -270,7 +315,7 @@ random_yarrow_read(void *buf, int count) { static int cur = 0; static int gate = 1; - static u_char genval[KEYSIZE]; + static uint8_t genval[KEYSIZE]; size_t tomove; int i; int retval; @@ -283,16 +328,14 @@ random_yarrow_read(void *buf, int count) random_state.outputblocks = 0; gate = 0; } - if (count > 0 && (size_t)count >= sizeof(random_state.counter)) { + if (count > 0 && (size_t)count >= BLOCKSIZE) { retval = 0; - for (i = 0; i < count; i += (int)sizeof(random_state.counter)) { - random_state.counter[0]++; - yarrow_encrypt(&random_state.key, random_state.counter, - genval); - tomove = min(count - i, sizeof(random_state.counter)); + for (i = 0; i < count; i += BLOCKSIZE) { + increment_counter(); + randomdev_encrypt(&random_state.key, random_state.counter.byte, genval, BLOCKSIZE); + tomove = MIN(count - i, BLOCKSIZE); memcpy((char *)buf + i, genval, tomove); - if (++random_state.outputblocks >= - random_state.gengateinterval) { + if (++random_state.outputblocks >= random_state.gengateinterval) { generator_gate(); random_state.outputblocks = 0; } @@ -302,13 +345,11 @@ random_yarrow_read(void *buf, int count) } else { if (!cur) { - random_state.counter[0]++; - yarrow_encrypt(&random_state.key, random_state.counter, - genval); + increment_counter(); + randomdev_encrypt(&random_state.key, random_state.counter.byte, genval, BLOCKSIZE); memcpy(buf, genval, (size_t)count); - cur = (int)sizeof(random_state.counter) - count; - if (++random_state.outputblocks >= - random_state.gengateinterval) { + cur = BLOCKSIZE - count; + if (++random_state.outputblocks >= random_state.gengateinterval) { generator_gate(); random_state.outputblocks = 0; } @@ -316,9 +357,7 @@ random_yarrow_read(void *buf, int count) } else { retval = MIN(cur, count); - memcpy(buf, - &genval[(int)sizeof(random_state.counter) - cur], - (size_t)retval); + memcpy(buf, &genval[BLOCKSIZE - cur], (size_t)retval); cur -= retval; } } @@ -330,17 +369,15 @@ static void generator_gate(void) { u_int i; - u_char temp[KEYSIZE]; + uint8_t temp[KEYSIZE]; - for (i = 0; i < KEYSIZE; i += sizeof(random_state.counter)) { - random_state.counter[0]++; - yarrow_encrypt(&random_state.key, random_state.counter, - &(temp[i])); + for (i = 0; i < KEYSIZE; i += BLOCKSIZE) { + increment_counter(); + randomdev_encrypt(&random_state.key, random_state.counter.byte, temp + i, BLOCKSIZE); } - yarrow_encrypt_init(&random_state.key, temp); + randomdev_encrypt_init(&random_state.key, temp); memset((void *)temp, 0, KEYSIZE); - } /* Helper routine to perform explicit reseeds */ Modified: projects/random_number_generator/sys/dev/random/yarrow.h ============================================================================== --- projects/random_number_generator/sys/dev/random/yarrow.h Mon Aug 26 18:21:04 2013 (r254926) +++ projects/random_number_generator/sys/dev/random/yarrow.h Mon Aug 26 18:29:51 2013 (r254927) @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2000-2004 Mark R V Murray + * Copyright (c) 2000-2013 Mark R V Murray * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -26,34 +26,7 @@ * $FreeBSD$ */ -/* This contains Yarrow-specific declarations. - * See http://www.counterpane.com/yarrow.html - */ - -#define TIMEBIN 16 /* max value for Pt/t */ - -#define FAST 0 -#define SLOW 1 - -/* This is the beastie that needs protecting. It contains all of the - * state that we are excited about. - * Exactly one will be instantiated. - */ -struct random_state { - u_int64_t counter[4]; /* C - 256 bits */ - struct yarrowkey key; /* K */ - u_int gengateinterval; /* Pg */ - u_int bins; /* Pt/t */ - u_int outputblocks; /* count output blocks for gates */ - u_int slowoverthresh; /* slow pool overthreshhold reseed count */ - struct pool { - struct source { - u_int bits; /* estimated bits of entropy */ - u_int frac; /* fractional bits of entropy - (given as 1024/n) */ - } source[ENTROPYSOURCE]; - u_int thresh; /* pool reseed threshhold */ - struct yarrowhash hash; /* accumulated entropy */ - } pool[2]; /* pool[0] is fast, pool[1] is slow */ - u_int which; /* toggle - sets the current insertion pool */ -}; +void random_yarrow_init_alg(struct sysctl_ctx_list *); +void random_yarrow_deinit_alg(void); +int random_yarrow_read(void *, int); +void random_yarrow_reseed(void); From owner-svn-src-projects@FreeBSD.ORG Mon Aug 26 18:35:22 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id ABDA75A0; Mon, 26 Aug 2013 18:35:22 +0000 (UTC) (envelope-from markm@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 9777926D7; Mon, 26 Aug 2013 18:35:22 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id r7QIZMfk045582; Mon, 26 Aug 2013 18:35:22 GMT (envelope-from markm@svn.freebsd.org) Received: (from markm@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id r7QIZL4j045530; Mon, 26 Aug 2013 18:35:21 GMT (envelope-from markm@svn.freebsd.org) Message-Id: <201308261835.r7QIZL4j045530@svn.freebsd.org> From: Mark Murray Date: Mon, 26 Aug 2013 18:35:21 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r254928 - in projects/random_number_generator/sys: kern net netgraph sys X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 26 Aug 2013 18:35:22 -0000 Author: markm Date: Mon Aug 26 18:35:21 2013 New Revision: 254928 URL: http://svnweb.freebsd.org/changeset/base/254928 Log: Snapshot; Do some running repairs on entropy harvesting. More needs to follow. Modified: projects/random_number_generator/sys/kern/kern_intr.c projects/random_number_generator/sys/net/if_ethersubr.c projects/random_number_generator/sys/net/if_tun.c projects/random_number_generator/sys/netgraph/ng_iface.c projects/random_number_generator/sys/sys/random.h Modified: projects/random_number_generator/sys/kern/kern_intr.c ============================================================================== --- projects/random_number_generator/sys/kern/kern_intr.c Mon Aug 26 18:29:51 2013 (r254927) +++ projects/random_number_generator/sys/kern/kern_intr.c Mon Aug 26 18:35:21 2013 (r254928) @@ -1147,7 +1147,7 @@ swi_sched(void *cookie, int flags) entropy.event = (uintptr_t)ih; entropy.td = curthread; random_harvest(&entropy, sizeof(entropy), 1, 0, - RANDOM_INTERRUPT); + RANDOM_SWI); } /* Modified: projects/random_number_generator/sys/net/if_ethersubr.c ============================================================================== --- projects/random_number_generator/sys/net/if_ethersubr.c Mon Aug 26 18:29:51 2013 (r254927) +++ projects/random_number_generator/sys/net/if_ethersubr.c Mon Aug 26 18:35:21 2013 (r254928) @@ -638,9 +638,8 @@ ether_input_internal(struct ifnet *ifp, m->m_flags |= M_PROMISC; } - /* First chunk of an mbuf contains good entropy */ if (harvest.ethernet) - random_harvest(m, 16, 3, 0, RANDOM_NET); + random_harvest(&(m->m_data), 12, 3, 0, RANDOM_NET_ETHER); ether_demux(ifp, m); CURVNET_RESTORE(); Modified: projects/random_number_generator/sys/net/if_tun.c ============================================================================== --- projects/random_number_generator/sys/net/if_tun.c Mon Aug 26 18:29:51 2013 (r254927) +++ projects/random_number_generator/sys/net/if_tun.c Mon Aug 26 18:35:21 2013 (r254928) @@ -922,9 +922,8 @@ tunwrite(struct cdev *dev, struct uio *u m_freem(m); return (EAFNOSUPPORT); } - /* First chunk of an mbuf contains good junk */ if (harvest.point_to_point) - random_harvest(m, 16, 3, 0, RANDOM_NET); + random_harvest(&(m->m_data), 12, 3, 0, RANDOM_NET_TUN); ifp->if_ibytes += m->m_pkthdr.len; ifp->if_ipackets++; CURVNET_SET(ifp->if_vnet); Modified: projects/random_number_generator/sys/netgraph/ng_iface.c ============================================================================== --- projects/random_number_generator/sys/netgraph/ng_iface.c Mon Aug 26 18:29:51 2013 (r254927) +++ projects/random_number_generator/sys/netgraph/ng_iface.c Mon Aug 26 18:35:21 2013 (r254928) @@ -774,9 +774,8 @@ ng_iface_rcvdata(hook_p hook, item_p ite m_freem(m); return (EAFNOSUPPORT); } - /* First chunk of an mbuf contains good junk */ if (harvest.point_to_point) - random_harvest(m, 16, 3, 0, RANDOM_NET); + random_harvest(&(m->m_data), 12, 3, 0, RANDOM_NET_NG); M_SETFIB(m, ifp->if_fib); netisr_dispatch(isr, m); return (0); Modified: projects/random_number_generator/sys/sys/random.h ============================================================================== --- projects/random_number_generator/sys/sys/random.h Mon Aug 26 18:29:51 2013 (r254927) +++ projects/random_number_generator/sys/sys/random.h Mon Aug 26 18:35:21 2013 (r254928) @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2000 Mark R. V. Murray + * Copyright (c) 2000-2013 Mark R. V. Murray * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -42,8 +42,11 @@ enum esource { RANDOM_WRITE = 0, RANDOM_KEYBOARD, RANDOM_MOUSE, - RANDOM_NET, + RANDOM_NET_TUN, + RANDOM_NET_ETHER, + RANDOM_NET_NG, RANDOM_INTERRUPT, + RANDOM_SWI, RANDOM_PURE, ENTROPYSOURCE }; @@ -57,6 +60,7 @@ struct harvest_select { int point_to_point; int interrupt; int swi; + int namei; }; extern struct harvest_select harvest; From owner-svn-src-projects@FreeBSD.ORG Mon Aug 26 19:03:48 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 2F36B46F; Mon, 26 Aug 2013 19:03:48 +0000 (UTC) (envelope-from mavbsd@gmail.com) Received: from mail-ea0-x230.google.com (mail-ea0-x230.google.com [IPv6:2a00:1450:4013:c01::230]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 33BDD28A1; Mon, 26 Aug 2013 19:03:47 +0000 (UTC) Received: by mail-ea0-f176.google.com with SMTP id q16so1812111ead.35 for ; Mon, 26 Aug 2013 12:03:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:message-id:date:from:user-agent:mime-version:to:cc:subject :references:in-reply-to:content-type:content-transfer-encoding; bh=yWtiCfCFtkmAaPYMGc1n+0lwtpmyqUEf73awCr6UO98=; b=G5+UJ43IeVJEk9Zg+l39DX2sg058zWBBIZKwShctw7QetsNCnCDjMp4g9POYvmgrue 6HX6QOzNAIue46aI9VzGmiqYSzzac5swcWCY3cvza7AvEBjKeuRK91xs1re+1yJ4w69F ZsmNDf+klH+NUC4BCdsC7dCrs7eQV2WMk/n/Y48penj4Z7G+3sGMxRLHhlitl3GdoAva vSJDPueXA3KY/b1kYhlK/d/E3DD5G/FV1NgBkWq5SSEAQkuMuZjX5XNy4IO8xx3yS+P2 u3j21lLuPXByBwxvFZ8rTfKQv9FLxpF2Bxls763KgrgDC5jHuudR/++Ikh3JlnaKud/x 6TXQ== X-Received: by 10.14.224.198 with SMTP id x46mr5672545eep.53.1377543825459; Mon, 26 Aug 2013 12:03:45 -0700 (PDT) Received: from mavbook.mavhome.dp.ua ([37.229.21.195]) by mx.google.com with ESMTPSA id b45sm23390706eef.4.1969.12.31.16.00.00 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 26 Aug 2013 12:03:44 -0700 (PDT) Sender: Alexander Motin Message-ID: <521BA68D.3070304@FreeBSD.org> Date: Mon, 26 Aug 2013 22:03:41 +0300 From: Alexander Motin User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:17.0) Gecko/20130616 Thunderbird/17.0.6 MIME-Version: 1.0 To: John Baldwin Subject: Re: svn commit: r254846 - projects/camlock/sys/cddl/contrib/opensolaris/uts/common/fs/zfs References: <201308251121.r7PBLA3v033536@svn.freebsd.org> <521A06A2.7050807@FreeBSD.org> <201308261425.34743.jhb@freebsd.org> In-Reply-To: <201308261425.34743.jhb@freebsd.org> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: svn-src-projects@freebsd.org, Adrian Chadd , "src-committers@freebsd.org" X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 26 Aug 2013 19:03:48 -0000 On 26.08.2013 21:25, John Baldwin wrote: > On Sunday, August 25, 2013 9:29:06 am Alexander Motin wrote: >> On 25.08.2013 15:48, Adrian Chadd wrote: >>> Surely there's a better way to check whether a thread can sleep besides >>> digging around in curthread->td_no_sleeping ? What about adding an >>> accessor macro along side THREAD_SLEEPING_OK and THREAD_NO_SLEEPING ? >> >> That sounds good to me. I was also surprised such macros are not there >> yet when found some code doing these checks just the same way as I did. > > It was never intended to be public, only as a debugging aid for assertions. :( > I had hoped that the calling code would know when it was in an ithread or not > and call different routines as needed (i.e. that the programmer would > intentionally think about the context they were in). Perhaps this is not > realistic? Are you really queueing new I/O from ithreads and/or timers? I don't, but at least GEOM SCHED I think does it from callout context. I agree that caller code should usually know where it runs, and in such case it can control whether execute request directly or queue it. But queued requests are executed by GEOM threads, where sleeping is also denied for callee, i.e. not really much different. Same time zvol can benefit very much from ability to sleep in caller context, that I've implemented with this check. If not do it that way, I could replace that with check for whether we run explicitly from one of GEOM threads. That I think should be sufficient. -- Alexander Motin From owner-svn-src-projects@FreeBSD.ORG Mon Aug 26 19:07:04 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 02D125C0; Mon, 26 Aug 2013 19:07:04 +0000 (UTC) (envelope-from markm@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id E3D0228C1; Mon, 26 Aug 2013 19:07:03 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id r7QJ73uT062435; Mon, 26 Aug 2013 19:07:03 GMT (envelope-from markm@svn.freebsd.org) Received: (from markm@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id r7QJ73pB062434; Mon, 26 Aug 2013 19:07:03 GMT (envelope-from markm@svn.freebsd.org) Message-Id: <201308261907.r7QJ73pB062434@svn.freebsd.org> From: Mark Murray Date: Mon, 26 Aug 2013 19:07:03 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r254934 - projects/random_number_generator/sys/dev/random X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 26 Aug 2013 19:07:04 -0000 Author: markm Date: Mon Aug 26 19:07:03 2013 New Revision: 254934 URL: http://svnweb.freebsd.org/changeset/base/254934 Log: Remove the short-lived namei experiment. Modified: projects/random_number_generator/sys/dev/random/randomdev_soft.c Modified: projects/random_number_generator/sys/dev/random/randomdev_soft.c ============================================================================== --- projects/random_number_generator/sys/dev/random/randomdev_soft.c Mon Aug 26 19:02:52 2013 (r254933) +++ projects/random_number_generator/sys/dev/random/randomdev_soft.c Mon Aug 26 19:07:03 2013 (r254934) @@ -199,11 +199,6 @@ randomdev_init(void) OID_AUTO, "swi", CTLTYPE_INT | CTLFLAG_RW, &harvest.swi, 0, random_check_boolean, "I", "Harvest SWI entropy"); - SYSCTL_ADD_PROC(&random_clist, - SYSCTL_CHILDREN(random_sys_harvest_o), - OID_AUTO, "namei", CTLTYPE_INT | CTLFLAG_RW, - &harvest.namei, 0, random_check_boolean, "I", - "Harvest namei cache entropy"); /* Initialise the harvest fifos */ STAILQ_INIT(&emptyfifo.head); From owner-svn-src-projects@FreeBSD.ORG Mon Aug 26 20:03:45 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 80167489; Mon, 26 Aug 2013 20:03:45 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 5E8E72C66; Mon, 26 Aug 2013 20:03:45 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id r7QK3j7E093656; Mon, 26 Aug 2013 20:03:45 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id r7QK3i27093651; Mon, 26 Aug 2013 20:03:44 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201308262003.r7QK3i27093651@svn.freebsd.org> From: Alexander Motin Date: Mon, 26 Aug 2013 20:03:44 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r254935 - in projects/camlock/sys: cddl/contrib/opensolaris/uts/common/fs/zfs geom X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 26 Aug 2013 20:03:45 -0000 Author: mav Date: Mon Aug 26 20:03:44 2013 New Revision: 254935 URL: http://svnweb.freebsd.org/changeset/base/254935 Log: - Introduce new GEOM utility function g_is_geom_thread(), returning true if specified thread is one of GEOM threads (g_up/g_down/g_event). - Use this function instead of `td->td_no_sleeping != 0` (that was not supposed to be public KPI) to detect whether we can sleep in this context. From this moment assume that G_CF_DIRECT_SEND consumer flag means not only reenterability, but also that caller context is sleepable (if we are not already in one of GEOM threads where sleep artificially denied by design). Modified: projects/camlock/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zvol.c projects/camlock/sys/geom/geom.h projects/camlock/sys/geom/geom_io.c projects/camlock/sys/geom/geom_kern.c Modified: projects/camlock/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zvol.c ============================================================================== --- projects/camlock/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zvol.c Mon Aug 26 19:07:03 2013 (r254934) +++ projects/camlock/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zvol.c Mon Aug 26 20:03:44 2013 (r254935) @@ -2176,14 +2176,14 @@ zvol_geom_start(struct bio *bp) ASSERT(zv != NULL); switch (bp->bio_cmd) { case BIO_FLUSH: - if (curthread->td_no_sleeping != 0) + if (g_is_geom_thread(curthread)) goto enqueue; zil_commit(zv->zv_zilog, ZVOL_OBJ); g_io_deliver(bp, 0); break; case BIO_READ: case BIO_WRITE: - if (curthread->td_no_sleeping != 0) + if (g_is_geom_thread(curthread)) goto enqueue; zvol_strategy(bp); break; Modified: projects/camlock/sys/geom/geom.h ============================================================================== --- projects/camlock/sys/geom/geom.h Mon Aug 26 19:07:03 2013 (r254934) +++ projects/camlock/sys/geom/geom.h Mon Aug 26 20:03:44 2013 (r254935) @@ -397,6 +397,8 @@ g_free(void *ptr) }; \ DECLARE_MODULE(name, name##_mod, SI_SUB_DRIVERS, SI_ORDER_FIRST); +int g_is_geom_thread(struct thread *td); + #endif /* _KERNEL */ /* geom_ctl.c */ Modified: projects/camlock/sys/geom/geom_io.c ============================================================================== --- projects/camlock/sys/geom/geom_io.c Mon Aug 26 19:07:03 2013 (r254934) +++ projects/camlock/sys/geom/geom_io.c Mon Aug 26 20:03:44 2013 (r254935) @@ -83,10 +83,6 @@ static uma_zone_t biozone; static TAILQ_HEAD(g_classifier_tailq, g_classifier_hook) g_classifier_tailq = TAILQ_HEAD_INITIALIZER(g_classifier_tailq); -extern struct thread *g_up_td; -extern struct thread *g_down_td; -extern struct thread *g_event_td; - #include static void @@ -464,7 +460,6 @@ void g_io_request(struct bio *bp, struct g_consumer *cp) { struct g_provider *pp; - struct thread *td; struct mtx *mtxp; int direct, error, first; @@ -522,12 +517,9 @@ g_io_request(struct bio *bp, struct g_co getbinuptime(&bp->bio_t0); #ifdef GET_STACK_USAGE - td = curthread; direct = (cp->flags & G_CF_DIRECT_SEND) && (pp->flags & G_PF_DIRECT_RECEIVE) && - ((bp->bio_flags & BIO_UNMAPPED) == 0 || - td->td_no_sleeping == 0) && - td != g_up_td && td != g_down_td && td != g_event_td; + !g_is_geom_thread(curthread); if (direct) { /* Block direct execution if less then half of stack left. */ size_t st, su; @@ -589,7 +581,6 @@ g_io_deliver(struct bio *bp, int error) struct bintime now; struct g_consumer *cp; struct g_provider *pp; - struct thread *td; struct mtx *mtxp; int direct, first; @@ -638,10 +629,9 @@ g_io_deliver(struct bio *bp, int error) bp->bio_resid = bp->bio_bcount - bp->bio_completed; #ifdef GET_STACK_USAGE - td = curthread; direct = (pp->flags & G_PF_DIRECT_SEND) && (cp->flags & G_CF_DIRECT_RECEIVE) && - td != g_up_td && td != g_down_td && td != g_event_td; + !g_is_geom_thread(curthread); if (direct) { /* Block direct execution if less then half of stack left. */ size_t st, su; Modified: projects/camlock/sys/geom/geom_kern.c ============================================================================== --- projects/camlock/sys/geom/geom_kern.c Mon Aug 26 19:07:03 2013 (r254934) +++ projects/camlock/sys/geom/geom_kern.c Mon Aug 26 20:03:44 2013 (r254935) @@ -59,9 +59,9 @@ MALLOC_DEFINE(M_GEOM, "GEOM", "Geom data struct sx topology_lock; static struct proc *g_proc; -struct thread *g_up_td; -struct thread *g_down_td; -struct thread *g_event_td; +static struct thread *g_up_td; +static struct thread *g_down_td; +static struct thread *g_event_td; int g_debugflags; int g_collectstats = 1; @@ -123,6 +123,13 @@ g_event_procbody(void *arg) /* NOTREACHED */ } +int +g_is_geom_thread(struct thread *td) +{ + + return (td == g_up_td || td == g_down_td || td == g_event_td); +} + static void geom_shutdown(void *foo __unused) { From owner-svn-src-projects@FreeBSD.ORG Thu Aug 29 11:49:54 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id DD82E44E; Thu, 29 Aug 2013 11:49:53 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id CBCEA2FC6; Thu, 29 Aug 2013 11:49:53 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id r7TBnrZv081420; Thu, 29 Aug 2013 11:49:53 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id r7TBnrs3081418; Thu, 29 Aug 2013 11:49:53 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201308291149.r7TBnrs3081418@svn.freebsd.org> From: Alexander Motin Date: Thu, 29 Aug 2013 11:49:53 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r255019 - in projects/camlock/sys/cam: ata scsi X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 29 Aug 2013 11:49:54 -0000 Author: mav Date: Thu Aug 29 11:49:53 2013 New Revision: 255019 URL: http://svnweb.freebsd.org/changeset/base/255019 Log: Drop periph (device) locks for da and ada drivers while submitting commands for execution. That substantially reduces these locks hold time, removing any measurable congestion. While GEOM guaranties that disk won't be closed before all requests completed, dropping lock in this place opens hypothetical race in case if last request manage to complete before submission call return. If periph will be destroyed at that point, it may cause user-after-free panic. To cover that case introduce additional per-periph reference counter to make close handler wait for all submission threads to get out before dropping periph reference and return. This change removes last measurable lock congestion inside CAM core on my test setup. The only congestion left is inside SIM between request submit and completion threads, but avoiding that requires SIM modification and depending on specific hardware may be problematic or impossible. On my present test setup this increases maximum IOPS from 673K to 724K. Modified: projects/camlock/sys/cam/ata/ata_da.c projects/camlock/sys/cam/scsi/scsi_da.c Modified: projects/camlock/sys/cam/ata/ata_da.c ============================================================================== --- projects/camlock/sys/cam/ata/ata_da.c Thu Aug 29 11:40:45 2013 (r255018) +++ projects/camlock/sys/cam/ata/ata_da.c Thu Aug 29 11:49:53 2013 (r255019) @@ -153,6 +153,7 @@ struct ada_softc { struct sysctl_oid *sysctl_tree; struct callout sendordered_c; struct trim_request trim_req; + int refcount; }; struct ada_quirk_entry { @@ -671,6 +672,8 @@ adaclose(struct disk *dp) softc->flags &= ~ADA_FLAG_OPEN; cam_periph_unhold(periph); + while (softc->refcount != 0) + cam_periph_sleep(periph, &softc->refcount, PRIBIO, "adaclose", 1); cam_periph_unlock(periph); cam_periph_release(periph); return (0); @@ -1639,7 +1642,11 @@ adastart(struct cam_periph *periph, unio out: start_ccb->ccb_h.ccb_bp = bp; softc->outstanding_cmds++; + softc->refcount++; + cam_periph_unlock(periph); xpt_action(start_ccb); + cam_periph_lock(periph); + softc->refcount--; /* May have more work to do, so ensure we stay scheduled */ adaschedule(periph); Modified: projects/camlock/sys/cam/scsi/scsi_da.c ============================================================================== --- projects/camlock/sys/cam/scsi/scsi_da.c Thu Aug 29 11:40:45 2013 (r255018) +++ projects/camlock/sys/cam/scsi/scsi_da.c Thu Aug 29 11:49:53 2013 (r255019) @@ -228,6 +228,7 @@ struct da_softc { uint8_t unmap_buf[UNMAP_BUF_SIZE]; struct scsi_read_capacity_data_long rcaplong; struct callout mediapoll_c; + int refcount; }; #define dadeleteflag(softc, delete_method, enable) \ @@ -1321,6 +1322,8 @@ daclose(struct disk *dp) softc->flags &= ~DA_FLAG_OPEN; cam_periph_unhold(periph); + while (softc->refcount != 0) + cam_periph_sleep(periph, &softc->refcount, PRIBIO, "daclose", 1); cam_periph_unlock(periph); cam_periph_release(periph); return (0); @@ -2313,7 +2316,11 @@ out: } start_ccb->ccb_h.ccb_bp = bp; + softc->refcount++; + cam_periph_unlock(periph); xpt_action(start_ccb); + cam_periph_lock(periph); + softc->refcount--; /* May have more work to do, so ensure we stay scheduled */ daschedule(periph); From owner-svn-src-projects@FreeBSD.ORG Fri Aug 30 01:33:32 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 1257758A; Fri, 30 Aug 2013 01:33:32 +0000 (UTC) (envelope-from lstewart@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id EE6F528F1; Fri, 30 Aug 2013 01:33:31 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id r7U1XVXP047183; Fri, 30 Aug 2013 01:33:31 GMT (envelope-from lstewart@svn.freebsd.org) Received: (from lstewart@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id r7U1XSqo047159; Fri, 30 Aug 2013 01:33:28 GMT (envelope-from lstewart@svn.freebsd.org) Message-Id: <201308300133.r7U1XSqo047159@svn.freebsd.org> From: Lawrence Stewart Date: Fri, 30 Aug 2013 01:33:28 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r255049 - in projects/diffused_head: . bin/ps bin/sh cddl/contrib/opensolaris/cmd/zpool cddl/contrib/opensolaris/common/ctf cddl/contrib/opensolaris/lib/libctf/common cddl/contrib/opens... X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 30 Aug 2013 01:33:32 -0000 Author: lstewart Date: Fri Aug 30 01:33:26 2013 New Revision: 255049 URL: http://svnweb.freebsd.org/changeset/base/255049 Log: Merge revs 254653:255047 from head. Added: projects/diffused_head/cddl/lib/libdtrace/ip.d - copied unchanged from r255047, head/cddl/lib/libdtrace/ip.d projects/diffused_head/cddl/lib/libdtrace/tcp.d - copied unchanged from r255047, head/cddl/lib/libdtrace/tcp.d projects/diffused_head/cddl/lib/libdtrace/udp.d - copied unchanged from r255047, head/cddl/lib/libdtrace/udp.d - copied from r255047, head/contrib/libexecinfo/ projects/diffused_head/contrib/llvm/tools/lldb/ - copied from r255047, head/contrib/llvm/tools/lldb/ projects/diffused_head/etc/periodic/monthly/450.status-security - copied unchanged from r255047, head/etc/periodic/monthly/450.status-security projects/diffused_head/etc/periodic/weekly/450.status-security - copied unchanged from r255047, head/etc/periodic/weekly/450.status-security projects/diffused_head/lib/libexecinfo/ - copied from r255047, head/lib/libexecinfo/ projects/diffused_head/share/man/man4/procdesc.4 - copied unchanged from r255047, head/share/man/man4/procdesc.4 projects/diffused_head/share/man/man4/vmx.4 - copied unchanged from r255047, head/share/man/man4/vmx.4 projects/diffused_head/sys/contrib/dev/drm2/ - copied from r255047, head/sys/contrib/dev/drm2/ projects/diffused_head/sys/contrib/dev/iwn/iwlwifi-2000-18.168.6.1.fw.uu - copied unchanged from r255047, head/sys/contrib/dev/iwn/iwlwifi-2000-18.168.6.1.fw.uu projects/diffused_head/sys/dev/drm2/ati_pcigart.c - copied unchanged from r255047, head/sys/dev/drm2/ati_pcigart.c projects/diffused_head/sys/dev/drm2/drm_buffer.c - copied unchanged from r255047, head/sys/dev/drm2/drm_buffer.c projects/diffused_head/sys/dev/drm2/drm_buffer.h - copied unchanged from r255047, head/sys/dev/drm2/drm_buffer.h projects/diffused_head/sys/dev/drm2/drm_core.h - copied unchanged from r255047, head/sys/dev/drm2/drm_core.h projects/diffused_head/sys/dev/drm2/drm_dp_helper.c - copied unchanged from r255047, head/sys/dev/drm2/drm_dp_helper.c projects/diffused_head/sys/dev/drm2/drm_fixed.h - copied unchanged from r255047, head/sys/dev/drm2/drm_fixed.h projects/diffused_head/sys/dev/drm2/drm_os_freebsd.h - copied unchanged from r255047, head/sys/dev/drm2/drm_os_freebsd.h projects/diffused_head/sys/dev/drm2/radeon/ - copied from r255047, head/sys/dev/drm2/radeon/ projects/diffused_head/sys/dev/iscsi_initiator/ - copied from r255047, head/sys/dev/iscsi_initiator/ projects/diffused_head/sys/dev/vmware/ - copied from r255047, head/sys/dev/vmware/ projects/diffused_head/sys/dev/xen/timer/ - copied from r255047, head/sys/dev/xen/timer/ projects/diffused_head/sys/modules/drm2/radeonkms/ - copied from r255047, head/sys/modules/drm2/radeonkms/ projects/diffused_head/sys/modules/drm2/radeonkmsfw/ - copied from r255047, head/sys/modules/drm2/radeonkmsfw/ projects/diffused_head/sys/modules/iscsi_initiator/ - copied from r255047, head/sys/modules/iscsi_initiator/ projects/diffused_head/sys/modules/iwnfw/iwn2000/ - copied from r255047, head/sys/modules/iwnfw/iwn2000/ projects/diffused_head/sys/modules/vmware/ - copied from r255047, head/sys/modules/vmware/ projects/diffused_head/sys/netinet/in_kdtrace.c - copied unchanged from r255047, head/sys/netinet/in_kdtrace.c projects/diffused_head/sys/netinet/in_kdtrace.h - copied unchanged from r255047, head/sys/netinet/in_kdtrace.h projects/diffused_head/sys/x86/xen/ - copied from r255047, head/sys/x86/xen/ projects/diffused_head/sys/xen/evtchn/evtchnvar.h - copied unchanged from r255047, head/sys/xen/evtchn/evtchnvar.h projects/diffused_head/sys/xen/xen-os.h - copied unchanged from r255047, head/sys/xen/xen-os.h projects/diffused_head/tools/build/options/WITHOUT_ICONV - copied unchanged from r255047, head/tools/build/options/WITHOUT_ICONV projects/diffused_head/tools/build/options/WITH_LIBICONV_COMPAT - copied unchanged from r255047, head/tools/build/options/WITH_LIBICONV_COMPAT projects/diffused_head/tools/build/options/WITH_USB_GADGET_EXAMPLES - copied unchanged from r255047, head/tools/build/options/WITH_USB_GADGET_EXAMPLES projects/diffused_head/tools/regression/bin/sh/builtins/alias4.0 - copied unchanged from r255047, head/tools/regression/bin/sh/builtins/alias4.0 projects/diffused_head/tools/regression/bin/sh/expansion/arith13.0 - copied unchanged from r255047, head/tools/regression/bin/sh/expansion/arith13.0 projects/diffused_head/tools/regression/bin/sh/parser/empty-cmd1.0 - copied unchanged from r255047, head/tools/regression/bin/sh/parser/empty-cmd1.0 projects/diffused_head/tools/regression/file/fcntlflags/ - copied from r255047, head/tools/regression/file/fcntlflags/ projects/diffused_head/tools/tools/drm/ - copied from r255047, head/tools/tools/drm/ Directory Properties: projects/diffused_head/contrib/libexecinfo/ (props changed) Deleted: projects/diffused_head/sys/dev/iscsi/initiator/ projects/diffused_head/sys/dev/xen/xenpci/evtchn.c projects/diffused_head/sys/i386/include/xen/xen_clock_util.h projects/diffused_head/sys/i386/xen/xen_clock_util.c projects/diffused_head/sys/i386/xen/xen_rtc.c projects/diffused_head/sys/modules/iscsi/initiator/ projects/diffused_head/sys/xen/evtchn/evtchn.c projects/diffused_head/tools/build/options/WITH_BSDCONFIG projects/diffused_head/tools/build/options/WITH_GNU_PATCH projects/diffused_head/tools/build/options/WITH_ICONV Modified: projects/diffused_head/ObsoleteFiles.inc projects/diffused_head/UPDATING projects/diffused_head/bin/ps/keyword.c projects/diffused_head/bin/ps/ps.1 projects/diffused_head/bin/sh/alias.c projects/diffused_head/bin/sh/arith_yylex.c projects/diffused_head/bin/sh/jobs.c projects/diffused_head/bin/sh/parser.c projects/diffused_head/cddl/contrib/opensolaris/cmd/zpool/zpool_main.c projects/diffused_head/cddl/contrib/opensolaris/common/ctf/ctf_create.c projects/diffused_head/cddl/contrib/opensolaris/common/ctf/ctf_error.c projects/diffused_head/cddl/contrib/opensolaris/common/ctf/ctf_impl.h projects/diffused_head/cddl/contrib/opensolaris/common/ctf/ctf_open.c projects/diffused_head/cddl/contrib/opensolaris/lib/libctf/common/ctf_lib.c projects/diffused_head/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_iter.c projects/diffused_head/cddl/contrib/opensolaris/tools/ctf/cvt/dwarf.c projects/diffused_head/cddl/lib/libdtrace/Makefile projects/diffused_head/cddl/lib/libzpool/Makefile projects/diffused_head/cddl/usr.bin/ztest/Makefile projects/diffused_head/cddl/usr.sbin/zdb/Makefile projects/diffused_head/contrib/llvm/include/llvm/MC/MCInstPrinter.h projects/diffused_head/contrib/llvm/lib/MC/MCInstPrinter.cpp projects/diffused_head/contrib/llvm/lib/Target/X86/InstPrinter/X86ATTInstPrinter.cpp projects/diffused_head/contrib/llvm/lib/Target/X86/InstPrinter/X86IntelInstPrinter.cpp projects/diffused_head/contrib/pam_modules/pam_passwdqc/pam_passwdqc.c projects/diffused_head/etc/defaults/periodic.conf projects/diffused_head/etc/mtree/BSD.usr.dist projects/diffused_head/etc/network.subr projects/diffused_head/etc/periodic/monthly/Makefile projects/diffused_head/etc/periodic/security/100.chksetuid projects/diffused_head/etc/periodic/security/110.neggrpperm projects/diffused_head/etc/periodic/security/200.chkmounts projects/diffused_head/etc/periodic/security/300.chkuid0 projects/diffused_head/etc/periodic/security/400.passwdless projects/diffused_head/etc/periodic/security/410.logincheck projects/diffused_head/etc/periodic/security/460.chkportsum projects/diffused_head/etc/periodic/security/500.ipfwdenied projects/diffused_head/etc/periodic/security/510.ipfdenied projects/diffused_head/etc/periodic/security/520.pfdenied projects/diffused_head/etc/periodic/security/550.ipfwlimit projects/diffused_head/etc/periodic/security/610.ipf6denied projects/diffused_head/etc/periodic/security/700.kernelmsg projects/diffused_head/etc/periodic/security/800.loginfail projects/diffused_head/etc/periodic/security/900.tcpwrap projects/diffused_head/etc/periodic/security/security.functions projects/diffused_head/etc/periodic/weekly/Makefile projects/diffused_head/etc/rc.d/savecore projects/diffused_head/gnu/usr.bin/patch/Makefile projects/diffused_head/lib/libc/gen/wordexp.c projects/diffused_head/lib/libc/include/libc_private.h projects/diffused_head/lib/libc/net/ether_addr.c projects/diffused_head/lib/libc/net/eui64.c projects/diffused_head/lib/libc/net/getaddrinfo.c projects/diffused_head/lib/libc/net/gethostbyht.c projects/diffused_head/lib/libc/net/getnetbyht.c projects/diffused_head/lib/libc/net/getprotoent.c projects/diffused_head/lib/libc/net/getservent.c projects/diffused_head/lib/libc/net/hesiod.c projects/diffused_head/lib/libc/net/nsdispatch.c projects/diffused_head/lib/libc/net/rcmd.c projects/diffused_head/lib/libc/posix1e/mac.c projects/diffused_head/lib/libc/resolv/res_init.c projects/diffused_head/lib/libc/resolv/res_query.c projects/diffused_head/lib/libc/sys/chflags.2 projects/diffused_head/lib/libc/sys/pdfork.2 projects/diffused_head/lib/libpam/modules/pam_passwdqc/Makefile projects/diffused_head/lib/libutil/login_auth.c projects/diffused_head/lib/libutil/login_cap.c projects/diffused_head/lib/libutil/pidfile.c projects/diffused_head/lib/libutil/quotafile.c projects/diffused_head/lib/libutil/uucplock.c projects/diffused_head/lib/msun/src/s_erf.c projects/diffused_head/lib/msun/src/s_erff.c projects/diffused_head/release/scripts/mm-mtree.sh projects/diffused_head/sbin/camcontrol/camcontrol.c projects/diffused_head/sbin/iscontrol/auth_subr.c projects/diffused_head/sbin/iscontrol/config.c projects/diffused_head/sbin/iscontrol/fsm.c projects/diffused_head/sbin/iscontrol/iscontrol.c projects/diffused_head/sbin/iscontrol/login.c projects/diffused_head/sbin/iscontrol/misc.c projects/diffused_head/sbin/iscontrol/pdu.c projects/diffused_head/share/man/man4/Makefile projects/diffused_head/share/man/man4/capsicum.4 projects/diffused_head/share/man/man4/cd.4 projects/diffused_head/share/man/man4/sa.4 projects/diffused_head/share/man/man4/sysmouse.4 projects/diffused_head/share/man/man5/periodic.conf.5 projects/diffused_head/share/man/man5/src.conf.5 projects/diffused_head/share/man/man9/EVENTHANDLER.9 projects/diffused_head/share/man/man9/Makefile projects/diffused_head/share/man/man9/atomic.9 projects/diffused_head/share/man/man9/pfil.9 projects/diffused_head/share/man/man9/timeout.9 projects/diffused_head/share/man/man9/vm_page_grab.9 projects/diffused_head/share/misc/committers-src.dot projects/diffused_head/share/mk/bsd.own.mk projects/diffused_head/share/mk/sys.mk projects/diffused_head/sys/amd64/amd64/apic_vector.S projects/diffused_head/sys/amd64/amd64/machdep.c projects/diffused_head/sys/amd64/amd64/mp_machdep.c projects/diffused_head/sys/amd64/amd64/pmap.c projects/diffused_head/sys/amd64/include/apicvar.h projects/diffused_head/sys/amd64/include/intr_machdep.h projects/diffused_head/sys/amd64/include/pcpu.h projects/diffused_head/sys/amd64/include/xen/hypercall.h projects/diffused_head/sys/amd64/include/xen/xen-os.h projects/diffused_head/sys/amd64/vmm/vmm_instruction_emul.c projects/diffused_head/sys/arm/arm/irq_dispatch.S projects/diffused_head/sys/arm/arm/pmap-v6.c projects/diffused_head/sys/arm/arm/pmap.c projects/diffused_head/sys/arm/arm/swtch.S projects/diffused_head/sys/arm/conf/VERSATILEPB projects/diffused_head/sys/arm/include/param.h projects/diffused_head/sys/arm/include/pmap.h projects/diffused_head/sys/arm/include/pte.h projects/diffused_head/sys/arm/include/vmparam.h projects/diffused_head/sys/boot/forth/beastie.4th projects/diffused_head/sys/boot/forth/version.4th projects/diffused_head/sys/boot/forth/version.4th.8 projects/diffused_head/sys/boot/i386/libi386/biosacpi.c projects/diffused_head/sys/cam/cam_xpt.c projects/diffused_head/sys/cam/ctl/ctl.c projects/diffused_head/sys/cam/ctl/ctl.h projects/diffused_head/sys/cam/ctl/ctl_backend.h projects/diffused_head/sys/cam/ctl/ctl_backend_block.c projects/diffused_head/sys/cam/ctl/ctl_backend_ramdisk.c projects/diffused_head/sys/cam/ctl/ctl_frontend.h projects/diffused_head/sys/cam/ctl/ctl_io.h projects/diffused_head/sys/cam/scsi/scsi_all.c projects/diffused_head/sys/cam/scsi/scsi_ch.c projects/diffused_head/sys/cam/scsi/scsi_sa.c projects/diffused_head/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c projects/diffused_head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dbuf.c projects/diffused_head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu.c projects/diffused_head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_send.c projects/diffused_head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_tx.c projects/diffused_head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dnode.c projects/diffused_head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c projects/diffused_head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_destroy.c projects/diffused_head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dir.c projects/diffused_head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/dmu.h projects/diffused_head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/dnode.h projects/diffused_head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_vfsops.h projects/diffused_head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c projects/diffused_head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c projects/diffused_head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c projects/diffused_head/sys/cddl/contrib/opensolaris/uts/common/sys/ctf_api.h projects/diffused_head/sys/cddl/dev/dtrace/dtrace_load.c projects/diffused_head/sys/cddl/dev/dtrace/dtrace_unload.c projects/diffused_head/sys/cddl/dev/fbt/fbt.c projects/diffused_head/sys/cddl/dev/sdt/sdt.c projects/diffused_head/sys/compat/freebsd32/freebsd32.h projects/diffused_head/sys/compat/ndis/kern_ndis.c projects/diffused_head/sys/compat/ndis/ndis_var.h projects/diffused_head/sys/conf/Makefile.amd64 projects/diffused_head/sys/conf/files projects/diffused_head/sys/conf/files.amd64 projects/diffused_head/sys/conf/files.i386 projects/diffused_head/sys/contrib/dev/acpica/acpica_prep.sh projects/diffused_head/sys/contrib/dev/acpica/changes.txt (contents, props changed) projects/diffused_head/sys/contrib/dev/acpica/common/adisasm.c projects/diffused_head/sys/contrib/dev/acpica/common/adwalk.c projects/diffused_head/sys/contrib/dev/acpica/common/dmextern.c projects/diffused_head/sys/contrib/dev/acpica/common/dmtable.c projects/diffused_head/sys/contrib/dev/acpica/compiler/aslcompile.c projects/diffused_head/sys/contrib/dev/acpica/compiler/aslglobal.h projects/diffused_head/sys/contrib/dev/acpica/compiler/aslload.c projects/diffused_head/sys/contrib/dev/acpica/compiler/aslmain.c projects/diffused_head/sys/contrib/dev/acpica/compiler/asloptions.c projects/diffused_head/sys/contrib/dev/acpica/compiler/dtcompile.c projects/diffused_head/sys/contrib/dev/acpica/components/debugger/dbcmds.c projects/diffused_head/sys/contrib/dev/acpica/components/debugger/dbfileio.c projects/diffused_head/sys/contrib/dev/acpica/components/debugger/dbinput.c projects/diffused_head/sys/contrib/dev/acpica/components/debugger/dbnames.c projects/diffused_head/sys/contrib/dev/acpica/components/events/evgpeutil.c projects/diffused_head/sys/contrib/dev/acpica/components/events/evmisc.c projects/diffused_head/sys/contrib/dev/acpica/components/events/evregion.c projects/diffused_head/sys/contrib/dev/acpica/components/events/evsci.c projects/diffused_head/sys/contrib/dev/acpica/components/events/evxface.c projects/diffused_head/sys/contrib/dev/acpica/components/hardware/hwxface.c projects/diffused_head/sys/contrib/dev/acpica/components/namespace/nsaccess.c projects/diffused_head/sys/contrib/dev/acpica/components/namespace/nsdump.c projects/diffused_head/sys/contrib/dev/acpica/components/namespace/nsxfeval.c projects/diffused_head/sys/contrib/dev/acpica/components/tables/tbinstal.c projects/diffused_head/sys/contrib/dev/acpica/components/tables/tbprint.c projects/diffused_head/sys/contrib/dev/acpica/components/tables/tbxfroot.c projects/diffused_head/sys/contrib/dev/acpica/components/utilities/utdebug.c projects/diffused_head/sys/contrib/dev/acpica/components/utilities/utglobal.c projects/diffused_head/sys/contrib/dev/acpica/include/acdebug.h projects/diffused_head/sys/contrib/dev/acpica/include/acdisasm.h projects/diffused_head/sys/contrib/dev/acpica/include/acevents.h projects/diffused_head/sys/contrib/dev/acpica/include/acexcep.h projects/diffused_head/sys/contrib/dev/acpica/include/acglobal.h projects/diffused_head/sys/contrib/dev/acpica/include/aclocal.h projects/diffused_head/sys/contrib/dev/acpica/include/acnamesp.h projects/diffused_head/sys/contrib/dev/acpica/include/acpiosxf.h projects/diffused_head/sys/contrib/dev/acpica/include/acpixf.h projects/diffused_head/sys/contrib/dev/acpica/include/actypes.h projects/diffused_head/sys/contrib/dev/acpica/os_specific/service_layers/osunixxf.c projects/diffused_head/sys/contrib/rdma/krping/krping.c projects/diffused_head/sys/contrib/rdma/krping/krping.h projects/diffused_head/sys/contrib/rdma/krping/krping_dev.c projects/diffused_head/sys/dev/ahci/ahci.c projects/diffused_head/sys/dev/amdtemp/amdtemp.c projects/diffused_head/sys/dev/ath/if_ath.c projects/diffused_head/sys/dev/cas/if_cas.c projects/diffused_head/sys/dev/cxgb/cxgb_sge.c projects/diffused_head/sys/dev/cxgb/ulp/iw_cxgb/iw_cxgb_qp.c projects/diffused_head/sys/dev/cxgbe/adapter.h projects/diffused_head/sys/dev/cxgbe/offload.h projects/diffused_head/sys/dev/cxgbe/osdep.h projects/diffused_head/sys/dev/cxgbe/t4_main.c projects/diffused_head/sys/dev/cxgbe/t4_sge.c projects/diffused_head/sys/dev/cxgbe/t4_tracer.c projects/diffused_head/sys/dev/cxgbe/tom/t4_cpl_io.c projects/diffused_head/sys/dev/cxgbe/tom/t4_tom.c projects/diffused_head/sys/dev/drm2/drmP.h projects/diffused_head/sys/dev/drm2/drm_atomic.h projects/diffused_head/sys/dev/drm2/drm_context.c projects/diffused_head/sys/dev/drm2/drm_crtc.c projects/diffused_head/sys/dev/drm2/drm_crtc.h projects/diffused_head/sys/dev/drm2/drm_crtc_helper.h projects/diffused_head/sys/dev/drm2/drm_dp_helper.h projects/diffused_head/sys/dev/drm2/drm_dp_iic_helper.c projects/diffused_head/sys/dev/drm2/drm_drv.c projects/diffused_head/sys/dev/drm2/drm_edid.c projects/diffused_head/sys/dev/drm2/drm_gem.c projects/diffused_head/sys/dev/drm2/drm_gem_names.c projects/diffused_head/sys/dev/drm2/drm_ioctl.c projects/diffused_head/sys/dev/drm2/drm_irq.c projects/diffused_head/sys/dev/drm2/drm_linux_list.h projects/diffused_head/sys/dev/drm2/drm_pci.c projects/diffused_head/sys/dev/drm2/drm_pciids.h projects/diffused_head/sys/dev/drm2/drm_sysctl.c projects/diffused_head/sys/dev/drm2/i915/i915_gem.c projects/diffused_head/sys/dev/drm2/i915/i915_gem_execbuffer.c projects/diffused_head/sys/dev/drm2/i915/intel_crt.c projects/diffused_head/sys/dev/drm2/i915/intel_display.c projects/diffused_head/sys/dev/drm2/i915/intel_dp.c projects/diffused_head/sys/dev/drm2/i915/intel_drv.h projects/diffused_head/sys/dev/drm2/i915/intel_hdmi.c projects/diffused_head/sys/dev/drm2/i915/intel_lvds.c projects/diffused_head/sys/dev/drm2/i915/intel_panel.c projects/diffused_head/sys/dev/drm2/i915/intel_sdvo.c projects/diffused_head/sys/dev/drm2/i915/intel_tv.c projects/diffused_head/sys/dev/drm2/ttm/ttm_bo.c projects/diffused_head/sys/dev/drm2/ttm/ttm_bo_driver.h projects/diffused_head/sys/dev/drm2/ttm/ttm_bo_util.c projects/diffused_head/sys/dev/drm2/ttm/ttm_bo_vm.c projects/diffused_head/sys/dev/drm2/ttm/ttm_execbuf_util.c projects/diffused_head/sys/dev/drm2/ttm/ttm_page_alloc.c projects/diffused_head/sys/dev/drm2/ttm/ttm_tt.c projects/diffused_head/sys/dev/e1000/if_igb.c projects/diffused_head/sys/dev/fb/vesa.c projects/diffused_head/sys/dev/fdc/fdc.c projects/diffused_head/sys/dev/flash/mx25l.c projects/diffused_head/sys/dev/gpio/gpiobus.c projects/diffused_head/sys/dev/hatm/if_hatm_intr.c projects/diffused_head/sys/dev/hwpmc/hwpmc_core.c projects/diffused_head/sys/dev/hwpmc/hwpmc_mod.c projects/diffused_head/sys/dev/hwpmc/pmc_events.h projects/diffused_head/sys/dev/if_ndis/if_ndis.c projects/diffused_head/sys/dev/iwn/if_iwn.c projects/diffused_head/sys/dev/ixgbe/ixgbe.c projects/diffused_head/sys/dev/ixgbe/ixv.c projects/diffused_head/sys/dev/jme/if_jme.c projects/diffused_head/sys/dev/lge/if_lge.c projects/diffused_head/sys/dev/mfi/mfi_cam.c projects/diffused_head/sys/dev/mmc/mmc.c projects/diffused_head/sys/dev/mwl/if_mwl.c projects/diffused_head/sys/dev/nfe/if_nfe.c projects/diffused_head/sys/dev/patm/if_patm.c projects/diffused_head/sys/dev/patm/if_patm_tx.c projects/diffused_head/sys/dev/pci/pcivar.h projects/diffused_head/sys/dev/pci/vga_pci.c projects/diffused_head/sys/dev/qlxgb/qla_hw.c projects/diffused_head/sys/dev/qlxgbe/ql_misc.c projects/diffused_head/sys/dev/qlxgbe/ql_os.c projects/diffused_head/sys/dev/sfxge/sfxge_rx.c projects/diffused_head/sys/dev/uart/uart_dev_ns8250.c projects/diffused_head/sys/dev/usb/controller/dwc_otg.c projects/diffused_head/sys/dev/usb/controller/musb_otg.c projects/diffused_head/sys/dev/wb/if_wb.c projects/diffused_head/sys/dev/xen/balloon/balloon.c projects/diffused_head/sys/dev/xen/blkback/blkback.c projects/diffused_head/sys/dev/xen/blkfront/blkfront.c projects/diffused_head/sys/dev/xen/blkfront/block.h projects/diffused_head/sys/dev/xen/console/console.c projects/diffused_head/sys/dev/xen/console/xencons_ring.c projects/diffused_head/sys/dev/xen/control/control.c projects/diffused_head/sys/dev/xen/netback/netback.c projects/diffused_head/sys/dev/xen/netfront/netfront.c projects/diffused_head/sys/dev/xen/xenpci/xenpci.c projects/diffused_head/sys/dev/xen/xenpci/xenpcivar.h projects/diffused_head/sys/fs/nfs/nfs.h projects/diffused_head/sys/fs/tmpfs/tmpfs_subr.c projects/diffused_head/sys/fs/tmpfs/tmpfs_vfsops.c projects/diffused_head/sys/geom/geom_disk.c projects/diffused_head/sys/geom/zero/g_zero.c projects/diffused_head/sys/i386/i386/apic_vector.s projects/diffused_head/sys/i386/i386/genassym.c projects/diffused_head/sys/i386/i386/machdep.c projects/diffused_head/sys/i386/i386/mp_machdep.c projects/diffused_head/sys/i386/i386/pmap.c projects/diffused_head/sys/i386/include/apicvar.h projects/diffused_head/sys/i386/include/intr_machdep.h projects/diffused_head/sys/i386/include/pcpu.h projects/diffused_head/sys/i386/include/pmap.h projects/diffused_head/sys/i386/include/xen/xen-os.h projects/diffused_head/sys/i386/include/xen/xenfunc.h projects/diffused_head/sys/i386/include/xen/xenvar.h projects/diffused_head/sys/i386/isa/npx.c projects/diffused_head/sys/i386/xen/clock.c projects/diffused_head/sys/i386/xen/exception.s projects/diffused_head/sys/i386/xen/locore.s projects/diffused_head/sys/i386/xen/mp_machdep.c projects/diffused_head/sys/i386/xen/mptable.c projects/diffused_head/sys/i386/xen/pmap.c projects/diffused_head/sys/i386/xen/xen_machdep.c projects/diffused_head/sys/ia64/ia64/pmap.c projects/diffused_head/sys/kern/kern_event.c projects/diffused_head/sys/kern/kern_jail.c projects/diffused_head/sys/kern/kern_linker.c projects/diffused_head/sys/kern/kern_mbuf.c projects/diffused_head/sys/kern/kern_physio.c projects/diffused_head/sys/kern/kern_proc.c projects/diffused_head/sys/kern/link_elf.c projects/diffused_head/sys/kern/subr_mbpool.c projects/diffused_head/sys/kern/subr_taskqueue.c projects/diffused_head/sys/kern/uipc_cow.c projects/diffused_head/sys/kern/uipc_mbuf.c projects/diffused_head/sys/kern/uipc_socket.c projects/diffused_head/sys/kern/uipc_syscalls.c projects/diffused_head/sys/kern/vfs_bio.c projects/diffused_head/sys/kern/vfs_cluster.c projects/diffused_head/sys/mips/atheros/ar71xx_spi.c projects/diffused_head/sys/mips/atheros/if_arge.c projects/diffused_head/sys/mips/conf/DIR-825.hints projects/diffused_head/sys/mips/conf/ROUTERSTATION.hints projects/diffused_head/sys/mips/malta/gt_pci.c projects/diffused_head/sys/mips/malta/yamon.c projects/diffused_head/sys/mips/mips/pmap.c projects/diffused_head/sys/modules/Makefile projects/diffused_head/sys/modules/drm2/Makefile projects/diffused_head/sys/modules/drm2/drm2/Makefile projects/diffused_head/sys/modules/ip6_mroute_mod/Makefile projects/diffused_head/sys/modules/linux/Makefile projects/diffused_head/sys/modules/rdma/Makefile projects/diffused_head/sys/net/if.h projects/diffused_head/sys/net/if_fddisubr.c projects/diffused_head/sys/net/if_iso88025subr.c projects/diffused_head/sys/net/if_lagg.c projects/diffused_head/sys/net/if_lagg.h projects/diffused_head/sys/net/if_llatbl.h projects/diffused_head/sys/net/if_pfsync.h projects/diffused_head/sys/net/pfil.c projects/diffused_head/sys/net/pfil.h projects/diffused_head/sys/net80211/ieee80211_output.c projects/diffused_head/sys/net80211/ieee80211_proto.h projects/diffused_head/sys/net80211/ieee80211_superg.c projects/diffused_head/sys/netinet/icmp_var.h projects/diffused_head/sys/netinet/igmp.c projects/diffused_head/sys/netinet/igmp_var.h projects/diffused_head/sys/netinet/in.h projects/diffused_head/sys/netinet/ip_fastfwd.c projects/diffused_head/sys/netinet/ip_input.c projects/diffused_head/sys/netinet/ip_output.c projects/diffused_head/sys/netinet/pim_var.h projects/diffused_head/sys/netinet/sctp_input.c projects/diffused_head/sys/netinet/sctp_structs.h projects/diffused_head/sys/netinet/sctp_uio.h projects/diffused_head/sys/netinet/tcp_input.c projects/diffused_head/sys/netinet/tcp_lro.c projects/diffused_head/sys/netinet/tcp_lro.h projects/diffused_head/sys/netinet/tcp_output.c projects/diffused_head/sys/netinet/tcp_subr.c projects/diffused_head/sys/netinet/tcp_syncache.c projects/diffused_head/sys/netinet/tcp_usrreq.c projects/diffused_head/sys/netinet/tcp_var.h projects/diffused_head/sys/netinet/udp_usrreq.c projects/diffused_head/sys/netinet/udp_var.h projects/diffused_head/sys/netinet6/ip6_input.c projects/diffused_head/sys/netinet6/ip6_mroute.c projects/diffused_head/sys/netinet6/ip6_output.c projects/diffused_head/sys/netinet6/mld6.c projects/diffused_head/sys/netinet6/nd6.c projects/diffused_head/sys/netinet6/pim6_var.h projects/diffused_head/sys/netinet6/sctp6_usrreq.c projects/diffused_head/sys/netinet6/send.c projects/diffused_head/sys/netinet6/udp6_usrreq.c projects/diffused_head/sys/netipsec/ipsec.h projects/diffused_head/sys/netipsec/key_var.h projects/diffused_head/sys/netpfil/ipfw/ip_dummynet.c projects/diffused_head/sys/netpfil/ipfw/ip_fw2.c projects/diffused_head/sys/netpfil/ipfw/ip_fw_nat.c projects/diffused_head/sys/netpfil/ipfw/ip_fw_private.h projects/diffused_head/sys/ofed/drivers/net/mlx4/en_frag.c projects/diffused_head/sys/ofed/include/linux/net.h projects/diffused_head/sys/pc98/pc98/machdep.c projects/diffused_head/sys/powerpc/aim/mmu_oea.c projects/diffused_head/sys/powerpc/aim/mmu_oea64.c projects/diffused_head/sys/powerpc/booke/pmap.c projects/diffused_head/sys/powerpc/powermac/kiic.c projects/diffused_head/sys/powerpc/powerpc/mmu_if.m projects/diffused_head/sys/powerpc/powerpc/pmap_dispatch.c projects/diffused_head/sys/sparc64/sparc64/pmap.c projects/diffused_head/sys/sys/buf.h projects/diffused_head/sys/sys/callout.h projects/diffused_head/sys/sys/conf.h projects/diffused_head/sys/sys/eventhandler.h projects/diffused_head/sys/sys/fcntl.h projects/diffused_head/sys/sys/jail.h projects/diffused_head/sys/sys/kernel.h projects/diffused_head/sys/sys/mbpool.h projects/diffused_head/sys/sys/mbuf.h projects/diffused_head/sys/sys/mount.h projects/diffused_head/sys/sys/param.h projects/diffused_head/sys/sys/pmckern.h projects/diffused_head/sys/sys/sf_buf.h projects/diffused_head/sys/sys/socket.h projects/diffused_head/sys/sys/sysctl.h projects/diffused_head/sys/sys/user.h projects/diffused_head/sys/ufs/ffs/ffs_alloc.c projects/diffused_head/sys/ufs/ufs/ufs_dirhash.c projects/diffused_head/sys/vm/pmap.h projects/diffused_head/sys/vm/vm_map.c projects/diffused_head/sys/vm/vm_page.c projects/diffused_head/sys/vm/vm_radix.c projects/diffused_head/sys/vm/vm_radix.h projects/diffused_head/sys/x86/include/segments.h projects/diffused_head/sys/x86/x86/local_apic.c projects/diffused_head/sys/xen/evtchn.h projects/diffused_head/sys/xen/evtchn/evtchn_dev.c projects/diffused_head/sys/xen/features.c projects/diffused_head/sys/xen/gnttab.c projects/diffused_head/sys/xen/gnttab.h projects/diffused_head/sys/xen/hvm.h projects/diffused_head/sys/xen/interface/event_channel.h projects/diffused_head/sys/xen/xen_intr.h projects/diffused_head/sys/xen/xenbus/xenbus.c projects/diffused_head/sys/xen/xenbus/xenbus_if.m projects/diffused_head/sys/xen/xenbus/xenbusb_front.c projects/diffused_head/sys/xen/xenbus/xenbusvar.h projects/diffused_head/sys/xen/xenstore/xenstore.c projects/diffused_head/sys/xen/xenstore/xenstore_dev.c projects/diffused_head/sys/xen/xenstore/xenstorevar.h projects/diffused_head/tools/tools/README projects/diffused_head/usr.bin/brandelf/brandelf.1 projects/diffused_head/usr.bin/dtc/dtc.1 projects/diffused_head/usr.bin/kdump/kdump.c projects/diffused_head/usr.bin/kdump/mksubr projects/diffused_head/usr.bin/patch/Makefile projects/diffused_head/usr.sbin/bhyve/pci_emul.c projects/diffused_head/usr.sbin/bhyve/pci_virtio_block.c projects/diffused_head/usr.sbin/crashinfo/crashinfo.sh projects/diffused_head/usr.sbin/jail/jail.8 projects/diffused_head/usr.sbin/mfiutil/mfi_drive.c projects/diffused_head/usr.sbin/mfiutil/mfiutil.8 projects/diffused_head/usr.sbin/mfiutil/mfiutil.c projects/diffused_head/usr.sbin/periodic/periodic.sh projects/diffused_head/usr.sbin/rtadvd/config.c Directory Properties: projects/diffused_head/ (props changed) projects/diffused_head/cddl/ (props changed) projects/diffused_head/cddl/contrib/opensolaris/ (props changed) projects/diffused_head/cddl/contrib/opensolaris/lib/libzfs/ (props changed) projects/diffused_head/contrib/llvm/ (props changed) projects/diffused_head/lib/libc/ (props changed) projects/diffused_head/lib/libutil/ (props changed) projects/diffused_head/sbin/ (props changed) projects/diffused_head/share/man/man4/ (props changed) projects/diffused_head/sys/ (props changed) projects/diffused_head/sys/amd64/include/xen/ (props changed) projects/diffused_head/sys/amd64/vmm/ (props changed) projects/diffused_head/sys/boot/ (props changed) projects/diffused_head/sys/cddl/contrib/opensolaris/ (props changed) projects/diffused_head/sys/conf/ (props changed) projects/diffused_head/sys/contrib/dev/acpica/ (props changed) projects/diffused_head/sys/contrib/dev/acpica/common/ (props changed) projects/diffused_head/sys/contrib/dev/acpica/compiler/ (props changed) projects/diffused_head/sys/contrib/dev/acpica/components/debugger/ (props changed) projects/diffused_head/sys/contrib/dev/acpica/components/events/ (props changed) projects/diffused_head/sys/contrib/dev/acpica/components/hardware/ (props changed) projects/diffused_head/sys/contrib/dev/acpica/components/namespace/ (props changed) projects/diffused_head/sys/contrib/dev/acpica/components/tables/ (props changed) projects/diffused_head/sys/contrib/dev/acpica/components/utilities/ (props changed) projects/diffused_head/sys/contrib/dev/acpica/include/ (props changed) projects/diffused_head/sys/contrib/dev/acpica/os_specific/ (props changed) projects/diffused_head/usr.sbin/bhyve/ (props changed) projects/diffused_head/usr.sbin/jail/ (props changed) projects/diffused_head/usr.sbin/rtadvd/ (props changed) Modified: projects/diffused_head/ObsoleteFiles.inc ============================================================================== --- projects/diffused_head/ObsoleteFiles.inc Fri Aug 30 01:32:47 2013 (r255048) +++ projects/diffused_head/ObsoleteFiles.inc Fri Aug 30 01:33:26 2013 (r255049) @@ -38,6 +38,17 @@ # xargs -n1 | sort | uniq -d; # done +# 20130829: bsdpatch is patch unconditionally +OLD_FILES+=usr/bin/bsdpatch +OLD_FILES+=usr/share/man/man1/bsdpatch.1.gz +# 20130822: bind 9.9.3-P2 import +OLD_LIBS+=usr/lib/liblwres.so.80 +# 20130814: vm_page_busy(9) +OLD_FILES+=usr/share/man/man9/vm_page_flash.9.gz +OLD_FILES+=usr/share/man/man9/vm_page_io.9.gz +OLD_FILES+=usr/share/man/man9/vm_page_io_finish.9.gz +OLD_FILES+=usr/share/man/man9/vm_page_io_start.9.gz +OLD_FILES+=usr/share/man/man9/vm_page_wakeup.9.gz # 20130710: libkvm version bump OLD_LIBS+=lib/libkvm.so.5 OLD_LIBS+=usr/lib32/libkvm.so.5 @@ -114,6 +125,7 @@ OLD_FILES+=usr/include/clang/3.2/xmmintr OLD_FILES+=usr/include/clang/3.2/xopintrin.h OLD_DIRS+=usr/include/clang/3.2 # 20130404: legacy ATA stack removed +OLD_FILES+=etc/periodic/daily/405.status-ata-raid OLD_FILES+=rescue/atacontrol OLD_FILES+=sbin/atacontrol OLD_FILES+=usr/share/man/man8/atacontrol.8.gz Modified: projects/diffused_head/UPDATING ============================================================================== --- projects/diffused_head/UPDATING Fri Aug 30 01:32:47 2013 (r255048) +++ projects/diffused_head/UPDATING Fri Aug 30 01:33:26 2013 (r255049) @@ -31,6 +31,19 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 10 disable the most expensive debugging functionality run "ln -s 'abort:false,junk:false' /etc/malloc.conf".) +20130827: + Thomas Dickey (vendor author thereof) reports that dialog(1) since + 2011/10/18 has a bug in handling --hline. Testers and I noticed the + --hline is not ignored but displayed as a NULL string, regardless of + value. This will cause confusion in some bsdconfig dialogs where the + --hline is used to inform users which keybindings to use. This will + likewise affect any other persons relying on --hline. It also looks + rather strange seeing "[]" at the bottom of dialog(1) widgets when + passing --hline "anything". Thomas said he will have a look in a few + weeks. NOTE: The "[]" brackets appear with the left-edge where it + would normally appear given the width of text to display, but the + displayed text is not there (part of the bug). + 20130821: The PADLOCK_RNG and RDRAND_RNG kernel options are now devices. Thus "device padlock_rng" and "device rdrand_rng" should be Modified: projects/diffused_head/bin/ps/keyword.c ============================================================================== --- projects/diffused_head/bin/ps/keyword.c Fri Aug 30 01:32:47 2013 (r255048) +++ projects/diffused_head/bin/ps/keyword.c Fri Aug 30 01:33:26 2013 (r255049) @@ -87,6 +87,7 @@ static VAR var[] = { {"etimes", "ELAPSED", NULL, USER, elapseds, 0, CHAR, NULL, 0}, {"euid", "", "uid", 0, NULL, 0, CHAR, NULL, 0}, {"f", "F", NULL, 0, kvar, KOFF(ki_flag), INT, "x", 0}, + {"fib", "FIB", NULL, 0, kvar, KOFF(ki_fibnum), INT, "d", 0}, {"flags", "", "f", 0, NULL, 0, CHAR, NULL, 0}, {"gid", "GID", NULL, 0, kvar, KOFF(ki_groups), UINT, UIDFMT, 0}, {"group", "GROUP", NULL, LJUST, egroupname, 0, CHAR, NULL, 0}, Modified: projects/diffused_head/bin/ps/ps.1 ============================================================================== --- projects/diffused_head/bin/ps/ps.1 Fri Aug 30 01:32:47 2013 (r255048) +++ projects/diffused_head/bin/ps/ps.1 Fri Aug 30 01:33:26 2013 (r255049) @@ -512,6 +512,9 @@ elapsed running time, format minutes:seconds. .It Cm etimes elapsed running time, in decimal integer seconds +.It Cm fib +default FIB number, see +.Xr setfib 1 .It Cm flags the process flags, in hexadecimal (alias .Cm f ) Modified: projects/diffused_head/bin/sh/alias.c ============================================================================== --- projects/diffused_head/bin/sh/alias.c Fri Aug 30 01:32:47 2013 (r255048) +++ projects/diffused_head/bin/sh/alias.c Fri Aug 30 01:33:26 2013 (r255049) @@ -237,17 +237,19 @@ printaliases(void) } int -aliascmd(int argc, char **argv) +aliascmd(int argc __unused, char **argv __unused) { char *n, *v; int ret = 0; struct alias *ap; - if (argc == 1) { + nextopt(""); + + if (*argptr == NULL) { printaliases(); return (0); } - while ((n = *++argv) != NULL) { + while ((n = *argptr++) != NULL) { if ((v = strchr(n+1, '=')) == NULL) /* n+1: funny ksh stuff */ if ((ap = lookupalias(n, 0)) == NULL) { warning("%s: not found", n); Modified: projects/diffused_head/bin/sh/arith_yylex.c ============================================================================== --- projects/diffused_head/bin/sh/arith_yylex.c Fri Aug 30 01:32:47 2013 (r255048) +++ projects/diffused_head/bin/sh/arith_yylex.c Fri Aug 30 01:33:26 2013 (r255049) @@ -218,9 +218,13 @@ checkeqcur: value += ARITH_REM - '%'; goto checkeq; case '+': + if (buf[1] == '+') + return ARITH_BAD; value += ARITH_ADD - '+'; goto checkeq; case '-': + if (buf[1] == '-') + return ARITH_BAD; value += ARITH_SUB - '-'; goto checkeq; case '~': Modified: projects/diffused_head/bin/sh/jobs.c ============================================================================== --- projects/diffused_head/bin/sh/jobs.c Fri Aug 30 01:32:47 2013 (r255048) +++ projects/diffused_head/bin/sh/jobs.c Fri Aug 30 01:33:26 2013 (r255049) @@ -495,14 +495,10 @@ waitcmdloop(struct job *job) in_waitcmd++; do { if (job != NULL) { - if (job->state) { + if (job->state == JOBDONE) { status = job->ps[job->nprocs - 1].status; if (WIFEXITED(status)) retval = WEXITSTATUS(status); -#if JOBS - else if (WIFSTOPPED(status)) - retval = WSTOPSIG(status) + 128; -#endif else retval = WTERMSIG(status) + 128; if (! iflag || ! job->changed) Modified: projects/diffused_head/bin/sh/parser.c ============================================================================== --- projects/diffused_head/bin/sh/parser.c Fri Aug 30 01:32:47 2013 (r255048) +++ projects/diffused_head/bin/sh/parser.c Fri Aug 30 01:33:26 2013 (r255049) @@ -573,7 +573,7 @@ TRACE(("expecting DO got %s %s\n", tokna synexpect(TEND); checkkwd = CHKKWD | CHKALIAS; break; - /* Handle an empty command like other simple commands. */ + /* A simple command must have at least one redirection or word. */ case TBACKGND: case TSEMI: case TAND: @@ -581,16 +581,12 @@ TRACE(("expecting DO got %s %s\n", tokna case TPIPE: case TENDCASE: case TFALLTHRU: - /* - * An empty command before a ; doesn't make much sense, and - * should certainly be disallowed in the case of `if ;'. - */ + case TEOF: + case TNL: + case TRP: if (!redir) synexpect(-1); - case TNL: - case TEOF: case TWORD: - case TRP: tokpushback++; n1 = simplecmd(rpp, redir); return n1; Modified: projects/diffused_head/cddl/contrib/opensolaris/cmd/zpool/zpool_main.c ============================================================================== --- projects/diffused_head/cddl/contrib/opensolaris/cmd/zpool/zpool_main.c Fri Aug 30 01:32:47 2013 (r255048) +++ projects/diffused_head/cddl/contrib/opensolaris/cmd/zpool/zpool_main.c Fri Aug 30 01:33:26 2013 (r255049) @@ -25,6 +25,7 @@ * Copyright (c) 2012 by Delphix. All rights reserved. * Copyright (c) 2012 by Frederik Wessels. All rights reserved. * Copyright (c) 2012 Martin Matuska . All rights reserved. + * Copyright (c) 2013 by Prasad Joshi (sTec). All rights reserved. */ #include @@ -2128,8 +2129,10 @@ zpool_do_import(int argc, char **argv) errno = 0; searchguid = strtoull(argv[0], &endptr, 10); - if (errno != 0 || *endptr != '\0') + if (errno != 0 || *endptr != '\0') { searchname = argv[0]; + searchguid = 0; + } found_config = NULL; /* Modified: projects/diffused_head/cddl/contrib/opensolaris/common/ctf/ctf_create.c ============================================================================== --- projects/diffused_head/cddl/contrib/opensolaris/common/ctf/ctf_create.c Fri Aug 30 01:32:47 2013 (r255048) +++ projects/diffused_head/cddl/contrib/opensolaris/common/ctf/ctf_create.c Fri Aug 30 01:33:26 2013 (r255049) @@ -24,13 +24,15 @@ * Copyright 2006 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ - -#pragma ident "%Z%%M% %I% %E% SMI" +/* + * Copyright (c) 2013, Joyent, Inc. All rights reserved. + */ #include #include #include #include +#include /* * This static string is used as the template for initially populating a @@ -167,6 +169,51 @@ ctf_copy_membnames(ctf_dtdef_t *dtd, uch } /* + * Only types of dyanmic CTF containers contain reference counts. These + * containers are marked RD/WR. Because of that we basically make this a no-op + * for compatability with non-dynamic CTF sections. This is also a no-op for + * types which are not dynamic types. It is the responsibility of the caller to + * make sure it is a valid type. We help that caller out on debug builds. + * + * Note that the reference counts are not maintained for types that are not + * within this container. In other words if we have a type in a parent, that + * will not have its reference count increased. On the flip side, the parent + * will not be allowed to remove dynamic types if it has children. + */ +static void +ctf_ref_inc(ctf_file_t *fp, ctf_id_t tid) +{ + ctf_dtdef_t *dtd = ctf_dtd_lookup(fp, tid); + + if (dtd == NULL) + return; + + if (!(fp->ctf_flags & LCTF_RDWR)) + return; + + dtd->dtd_ref++; +} + +/* + * Just as with ctf_ref_inc, this is a no-op on non-writeable containers and the + * caller should ensure that this is already a valid type. + */ +static void +ctf_ref_dec(ctf_file_t *fp, ctf_id_t tid) +{ + ctf_dtdef_t *dtd = ctf_dtd_lookup(fp, tid); + + if (dtd == NULL) + return; + + if (!(fp->ctf_flags & LCTF_RDWR)) + return; + + ASSERT(dtd->dtd_ref >= 1); + dtd->dtd_ref--; +} + +/* * If the specified CTF container is writable and has been modified, reload * this container with the updated type definitions. In order to make this * code and the rest of libctf as simple as possible, we perform updates by @@ -180,6 +227,10 @@ ctf_copy_membnames(ctf_dtdef_t *dtd, uch * ctf_bufopen() will return a new ctf_file_t, but we want to keep the fp * constant for the caller, so after ctf_bufopen() returns, we use bcopy to * swap the interior of the old and new ctf_file_t's, and then free the old. + * + * Note that the lists of dynamic types stays around and the resulting container + * is still writeable. Furthermore, the reference counts that are on the dtd's + * are still valid. */ int ctf_update(ctf_file_t *fp) @@ -432,6 +483,7 @@ ctf_dtd_delete(ctf_file_t *fp, ctf_dtdef ctf_dtdef_t *p, **q = &fp->ctf_dthash[h]; ctf_dmdef_t *dmd, *nmd; size_t len; + int kind, i; for (p = *q; p != NULL; p = p->dtd_hash) { if (p != dtd) @@ -443,7 +495,8 @@ ctf_dtd_delete(ctf_file_t *fp, ctf_dtdef if (p != NULL) *q = p->dtd_hash; - switch (CTF_INFO_KIND(dtd->dtd_data.ctt_info)) { + kind = CTF_INFO_KIND(dtd->dtd_data.ctt_info); + switch (kind) { case CTF_K_STRUCT: case CTF_K_UNION: case CTF_K_ENUM: @@ -454,14 +507,33 @@ ctf_dtd_delete(ctf_file_t *fp, ctf_dtdef ctf_free(dmd->dmd_name, len); fp->ctf_dtstrlen -= len; } + if (kind != CTF_K_ENUM) + ctf_ref_dec(fp, dmd->dmd_type); nmd = ctf_list_next(dmd); ctf_free(dmd, sizeof (ctf_dmdef_t)); } break; case CTF_K_FUNCTION: + ctf_ref_dec(fp, dtd->dtd_data.ctt_type); + for (i = 0; i < CTF_INFO_VLEN(dtd->dtd_data.ctt_info); i++) + if (dtd->dtd_u.dtu_argv[i] != 0) + ctf_ref_dec(fp, dtd->dtd_u.dtu_argv[i]); ctf_free(dtd->dtd_u.dtu_argv, sizeof (ctf_id_t) * CTF_INFO_VLEN(dtd->dtd_data.ctt_info)); break; + case CTF_K_ARRAY: + ctf_ref_dec(fp, dtd->dtd_u.dtu_arr.ctr_contents); + ctf_ref_dec(fp, dtd->dtd_u.dtu_arr.ctr_index); + break; + case CTF_K_TYPEDEF: + ctf_ref_dec(fp, dtd->dtd_data.ctt_type); + break; + case CTF_K_POINTER: + case CTF_K_VOLATILE: + case CTF_K_CONST: + case CTF_K_RESTRICT: + ctf_ref_dec(fp, dtd->dtd_data.ctt_type); + break; } if (dtd->dtd_name) { @@ -495,7 +567,9 @@ ctf_dtd_lookup(ctf_file_t *fp, ctf_id_t * Discard all of the dynamic type definitions that have been added to the * container since the last call to ctf_update(). We locate such types by * scanning the list and deleting elements that have type IDs greater than - * ctf_dtoldid, which is set by ctf_update(), above. + * ctf_dtoldid, which is set by ctf_update(), above. Note that to work properly + * with our reference counting schemes, we must delete the dynamic list in + * reverse. */ int ctf_discard(ctf_file_t *fp) @@ -508,11 +582,11 @@ ctf_discard(ctf_file_t *fp) if (!(fp->ctf_flags & LCTF_DIRTY)) return (0); /* no update required */ - for (dtd = ctf_list_next(&fp->ctf_dtdefs); dtd != NULL; dtd = ntd) { + for (dtd = ctf_list_prev(&fp->ctf_dtdefs); dtd != NULL; dtd = ntd) { if (dtd->dtd_type <= fp->ctf_dtoldid) continue; /* skip types that have been committed */ - ntd = ctf_list_next(dtd); + ntd = ctf_list_prev(dtd); ctf_dtd_delete(fp, dtd); } @@ -614,6 +688,8 @@ ctf_add_reftype(ctf_file_t *fp, uint_t f if ((type = ctf_add_generic(fp, flag, NULL, &dtd)) == CTF_ERR) return (CTF_ERR); /* errno is set for us */ + ctf_ref_inc(fp, ref); + dtd->dtd_data.ctt_info = CTF_TYPE_INFO(kind, flag, 0); dtd->dtd_data.ctt_type = (ushort_t)ref; @@ -645,16 +721,29 @@ ctf_add_array(ctf_file_t *fp, uint_t fla { ctf_dtdef_t *dtd; ctf_id_t type; + ctf_file_t *fpd; if (arp == NULL) return (ctf_set_errno(fp, EINVAL)); + fpd = fp; + if (ctf_lookup_by_id(&fpd, arp->ctr_contents) == NULL && + ctf_dtd_lookup(fp, arp->ctr_contents) == NULL) + return (ctf_set_errno(fp, ECTF_BADID)); + + fpd = fp; + if (ctf_lookup_by_id(&fpd, arp->ctr_index) == NULL && + ctf_dtd_lookup(fp, arp->ctr_index) == NULL) + return (ctf_set_errno(fp, ECTF_BADID)); + if ((type = ctf_add_generic(fp, flag, NULL, &dtd)) == CTF_ERR) return (CTF_ERR); /* errno is set for us */ dtd->dtd_data.ctt_info = CTF_TYPE_INFO(CTF_K_ARRAY, flag, 0); dtd->dtd_data.ctt_size = 0; dtd->dtd_u.dtu_arr = *arp; + ctf_ref_inc(fp, arp->ctr_contents); + ctf_ref_inc(fp, arp->ctr_index); return (type); } @@ -662,6 +751,7 @@ ctf_add_array(ctf_file_t *fp, uint_t fla int ctf_set_array(ctf_file_t *fp, ctf_id_t type, const ctf_arinfo_t *arp) { + ctf_file_t *fpd; ctf_dtdef_t *dtd = ctf_dtd_lookup(fp, type); if (!(fp->ctf_flags & LCTF_RDWR)) @@ -670,8 +760,22 @@ ctf_set_array(ctf_file_t *fp, ctf_id_t t if (dtd == NULL || CTF_INFO_KIND(dtd->dtd_data.ctt_info) != CTF_K_ARRAY) return (ctf_set_errno(fp, ECTF_BADID)); + fpd = fp; + if (ctf_lookup_by_id(&fpd, arp->ctr_contents) == NULL && + ctf_dtd_lookup(fp, arp->ctr_contents) == NULL) + return (ctf_set_errno(fp, ECTF_BADID)); + + fpd = fp; + if (ctf_lookup_by_id(&fpd, arp->ctr_index) == NULL && + ctf_dtd_lookup(fp, arp->ctr_index) == NULL) + return (ctf_set_errno(fp, ECTF_BADID)); + + ctf_ref_dec(fp, dtd->dtd_u.dtu_arr.ctr_contents); + ctf_ref_dec(fp, dtd->dtd_u.dtu_arr.ctr_index); fp->ctf_flags |= LCTF_DIRTY; dtd->dtd_u.dtu_arr = *arp; + ctf_ref_inc(fp, arp->ctr_contents); + ctf_ref_inc(fp, arp->ctr_index); return (0); } @@ -683,7 +787,9 @@ ctf_add_function(ctf_file_t *fp, uint_t ctf_dtdef_t *dtd; ctf_id_t type; uint_t vlen; + int i; ctf_id_t *vdat = NULL; + ctf_file_t *fpd; if (ctc == NULL || (ctc->ctc_flags & ~CTF_FUNC_VARARG) != 0 || (ctc->ctc_argc != 0 && argv == NULL)) @@ -696,6 +802,18 @@ ctf_add_function(ctf_file_t *fp, uint_t if (vlen > CTF_MAX_VLEN) return (ctf_set_errno(fp, EOVERFLOW)); + fpd = fp; + if (ctf_lookup_by_id(&fpd, ctc->ctc_return) == NULL && + ctf_dtd_lookup(fp, ctc->ctc_return) == NULL) + return (ctf_set_errno(fp, ECTF_BADID)); + + for (i = 0; i < ctc->ctc_argc; i++) { + fpd = fp; + if (ctf_lookup_by_id(&fpd, argv[i]) == NULL && + ctf_dtd_lookup(fp, argv[i]) == NULL) + return (ctf_set_errno(fp, ECTF_BADID)); + } + if (vlen != 0 && (vdat = ctf_alloc(sizeof (ctf_id_t) * vlen)) == NULL) return (ctf_set_errno(fp, EAGAIN)); @@ -707,6 +825,10 @@ ctf_add_function(ctf_file_t *fp, uint_t dtd->dtd_data.ctt_info = CTF_TYPE_INFO(CTF_K_FUNCTION, flag, vlen); dtd->dtd_data.ctt_type = (ushort_t)ctc->ctc_return; + ctf_ref_inc(fp, ctc->ctc_return); + for (i = 0; i < ctc->ctc_argc; i++) + ctf_ref_inc(fp, argv[i]); + bcopy(argv, vdat, sizeof (ctf_id_t) * ctc->ctc_argc); if (ctc->ctc_flags & CTF_FUNC_VARARG) vdat[vlen - 1] = 0; /* add trailing zero to indicate varargs */ @@ -825,8 +947,11 @@ ctf_add_typedef(ctf_file_t *fp, uint_t f { ctf_dtdef_t *dtd; ctf_id_t type; + ctf_file_t *fpd; - if (ref == CTF_ERR || ref < 0 || ref > CTF_MAX_TYPE) + fpd = fp; + if (ref == CTF_ERR || (ctf_lookup_by_id(&fpd, ref) == NULL && + ctf_dtd_lookup(fp, ref) == NULL)) return (ctf_set_errno(fp, EINVAL)); if ((type = ctf_add_generic(fp, flag, name, &dtd)) == CTF_ERR) @@ -834,6 +959,7 @@ ctf_add_typedef(ctf_file_t *fp, uint_t f dtd->dtd_data.ctt_info = CTF_TYPE_INFO(CTF_K_TYPEDEF, flag, 0); dtd->dtd_data.ctt_type = (ushort_t)ref; + ctf_ref_inc(fp, ref); return (type); } @@ -1008,6 +1134,45 @@ ctf_add_member(ctf_file_t *fp, ctf_id_t if (s != NULL) fp->ctf_dtstrlen += strlen(s) + 1; + ctf_ref_inc(fp, type); + fp->ctf_flags |= LCTF_DIRTY; + return (0); +} + +/* + * This removes a type from the dynamic section. This will fail if the type is + * referenced by another type. Note that the CTF ID is never reused currently by + * CTF. Note that if this container is a parent container then we just outright + * refuse to remove the type. There currently is no notion of searching for the + * ctf_dtdef_t in parent containers. If there is, then this constraint could + * become finer grained. + */ +int +ctf_delete_type(ctf_file_t *fp, ctf_id_t type) +{ + ctf_file_t *fpd; + ctf_dtdef_t *dtd = ctf_dtd_lookup(fp, type); + + if (!(fp->ctf_flags & LCTF_RDWR)) + return (ctf_set_errno(fp, ECTF_RDONLY)); + + /* + * We want to give as useful an errno as possible. That means that we + * want to distinguish between a type which does not exist and one for + * which the type is not dynamic. + */ + fpd = fp; + if (ctf_lookup_by_id(&fpd, type) == NULL && + ctf_dtd_lookup(fp, type) == NULL) + return (CTF_ERR); /* errno is set for us */ + + if (dtd == NULL) + return (ctf_set_errno(fp, ECTF_NOTDYN)); + + if (dtd->dtd_ref != 0 || fp->ctf_refcnt > 1) + return (ctf_set_errno(fp, ECTF_REFERENCED)); + + ctf_dtd_delete(fp, dtd); fp->ctf_flags |= LCTF_DIRTY; return (0); } @@ -1103,6 +1268,9 @@ ctf_add_type(ctf_file_t *dst_fp, ctf_fil ctf_hash_t *hp; ctf_helem_t *hep; + if (dst_fp == src_fp) + return (src_type); + if (!(dst_fp->ctf_flags & LCTF_RDWR)) return (ctf_set_errno(dst_fp, ECTF_RDONLY)); @@ -1313,6 +1481,14 @@ ctf_add_type(ctf_file_t *dst_fp, ctf_fil if (errs) return (CTF_ERR); /* errno is set for us */ + + /* + * Now that we know that we can't fail, we go through and bump + * all the reference counts on the member types. + */ + for (dmd = ctf_list_next(&dtd->dtd_u.dtu_members); + dmd != NULL; dmd = ctf_list_next(dmd)) + ctf_ref_inc(dst_fp, dmd->dmd_type); break; } Modified: projects/diffused_head/cddl/contrib/opensolaris/common/ctf/ctf_error.c ============================================================================== --- projects/diffused_head/cddl/contrib/opensolaris/common/ctf/ctf_error.c Fri Aug 30 01:32:47 2013 (r255048) +++ projects/diffused_head/cddl/contrib/opensolaris/common/ctf/ctf_error.c Fri Aug 30 01:33:26 2013 (r255049) @@ -23,8 +23,9 @@ * Copyright 2003 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ - -#pragma ident "%Z%%M% %I% %E% SMI" +/* + * Copyright (c) 2012, Joyent, Inc. + */ #include @@ -73,6 +74,8 @@ static const char *const _ctf_errlist[] "Limit on number of dynamic types reached", /* ECTF_FULL */ "Duplicate member name definition", /* ECTF_DUPMEMBER */ "Conflicting type is already defined", /* ECTF_CONFLICT */ + "Type has outstanding references", /* ECTF_REFERENCED */ + "Type is not a dynamic type" /* ECTF_NOTDYN */ }; static const int _ctf_nerr = sizeof (_ctf_errlist) / sizeof (_ctf_errlist[0]); Modified: projects/diffused_head/cddl/contrib/opensolaris/common/ctf/ctf_impl.h ============================================================================== --- projects/diffused_head/cddl/contrib/opensolaris/common/ctf/ctf_impl.h Fri Aug 30 01:32:47 2013 (r255048) +++ projects/diffused_head/cddl/contrib/opensolaris/common/ctf/ctf_impl.h Fri Aug 30 01:33:26 2013 (r255049) @@ -24,12 +24,13 @@ * Copyright 2006 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ +/* + * Copyright (c) 2012, Joyent, Inc. All rights reserved. + */ #ifndef _CTF_IMPL_H #define _CTF_IMPL_H -#pragma ident "%Z%%M% %I% %E% SMI" - #include #include #include @@ -149,6 +150,7 @@ typedef struct ctf_dtdef { char *dtd_name; /* name associated with definition (if any) */ ctf_id_t dtd_type; /* type identifier for this definition */ ctf_type_t dtd_data; /* type node (see ) */ + int dtd_ref; /* recfount for dyanmic types */ union { ctf_list_t dtu_members; /* struct, union, or enum */ ctf_arinfo_t dtu_arr; /* array */ @@ -269,7 +271,9 @@ enum { ECTF_DTFULL, /* CTF type is full (no more members allowed) */ ECTF_FULL, /* CTF container is full */ ECTF_DUPMEMBER, /* duplicate member name definition */ - ECTF_CONFLICT /* conflicting type definition present */ + ECTF_CONFLICT, /* conflicting type definition present */ + ECTF_REFERENCED, /* type has outstanding references */ + ECTF_NOTDYN /* type is not a dynamic type */ }; extern ssize_t ctf_get_ctt_size(const ctf_file_t *, const ctf_type_t *, Modified: projects/diffused_head/cddl/contrib/opensolaris/common/ctf/ctf_open.c ============================================================================== --- projects/diffused_head/cddl/contrib/opensolaris/common/ctf/ctf_open.c Fri Aug 30 01:32:47 2013 (r255048) +++ projects/diffused_head/cddl/contrib/opensolaris/common/ctf/ctf_open.c Fri Aug 30 01:33:26 2013 (r255049) @@ -24,8 +24,9 @@ * Copyright 2006 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ - -#pragma ident "%Z%%M% %I% %E% SMI" +/* + * Copyright (c) 2012, Joyent, Inc. All rights reserved. + */ #include #include @@ -810,8 +811,12 @@ ctf_close(ctf_file_t *fp) if (fp->ctf_parent != NULL) ctf_close(fp->ctf_parent); - for (dtd = ctf_list_next(&fp->ctf_dtdefs); dtd != NULL; dtd = ntd) { - ntd = ctf_list_next(dtd); + /* + * Note, to work properly with reference counting on the dynamic + * section, we must delete the list in reverse. + */ + for (dtd = ctf_list_prev(&fp->ctf_dtdefs); dtd != NULL; dtd = ntd) { + ntd = ctf_list_prev(dtd); ctf_dtd_delete(fp, dtd); } Modified: projects/diffused_head/cddl/contrib/opensolaris/lib/libctf/common/ctf_lib.c ============================================================================== --- projects/diffused_head/cddl/contrib/opensolaris/lib/libctf/common/ctf_lib.c Fri Aug 30 01:32:47 2013 (r255048) +++ projects/diffused_head/cddl/contrib/opensolaris/lib/libctf/common/ctf_lib.c Fri Aug 30 01:33:26 2013 (r255049) @@ -216,6 +216,7 @@ ctf_fdopen(int fd, int *errp) { ctf_sect_t ctfsect, symsect, strsect; ctf_file_t *fp = NULL; + size_t shstrndx, shnum; struct stat64 st; ssize_t nbytes; @@ -278,11 +279,10 @@ ctf_fdopen(int fd, int *errp) #else uchar_t order = ELFDATA2LSB; #endif - GElf_Half i, n; GElf_Shdr *sp; void *strs_map; - size_t strs_mapsz; + size_t strs_mapsz, i; char *strs; if (hdr.e32.e_ident[EI_DATA] != order) @@ -298,11 +298,38 @@ ctf_fdopen(int fd, int *errp) ehdr_to_gelf(&e32, &hdr.e64); } - if (hdr.e64.e_shstrndx >= hdr.e64.e_shnum) + shnum = hdr.e64.e_shnum; + shstrndx = hdr.e64.e_shstrndx; + + /* Extended ELF sections */ + if ((shstrndx == SHN_XINDEX) || (shnum == 0)) { + if (hdr.e32.e_ident[EI_CLASS] == ELFCLASS32) { + Elf32_Shdr x32; + + if (pread64(fd, &x32, sizeof (x32), + hdr.e64.e_shoff) != sizeof (x32)) + return (ctf_set_open_errno(errp, + errno)); + + shnum = x32.sh_size; + shstrndx = x32.sh_link; + } else { + Elf64_Shdr x64; + + if (pread64(fd, &x64, sizeof (x64), + hdr.e64.e_shoff) != sizeof (x64)) + return (ctf_set_open_errno(errp, + errno)); + + shnum = x64.sh_size; + shstrndx = x64.sh_link; + } + } + + if (shstrndx >= shnum) return (ctf_set_open_errno(errp, ECTF_CORRUPT)); - n = hdr.e64.e_shnum; - nbytes = sizeof (GElf_Shdr) * n; + nbytes = sizeof (GElf_Shdr) * shnum; if ((sp = malloc(nbytes)) == NULL) return (ctf_set_open_errno(errp, errno)); @@ -314,7 +341,7 @@ ctf_fdopen(int fd, int *errp) if (hdr.e32.e_ident[EI_CLASS] == ELFCLASS32) { Elf32_Shdr *sp32; - nbytes = sizeof (Elf32_Shdr) * n; + nbytes = sizeof (Elf32_Shdr) * shnum; if ((sp32 = malloc(nbytes)) == NULL || pread64(fd, sp32, nbytes, hdr.e64.e_shoff) != nbytes) { @@ -322,7 +349,7 @@ ctf_fdopen(int fd, int *errp) return (ctf_set_open_errno(errp, errno)); } - for (i = 0; i < n; i++) + for (i = 0; i < shnum; i++) shdr_to_gelf(&sp32[i], &sp[i]); free(sp32); @@ -336,14 +363,14 @@ ctf_fdopen(int fd, int *errp) * Now mmap the section header strings section so that we can * perform string comparison on the section names. */ - strs_mapsz = sp[hdr.e64.e_shstrndx].sh_size + - (sp[hdr.e64.e_shstrndx].sh_offset & ~_PAGEMASK); + strs_mapsz = sp[shstrndx].sh_size + + (sp[shstrndx].sh_offset & ~_PAGEMASK); strs_map = mmap64(NULL, strs_mapsz, PROT_READ, MAP_PRIVATE, - fd, sp[hdr.e64.e_shstrndx].sh_offset & _PAGEMASK); + fd, sp[shstrndx].sh_offset & _PAGEMASK); strs = (char *)strs_map + - (sp[hdr.e64.e_shstrndx].sh_offset & ~_PAGEMASK); + (sp[shstrndx].sh_offset & ~_PAGEMASK); if (strs_map == MAP_FAILED) { free(sp); @@ -354,15 +381,15 @@ ctf_fdopen(int fd, int *errp) * Iterate over the section header array looking for the CTF * section and symbol table. The strtab is linked to symtab. */ - for (i = 0; i < n; i++) { + for (i = 0; i < shnum; i++) { const GElf_Shdr *shp = &sp[i]; const GElf_Shdr *lhp = &sp[shp->sh_link]; - if (shp->sh_link >= hdr.e64.e_shnum) + if (shp->sh_link >= shnum) continue; /* corrupt sh_link field */ - if (shp->sh_name >= sp[hdr.e64.e_shstrndx].sh_size || - lhp->sh_name >= sp[hdr.e64.e_shstrndx].sh_size) + if (shp->sh_name >= sp[shstrndx].sh_size || + lhp->sh_name >= sp[shstrndx].sh_size) continue; /* corrupt sh_name field */ if (shp->sh_type == SHT_PROGBITS && Modified: projects/diffused_head/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_iter.c ============================================================================== --- projects/diffused_head/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_iter.c Fri Aug 30 01:32:47 2013 (r255048) +++ projects/diffused_head/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_iter.c Fri Aug 30 01:33:26 2013 (r255049) @@ -21,10 +21,10 @@ /* * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. - * Copyright 2010 Nexenta Systems, Inc. All rights reserved. * Copyright (c) 2012 by Delphix. All rights reserved. * Copyright (c) 2012 Pawel Jakub Dawidek . * All rights reserved. + * Copyright 2013 Nexenta Systems, Inc. All rights reserved. */ #include @@ -452,8 +452,12 @@ iter_dependents_cb(zfs_handle_t *zhp, vo } ida->stack = isf.next; } + if (!first && err == 0) err = ida->func(zhp, ida->data); + else + zfs_close(zhp); + return (err); } Modified: projects/diffused_head/cddl/contrib/opensolaris/tools/ctf/cvt/dwarf.c ============================================================================== --- projects/diffused_head/cddl/contrib/opensolaris/tools/ctf/cvt/dwarf.c Fri Aug 30 01:32:47 2013 (r255048) +++ projects/diffused_head/cddl/contrib/opensolaris/tools/ctf/cvt/dwarf.c Fri Aug 30 01:33:26 2013 (r255049) @@ -23,8 +23,6 @@ * Use is subject to license terms. */ -#pragma ident "%Z%%M% %I% %E% SMI" - /* * DWARF to tdata conversion * @@ -1796,6 +1794,59 @@ die_resolve(dwarf_t *dw) } while (dw->dw_nunres != 0); } +/* + * Any object containing a function or object symbol at any scope should also + * contain DWARF data. + */ +static boolean_t +should_have_dwarf(Elf *elf) +{ + Elf_Scn *scn = NULL; + Elf_Data *data = NULL; + GElf_Shdr shdr; + GElf_Sym sym; + uint32_t symdx = 0; + size_t nsyms = 0; + boolean_t found = B_FALSE; + + while ((scn = elf_nextscn(elf, scn)) != NULL) { + gelf_getshdr(scn, &shdr); + + if (shdr.sh_type == SHT_SYMTAB) { + found = B_TRUE; + break; + } + } + + if (!found) + terminate("cannot convert stripped objects\n"); + + data = elf_getdata(scn, NULL); + nsyms = shdr.sh_size / shdr.sh_entsize; + + for (symdx = 0; symdx < nsyms; symdx++) { + gelf_getsym(data, symdx, &sym); + + if ((GELF_ST_TYPE(sym.st_info) == STT_FUNC) || + (GELF_ST_TYPE(sym.st_info) == STT_TLS) || + (GELF_ST_TYPE(sym.st_info) == STT_OBJECT)) { + char *name; + + name = elf_strptr(elf, shdr.sh_link, sym.st_name); + + /* Studio emits these local symbols regardless */ + if ((strcmp(name, "Bbss.bss") != 0) && + (strcmp(name, "Ttbss.bss") != 0) && + (strcmp(name, "Ddata.data") != 0) && + (strcmp(name, "Ttdata.data") != 0) && + (strcmp(name, "Drodata.rodata") != 0)) + return (B_TRUE); + } + } + + return (B_FALSE); +} + /*ARGSUSED*/ int dw_read(tdata_t *td, Elf *elf, char *filename __unused) @@ -1820,8 +1871,12 @@ dw_read(tdata_t *td, Elf *elf, char *fil if ((rc = dwarf_elf_init(elf, DW_DLC_READ, &dw.dw_dw, &dw.dw_err)) == DW_DLV_NO_ENTRY) { - errno = ENOENT; - return (-1); + if (should_have_dwarf(elf)) { + errno = ENOENT; + return (-1); + } else { + return (0); + } } else if (rc != DW_DLV_OK) { if (dwarf_errno(&dw.dw_err) == DW_DLE_DEBUG_INFO_NULL) { /* @@ -1839,9 +1894,14 @@ dw_read(tdata_t *td, Elf *elf, char *fil &addrsz, &nxthdr, &dw.dw_err)) != DW_DLV_OK) terminate("rc = %d %s\n", rc, dwarf_errmsg(&dw.dw_err)); - if ((cu = die_sibling(&dw, NULL)) == NULL) + if ((cu = die_sibling(&dw, NULL)) == NULL || + (((child = die_child(&dw, cu)) == NULL) && + should_have_dwarf(elf))) { terminate("file does not contain dwarf type data " "(try compiling with -g)\n"); + } else if (child == NULL) { + return (0); + } dw.dw_maxoff = nxthdr - 1; Modified: projects/diffused_head/cddl/lib/libdtrace/Makefile ============================================================================== --- projects/diffused_head/cddl/lib/libdtrace/Makefile Fri Aug 30 01:32:47 2013 (r255048) +++ projects/diffused_head/cddl/lib/libdtrace/Makefile Fri Aug 30 01:33:26 2013 (r255049) @@ -48,8 +48,11 @@ SRCS= dt_aggregate.c \ DSRCS= errno.d \ io.d \ + ip.d \ psinfo.d \ signal.d \ + tcp.d \ + udp.d \ unistd.d WARNS?= 1 Copied: projects/diffused_head/cddl/lib/libdtrace/ip.d (from r255047, head/cddl/lib/libdtrace/ip.d) ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/diffused_head/cddl/lib/libdtrace/ip.d Fri Aug 30 01:33:26 2013 (r255049, copy of r255047, head/cddl/lib/libdtrace/ip.d) @@ -0,0 +1,285 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + * + * $FreeBSD$ + */ +/* + * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013 Mark Johnston + */ + +#pragma D depends_on provider ip + +/* + * pktinfo is where packet ID info can be made available for deeper + * analysis if packet IDs become supported by the kernel in the future. + * The pkt_addr member is currently always NULL. + */ +typedef struct pktinfo { + uintptr_t pkt_addr; +} pktinfo_t; + +/* + * csinfo is where connection state info is made available. + */ +typedef uint32_t zoneid_t; +typedef struct csinfo { + uintptr_t cs_addr; + uint64_t cs_cid; + pid_t cs_pid; + zoneid_t cs_zoneid; +} csinfo_t; + +/* + * ipinfo contains common IP info for both IPv4 and IPv6. + */ +typedef struct ipinfo { + uint8_t ip_ver; /* IP version (4, 6) */ + uint32_t ip_plength; /* payload length */ + string ip_saddr; /* source address */ + string ip_daddr; /* destination address */ +} ipinfo_t; + +/* + * ifinfo contains network interface info. + */ +typedef struct ifinfo { + string if_name; /* interface name */ + int8_t if_local; /* is delivered locally */ + /*netstackid_t if_ipstack;*/ /* ipstack ID */ + uintptr_t if_addr; /* pointer to raw ill_t */ +} ifinfo_t; + +typedef uint32_t ipaddr_t; +typedef struct { + uint8_t ipha_version_and_hdr_length; + uint8_t ipha_type_of_service; + uint16_t ipha_length; + uint16_t ipha_ident; + uint16_t ipha_fragment_offset_and_flags; + uint8_t ipha_ttl; + uint8_t ipha_protocol; + uint16_t ipha_hdr_checksum; + ipaddr_t ipha_src; + ipaddr_t ipha_dst; +} ipha_t; + +/* + * ipv4info is a translated version of the IPv4 header (with raw pointer). + * These values are NULL if the packet is not IPv4. + */ +typedef struct ipv4info { + uint8_t ipv4_ver; /* IP version (4) */ + uint8_t ipv4_ihl; /* header length, bytes */ + uint8_t ipv4_tos; /* type of service field */ + uint16_t ipv4_length; /* length (header + payload) */ + uint16_t ipv4_ident; /* identification */ + uint8_t ipv4_flags; /* IP flags */ + uint16_t ipv4_offset; /* fragment offset */ + uint8_t ipv4_ttl; /* time to live */ + uint8_t ipv4_protocol; /* next level protocol */ *** DIFF OUTPUT TRUNCATED AT 1000 LINES *** From owner-svn-src-projects@FreeBSD.ORG Fri Aug 30 03:48:17 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 6FE6B901; Fri, 30 Aug 2013 03:48:17 +0000 (UTC) (envelope-from lstewart@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 5AC1C2FF4; Fri, 30 Aug 2013 03:48:17 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id r7U3mHlq021991; Fri, 30 Aug 2013 03:48:17 GMT (envelope-from lstewart@svn.freebsd.org) Received: (from lstewart@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id r7U3mGgY021987; Fri, 30 Aug 2013 03:48:16 GMT (envelope-from lstewart@svn.freebsd.org) Message-Id: <201308300348.r7U3mGgY021987@svn.freebsd.org> From: Lawrence Stewart Date: Fri, 30 Aug 2013 03:48:16 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r255053 - in projects/diffused_head: . sys/dev/cxgbe sys/dev/xen/blkfront X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 30 Aug 2013 03:48:17 -0000 Author: lstewart Date: Fri Aug 30 03:48:16 2013 New Revision: 255053 URL: http://svnweb.freebsd.org/changeset/base/255053 Log: Merge revs 255047:255052 from head. Modified: projects/diffused_head/Makefile.inc1 projects/diffused_head/sys/dev/cxgbe/adapter.h projects/diffused_head/sys/dev/cxgbe/t4_sge.c projects/diffused_head/sys/dev/xen/blkfront/blkfront.c Directory Properties: projects/diffused_head/ (props changed) projects/diffused_head/sys/ (props changed) Modified: projects/diffused_head/Makefile.inc1 ============================================================================== --- projects/diffused_head/Makefile.inc1 Fri Aug 30 02:13:36 2013 (r255052) +++ projects/diffused_head/Makefile.inc1 Fri Aug 30 03:48:16 2013 (r255053) @@ -265,7 +265,7 @@ WMAKEENV= ${CROSSENV} \ PATH=${TMPPATH} # make hierarchy -HMAKE= PATH=${TMPPATH} ${MAKE} LOCAL_MTREE=${LOCAL_MTREE} +HMAKE= PATH=${TMPPATH} ${MAKE} LOCAL_MTREE=${LOCAL_MTREE:Q} .if defined(NO_ROOT) HMAKE+= PATH=${TMPPATH} METALOG=${METALOG} -DNO_ROOT .endif @@ -814,7 +814,7 @@ distributeworld installworld: installche cd ${.CURDIR}/etc; ${CROSSENV} PATH=${TMPPATH} ${MAKE} \ METALOG=${METALOG} ${IMAKE_INSTALL} ${IMAKE_MTREE} \ DISTBASE=/base DESTDIR=${DESTDIR}/${DISTDIR}/base \ - LOCAL_MTREE=${LOCAL_MTREE} distrib-dirs + LOCAL_MTREE=${LOCAL_MTREE:Q} distrib-dirs .endif ${_+_}cd ${.CURDIR}; ${IMAKE} re${.TARGET:S/world$//}; \ ${IMAKEENV} rm -rf ${INSTALLTMP} @@ -888,7 +888,7 @@ reinstall: @echo ">>> Making hierarchy" @echo "--------------------------------------------------------------" ${_+_}cd ${.CURDIR}; ${MAKE} -f Makefile.inc1 \ - LOCAL_MTREE=${LOCAL_MTREE} hierarchy + LOCAL_MTREE=${LOCAL_MTREE:Q} hierarchy @echo @echo "--------------------------------------------------------------" @echo ">>> Installing everything" Modified: projects/diffused_head/sys/dev/cxgbe/adapter.h ============================================================================== --- projects/diffused_head/sys/dev/cxgbe/adapter.h Fri Aug 30 02:13:36 2013 (r255052) +++ projects/diffused_head/sys/dev/cxgbe/adapter.h Fri Aug 30 03:48:16 2013 (r255053) @@ -128,9 +128,9 @@ enum { RX_FL_ESIZE = EQ_ESIZE, /* 8 64bit addresses */ #if MJUMPAGESIZE != MCLBYTES - FL_BUF_SIZES = 4, /* cluster, jumbop, jumbo9k, jumbo16k */ + FL_BUF_SIZES_MAX = 5, /* cluster, jumbop, jumbo9k, jumbo16k, extra */ #else - FL_BUF_SIZES = 3, /* cluster, jumbo9k, jumbo16k */ + FL_BUF_SIZES_MAX = 4, /* cluster, jumbo9k, jumbo16k, extra */ #endif CTRL_EQ_QSIZE = 128, @@ -165,6 +165,7 @@ enum { MASTER_PF = (1 << 3), ADAP_SYSCTL_CTX = (1 << 4), TOM_INIT_DONE = (1 << 5), + BUF_PACKING_OK = (1 << 6), CXGBE_BUSY = (1 << 9), @@ -232,12 +233,11 @@ struct port_info { }; struct fl_sdesc { - struct mbuf *m; bus_dmamap_t map; caddr_t cl; - uint8_t tag_idx; /* the sc->fl_tag this map comes from */ + uint8_t tag_idx; /* the fl->tag entry this map comes from */ #ifdef INVARIANTS - __be64 ba_tag; + __be64 ba_hwtag; #endif }; @@ -359,9 +359,22 @@ struct sge_eq { uint32_t unstalled; /* recovered from stall */ }; +struct fl_buf_info { + u_int size; + int type; + int hwtag:4; /* tag in low 4 bits of the pa. */ + uma_zone_t zone; +}; +#define FL_BUF_SIZES(sc) (sc->sge.fl_buf_sizes) +#define FL_BUF_SIZE(sc, x) (sc->sge.fl_buf_info[x].size) +#define FL_BUF_TYPE(sc, x) (sc->sge.fl_buf_info[x].type) +#define FL_BUF_HWTAG(sc, x) (sc->sge.fl_buf_info[x].hwtag) +#define FL_BUF_ZONE(sc, x) (sc->sge.fl_buf_info[x].zone) + enum { FL_STARVING = (1 << 0), /* on the adapter's list of starving fl's */ FL_DOOMED = (1 << 1), /* about to be destroyed */ + FL_BUF_PACKING = (1 << 2), /* buffer packing enabled */ }; #define FL_RUNNING_LOW(fl) (fl->cap - fl->needed <= fl->lowat) @@ -370,7 +383,8 @@ enum { struct sge_fl { bus_dma_tag_t desc_tag; bus_dmamap_t desc_map; - bus_dma_tag_t tag[FL_BUF_SIZES]; + bus_dma_tag_t tag[FL_BUF_SIZES_MAX]; /* only first FL_BUF_SIZES(sc) are + valid */ uint8_t tag_idx; struct mtx fl_lock; char lockname[16]; @@ -383,11 +397,13 @@ struct sge_fl { uint16_t qsize; /* size (# of entries) of the queue */ uint16_t cntxt_id; /* SGE context id for the freelist */ uint32_t cidx; /* consumer idx (buffer idx, NOT hw desc idx) */ + uint32_t rx_offset; /* offset in fl buf (when buffer packing) */ uint32_t pidx; /* producer idx (buffer idx, NOT hw desc idx) */ uint32_t needed; /* # of buffers needed to fill up fl. */ uint32_t lowat; /* # of buffers <= this means fl needs help */ uint32_t pending; /* # of bufs allocated since last doorbell */ - unsigned int dmamap_failed; + u_int dmamap_failed; + struct mbuf *mstash[8]; TAILQ_ENTRY(sge_fl) link; /* All starving freelists */ }; @@ -519,6 +535,9 @@ struct sge { int eq_start; struct sge_iq **iqmap; /* iq->cntxt_id to iq mapping */ struct sge_eq **eqmap; /* eq->cntxt_id to eq mapping */ + + u_int fl_buf_sizes __aligned(CACHE_LINE_SIZE); + struct fl_buf_info fl_buf_info[FL_BUF_SIZES_MAX]; }; struct rss_header; Modified: projects/diffused_head/sys/dev/cxgbe/t4_sge.c ============================================================================== --- projects/diffused_head/sys/dev/cxgbe/t4_sge.c Fri Aug 30 02:13:36 2013 (r255052) +++ projects/diffused_head/sys/dev/cxgbe/t4_sge.c Fri Aug 30 03:48:16 2013 (r255053) @@ -56,19 +56,6 @@ __FBSDID("$FreeBSD$"); #include "common/t4_regs_values.h" #include "common/t4_msg.h" -struct fl_buf_info { - int size; - int type; - uma_zone_t zone; -}; - -/* Filled up by t4_sge_modload */ -static struct fl_buf_info fl_buf_info[FL_BUF_SIZES]; - -#define FL_BUF_SIZE(x) (fl_buf_info[x].size) -#define FL_BUF_TYPE(x) (fl_buf_info[x].type) -#define FL_BUF_ZONE(x) (fl_buf_info[x].zone) - #ifdef T4_PKT_TIMESTAMP #define RX_COPY_THRESHOLD (MINCLSIZE - 8) #else @@ -85,7 +72,8 @@ TUNABLE_INT("hw.cxgbe.fl_pktshift", &fl_ /* * Pad ethernet payload up to this boundary. * -1: driver should figure out a good value. - * Any power of 2, from 32 to 4096 (both inclusive) is a valid value. + * 0: disable padding. + * Any power of 2 from 32 to 4096 (both inclusive) is also a valid value. */ static int fl_pad = -1; TUNABLE_INT("hw.cxgbe.fl_pad", &fl_pad); @@ -107,6 +95,33 @@ TUNABLE_INT("hw.cxgbe.spg_len", &spg_len static int cong_drop = 0; TUNABLE_INT("hw.cxgbe.cong_drop", &cong_drop); +/* + * Deliver multiple frames in the same free list buffer if they fit. + * -1: let the driver decide whether to enable buffer packing or not. + * 0: disable buffer packing. + * 1: enable buffer packing. + */ +static int buffer_packing = -1; +TUNABLE_INT("hw.cxgbe.buffer_packing", &buffer_packing); + +/* + * Start next frame in a packed buffer at this boundary. + * -1: driver should figure out a good value. + * T4: + * --- + * if fl_pad != 0 + * value specified here will be overridden by fl_pad. + * else + * power of 2 from 32 to 4096 (both inclusive) is a valid value here. + * T5: + * --- + * 16, or a power of 2 from 64 to 4096 (both inclusive) is a valid value. + */ +static int fl_pack = -1; +static int t4_fl_pack; +static int t5_fl_pack; +TUNABLE_INT("hw.cxgbe.fl_pack", &fl_pack); + /* Used to track coalesced tx work request */ struct txpkts { uint64_t *flitp; /* ptr to flit where next pkt should start */ @@ -123,12 +138,15 @@ struct sgl { }; static int service_iq(struct sge_iq *, int); -static struct mbuf *get_fl_payload(struct adapter *, struct sge_fl *, uint32_t, +static struct mbuf *get_fl_payload1(struct adapter *, struct sge_fl *, uint32_t, + int *); +static struct mbuf *get_fl_payload2(struct adapter *, struct sge_fl *, uint32_t, int *); static int t4_eth_rx(struct sge_iq *, const struct rss_header *, struct mbuf *); static inline void init_iq(struct sge_iq *, struct adapter *, int, int, int, int); -static inline void init_fl(struct sge_fl *, int, int, char *); +static inline void init_fl(struct adapter *, struct sge_fl *, int, int, int, + char *); static inline void init_eq(struct sge_eq *, int, int, uint8_t, uint16_t, char *); static int alloc_ring(struct adapter *, size_t, bus_dma_tag_t *, bus_dmamap_t *, @@ -170,8 +188,8 @@ static inline void ring_fl_db(struct ada static int refill_fl(struct adapter *, struct sge_fl *, int); static void refill_sfl(void *); static int alloc_fl_sdesc(struct sge_fl *); -static void free_fl_sdesc(struct sge_fl *); -static void set_fl_tag_idx(struct sge_fl *, int); +static void free_fl_sdesc(struct adapter *, struct sge_fl *); +static void set_fl_tag_idx(struct adapter *, struct sge_fl *, int); static void add_fl_to_sfl(struct adapter *, struct sge_fl *); static int get_pkt_sgl(struct sge_txq *, struct mbuf **, struct sgl *, int); @@ -202,27 +220,20 @@ extern u_int cpu_clflush_line_size; #endif /* - * Called on MOD_LOAD. Fills up fl_buf_info[] and validates/calculates the SGE - * tunables. + * Called on MOD_LOAD. Validates and calculates the SGE tunables. */ void t4_sge_modload(void) { - int i; - int bufsize[FL_BUF_SIZES] = { - MCLBYTES, -#if MJUMPAGESIZE != MCLBYTES - MJUMPAGESIZE, -#endif - MJUM9BYTES, - MJUM16BYTES - }; + int pad; - for (i = 0; i < FL_BUF_SIZES; i++) { - FL_BUF_SIZE(i) = bufsize[i]; - FL_BUF_TYPE(i) = m_gettype(bufsize[i]); - FL_BUF_ZONE(i) = m_getzone(bufsize[i]); - } + /* set pad to a reasonable powerof2 between 16 and 4096 (inclusive) */ +#if defined(__i386__) || defined(__amd64__) + pad = max(cpu_clflush_line_size, 16); +#else + pad = max(CACHE_LINE_SIZE, 16); +#endif + pad = min(pad, 4096); if (fl_pktshift < 0 || fl_pktshift > 7) { printf("Invalid hw.cxgbe.fl_pktshift value (%d)," @@ -230,23 +241,35 @@ t4_sge_modload(void) fl_pktshift = 2; } - if (fl_pad < 32 || fl_pad > 4096 || !powerof2(fl_pad)) { - int pad; - -#if defined(__i386__) || defined(__amd64__) - pad = max(cpu_clflush_line_size, 32); -#else - pad = max(CACHE_LINE_SIZE, 32); -#endif - pad = min(pad, 4096); + if (fl_pad != 0 && + (fl_pad < 32 || fl_pad > 4096 || !powerof2(fl_pad))) { if (fl_pad != -1) { printf("Invalid hw.cxgbe.fl_pad value (%d)," - " using %d instead.\n", fl_pad, pad); + " using %d instead.\n", fl_pad, max(pad, 32)); } - fl_pad = pad; + fl_pad = max(pad, 32); } + /* + * T4 has the same pad and pack boundary. If a pad boundary is set, + * pack boundary must be set to the same value. Otherwise take the + * specified value or auto-calculate something reasonable. + */ + if (fl_pad) + t4_fl_pack = fl_pad; + else if (fl_pack < 32 || fl_pack > 4096 || !powerof2(fl_pack)) + t4_fl_pack = max(pad, 32); + else + t4_fl_pack = fl_pack; + + /* T5's pack boundary is independent of the pad boundary. */ + if (fl_pack < 16 || fl_pack == 32 || fl_pack > 4096 || + !powerof2(fl_pack)) + t5_fl_pack = max(pad, 64); + else + t5_fl_pack = fl_pack; + if (spg_len != 64 && spg_len != 128) { int len; @@ -292,17 +315,41 @@ t4_tweak_chip_settings(struct adapter *s int timer_max = M_TIMERVALUE0 * 1000 / sc->params.vpd.cclk; int intr_pktcount[SGE_NCOUNTERS] = {1, 8, 16, 32}; /* 63 max */ uint16_t indsz = min(RX_COPY_THRESHOLD - 1, M_INDICATESIZE); + int sw_flbuf_sizes[] = { + MCLBYTES, +#if MJUMPAGESIZE != MCLBYTES + MJUMPAGESIZE, +#endif + MJUM9BYTES, + MJUM16BYTES, + MJUMPAGESIZE - MSIZE + }; KASSERT(sc->flags & MASTER_PF, ("%s: trying to change chip settings when not master.", __func__)); - m = V_PKTSHIFT(M_PKTSHIFT) | F_RXPKTCPLMODE | - V_INGPADBOUNDARY(M_INGPADBOUNDARY) | F_EGRSTATUSPAGESIZE; + m = V_PKTSHIFT(M_PKTSHIFT) | F_RXPKTCPLMODE | F_EGRSTATUSPAGESIZE; v = V_PKTSHIFT(fl_pktshift) | F_RXPKTCPLMODE | - V_INGPADBOUNDARY(ilog2(fl_pad) - 5) | V_EGRSTATUSPAGESIZE(spg_len == 128); + if (is_t4(sc) && (fl_pad || buffer_packing)) { + /* t4_fl_pack has the correct value even when fl_pad = 0 */ + m |= V_INGPADBOUNDARY(M_INGPADBOUNDARY); + v |= V_INGPADBOUNDARY(ilog2(t4_fl_pack) - 5); + } else if (is_t5(sc) && fl_pad) { + m |= V_INGPADBOUNDARY(M_INGPADBOUNDARY); + v |= V_INGPADBOUNDARY(ilog2(fl_pad) - 5); + } t4_set_reg_field(sc, A_SGE_CONTROL, m, v); + if (is_t5(sc) && buffer_packing) { + m = V_INGPACKBOUNDARY(M_INGPACKBOUNDARY); + if (t5_fl_pack == 16) + v = V_INGPACKBOUNDARY(0); + else + v = V_INGPACKBOUNDARY(ilog2(t5_fl_pack) - 5); + t4_set_reg_field(sc, A_SGE_CONTROL2, m, v); + } + v = V_HOSTPAGESIZEPF0(PAGE_SHIFT - 10) | V_HOSTPAGESIZEPF1(PAGE_SHIFT - 10) | V_HOSTPAGESIZEPF2(PAGE_SHIFT - 10) | @@ -313,9 +360,9 @@ t4_tweak_chip_settings(struct adapter *s V_HOSTPAGESIZEPF7(PAGE_SHIFT - 10); t4_write_reg(sc, A_SGE_HOST_PAGE_SIZE, v); - for (i = 0; i < FL_BUF_SIZES; i++) { + for (i = 0; i < min(nitems(sw_flbuf_sizes), 16); i++) { t4_write_reg(sc, A_SGE_FL_BUFFER_SIZE0 + (4 * i), - FL_BUF_SIZE(i)); + sw_flbuf_sizes[i]); } v = V_THRESHOLD_0(intr_pktcount[0]) | V_THRESHOLD_1(intr_pktcount[1]) | @@ -376,21 +423,48 @@ int t4_read_chip_settings(struct adapter *sc) { struct sge *s = &sc->sge; - int i, rc = 0; + int i, j, n, rc = 0; uint32_t m, v, r; uint16_t indsz = min(RX_COPY_THRESHOLD - 1, M_INDICATESIZE); + uint32_t sge_flbuf_sizes[16], sw_flbuf_sizes[] = { + MCLBYTES, +#if MJUMPAGESIZE != MCLBYTES + MJUMPAGESIZE, +#endif + MJUM9BYTES, + MJUM16BYTES + }; - m = V_PKTSHIFT(M_PKTSHIFT) | F_RXPKTCPLMODE | - V_INGPADBOUNDARY(M_INGPADBOUNDARY) | F_EGRSTATUSPAGESIZE; + m = V_PKTSHIFT(M_PKTSHIFT) | F_RXPKTCPLMODE | F_EGRSTATUSPAGESIZE; v = V_PKTSHIFT(fl_pktshift) | F_RXPKTCPLMODE | - V_INGPADBOUNDARY(ilog2(fl_pad) - 5) | V_EGRSTATUSPAGESIZE(spg_len == 128); + if (is_t4(sc) && (fl_pad || buffer_packing)) { + m |= V_INGPADBOUNDARY(M_INGPADBOUNDARY); + v |= V_INGPADBOUNDARY(ilog2(t4_fl_pack) - 5); + } else if (is_t5(sc) && fl_pad) { + m |= V_INGPADBOUNDARY(M_INGPADBOUNDARY); + v |= V_INGPADBOUNDARY(ilog2(fl_pad) - 5); + } r = t4_read_reg(sc, A_SGE_CONTROL); if ((r & m) != v) { device_printf(sc->dev, "invalid SGE_CONTROL(0x%x)\n", r); rc = EINVAL; } + if (is_t5(sc) && buffer_packing) { + m = V_INGPACKBOUNDARY(M_INGPACKBOUNDARY); + if (t5_fl_pack == 16) + v = V_INGPACKBOUNDARY(0); + else + v = V_INGPACKBOUNDARY(ilog2(t5_fl_pack) - 5); + r = t4_read_reg(sc, A_SGE_CONTROL2); + if ((r & m) != v) { + device_printf(sc->dev, + "invalid SGE_CONTROL2(0x%x)\n", r); + rc = EINVAL; + } + } + v = V_HOSTPAGESIZEPF0(PAGE_SHIFT - 10) | V_HOSTPAGESIZEPF1(PAGE_SHIFT - 10) | V_HOSTPAGESIZEPF2(PAGE_SHIFT - 10) | @@ -405,14 +479,45 @@ t4_read_chip_settings(struct adapter *sc rc = EINVAL; } - for (i = 0; i < FL_BUF_SIZES; i++) { - v = t4_read_reg(sc, A_SGE_FL_BUFFER_SIZE0 + (4 * i)); - if (v != FL_BUF_SIZE(i)) { - device_printf(sc->dev, - "invalid SGE_FL_BUFFER_SIZE[%d](0x%x)\n", i, v); - rc = EINVAL; + /* + * Make a list of SGE FL buffer sizes programmed in the chip and tally + * it with the FL buffer sizes that we'd like to use. + */ + n = 0; + for (i = 0; i < nitems(sge_flbuf_sizes); i++) { + r = t4_read_reg(sc, A_SGE_FL_BUFFER_SIZE0 + (4 * i)); + sge_flbuf_sizes[i] = r; + if (r == MJUMPAGESIZE - MSIZE && + (sc->flags & BUF_PACKING_OK) == 0) { + sc->flags |= BUF_PACKING_OK; + FL_BUF_HWTAG(sc, n) = i; + FL_BUF_SIZE(sc, n) = MJUMPAGESIZE - MSIZE; + FL_BUF_TYPE(sc, n) = m_gettype(MJUMPAGESIZE); + FL_BUF_ZONE(sc, n) = m_getzone(MJUMPAGESIZE); + n++; + } + } + for (i = 0; i < nitems(sw_flbuf_sizes); i++) { + for (j = 0; j < nitems(sge_flbuf_sizes); j++) { + if (sw_flbuf_sizes[i] != sge_flbuf_sizes[j]) + continue; + FL_BUF_HWTAG(sc, n) = j; + FL_BUF_SIZE(sc, n) = sw_flbuf_sizes[i]; + FL_BUF_TYPE(sc, n) = m_gettype(sw_flbuf_sizes[i]); + FL_BUF_ZONE(sc, n) = m_getzone(sw_flbuf_sizes[i]); + n++; + break; } } + if (n == 0) { + device_printf(sc->dev, "no usable SGE FL buffer size.\n"); + rc = EINVAL; + } else if (n == 1 && (sc->flags & BUF_PACKING_OK)) { + device_printf(sc->dev, + "no usable SGE FL buffer size when not packing buffers.\n"); + rc = EINVAL; + } + FL_BUF_SIZES(sc) = n; r = t4_read_reg(sc, A_SGE_INGRESS_RX_THRESHOLD); s->counter_val[0] = G_THRESHOLD_0(r); @@ -499,6 +604,17 @@ t4_create_dma_tag(struct adapter *sc) return (rc); } +static inline int +enable_buffer_packing(struct adapter *sc) +{ + + if (sc->flags & BUF_PACKING_OK && + ((is_t5(sc) && buffer_packing) || /* 1 or -1 both ok for T5 */ + (is_t4(sc) && buffer_packing == 1))) + return (1); + return (0); +} + void t4_sge_sysctls(struct adapter *sc, struct sysctl_ctx_list *ctx, struct sysctl_oid_list *children) @@ -515,6 +631,14 @@ t4_sge_sysctls(struct adapter *sc, struc SYSCTL_ADD_INT(ctx, children, OID_AUTO, "cong_drop", CTLFLAG_RD, NULL, cong_drop, "congestion drop setting"); + + SYSCTL_ADD_INT(ctx, children, OID_AUTO, "buffer_packing", CTLFLAG_RD, + NULL, enable_buffer_packing(sc), + "pack multiple frames in one fl buffer"); + + SYSCTL_ADD_INT(ctx, children, OID_AUTO, "fl_pack", CTLFLAG_RD, + NULL, is_t5(sc) ? t5_fl_pack : t4_fl_pack, + "payload pack boundary (bytes)"); } int @@ -706,7 +830,7 @@ t4_setup_port_queues(struct port_info *p struct ifnet *ifp = pi->ifp; struct sysctl_oid *oid = device_get_sysctl_tree(pi->dev); struct sysctl_oid_list *children = SYSCTL_CHILDREN(oid); - int bufsize; + int bufsize, pack; oid = SYSCTL_ADD_NODE(&pi->ctx, children, OID_AUTO, "rxq", CTLFLAG_RD, NULL, "rx queues"); @@ -728,6 +852,7 @@ t4_setup_port_queues(struct port_info *p * b) allocate queue iff it will take direct interrupts. */ bufsize = mtu_to_bufsize(ifp->if_mtu); + pack = enable_buffer_packing(sc); for_each_rxq(pi, i, rxq) { init_iq(&rxq->iq, sc, pi->tmr_idx, pi->pktc_idx, pi->qsize_rxq, @@ -735,7 +860,7 @@ t4_setup_port_queues(struct port_info *p snprintf(name, sizeof(name), "%s rxq%d-fl", device_get_nameunit(pi->dev), i); - init_fl(&rxq->fl, pi->qsize_rxq / 8, bufsize, name); + init_fl(sc, &rxq->fl, pi->qsize_rxq / 8, bufsize, pack, name); if (sc->flags & INTR_DIRECT #ifdef TCP_OFFLOAD @@ -752,6 +877,7 @@ t4_setup_port_queues(struct port_info *p #ifdef TCP_OFFLOAD bufsize = mtu_to_bufsize_toe(sc, ifp->if_mtu); + pack = 0; /* XXX: think about this some more */ for_each_ofld_rxq(pi, i, ofld_rxq) { init_iq(&ofld_rxq->iq, sc, pi->tmr_idx, pi->pktc_idx, @@ -759,7 +885,8 @@ t4_setup_port_queues(struct port_info *p snprintf(name, sizeof(name), "%s ofld_rxq%d-fl", device_get_nameunit(pi->dev), i); - init_fl(&ofld_rxq->fl, pi->qsize_rxq / 8, bufsize, name); + init_fl(sc, &ofld_rxq->fl, pi->qsize_rxq / 8, bufsize, pack, + name); if (sc->flags & INTR_DIRECT || (sc->intr_count > 1 && pi->nofldrxq > pi->nrxq)) { @@ -1036,7 +1163,12 @@ service_iq(struct sge_iq *iq, int budget ("%s: data for an iq (%p) with no freelist", __func__, iq)); - m0 = get_fl_payload(sc, fl, lq, &fl_bufs_used); + m0 = fl->flags & FL_BUF_PACKING ? + get_fl_payload1(sc, fl, lq, &fl_bufs_used) : + get_fl_payload2(sc, fl, lq, &fl_bufs_used); + + if (__predict_false(m0 == NULL)) + goto process_iql; #ifdef T4_PKT_TIMESTAMP /* * 60 bit timestamp for the payload is @@ -1136,6 +1268,7 @@ service_iq(struct sge_iq *iq, int budget } } +process_iql: if (STAILQ_EMPTY(&iql)) break; @@ -1181,13 +1314,102 @@ service_iq(struct sge_iq *iq, int budget return (0); } +static int +fill_mbuf_stash(struct sge_fl *fl) +{ + int i; + + for (i = 0; i < nitems(fl->mstash); i++) { + if (fl->mstash[i] == NULL) { + struct mbuf *m; + if ((m = m_get(M_NOWAIT, MT_NOINIT)) == NULL) + return (ENOBUFS); + fl->mstash[i] = m; + } + } + return (0); +} + +static struct mbuf * +get_mbuf_from_stash(struct sge_fl *fl) +{ + int i; + + for (i = 0; i < nitems(fl->mstash); i++) { + if (fl->mstash[i] != NULL) { + struct mbuf *m; + + m = fl->mstash[i]; + fl->mstash[i] = NULL; + return (m); + } else + fl->mstash[i] = m_get(M_NOWAIT, MT_NOINIT); + } + + return (m_get(M_NOWAIT, MT_NOINIT)); +} + +static void +return_mbuf_to_stash(struct sge_fl *fl, struct mbuf *m) +{ + int i; + + if (m == NULL) + return; + + for (i = 0; i < nitems(fl->mstash); i++) { + if (fl->mstash[i] == NULL) { + fl->mstash[i] = m; + return; + } + } + m_init(m, NULL, 0, M_NOWAIT, MT_DATA, 0); + m_free(m); +} + +/* buf can be any address within the buffer */ +static inline u_int * +find_buf_refcnt(caddr_t buf) +{ + uintptr_t ptr = (uintptr_t)buf; + + return ((u_int *)((ptr & ~(MJUMPAGESIZE - 1)) + MSIZE - sizeof(u_int))); +} + +static inline struct mbuf * +find_buf_mbuf(caddr_t buf) +{ + uintptr_t ptr = (uintptr_t)buf; + + return ((struct mbuf *)(ptr & ~(MJUMPAGESIZE - 1))); +} + +static int +rxb_free(struct mbuf *m, void *arg1, void *arg2) +{ + uma_zone_t zone = arg1; + caddr_t cl = arg2; +#ifdef INVARIANTS + u_int refcount; + + refcount = *find_buf_refcnt(cl); + KASSERT(refcount == 0, ("%s: cl %p refcount is %u", __func__, + cl - MSIZE, refcount)); +#endif + cl -= MSIZE; + uma_zfree(zone, cl); + + return (EXT_FREE_OK); +} + static struct mbuf * -get_fl_payload(struct adapter *sc, struct sge_fl *fl, uint32_t len_newbuf, +get_fl_payload1(struct adapter *sc, struct sge_fl *fl, uint32_t len_newbuf, int *fl_bufs_used) { struct mbuf *m0, *m; struct fl_sdesc *sd = &fl->sdesc[fl->cidx]; unsigned int nbuf, len; + int pack_boundary = is_t4(sc) ? t4_fl_pack : t5_fl_pack; /* * No assertion for the fl lock because we don't need it. This routine @@ -1198,29 +1420,194 @@ get_fl_payload(struct adapter *sc, struc * lock but this routine does not). */ + KASSERT(fl->flags & FL_BUF_PACKING, + ("%s: buffer packing disabled for fl %p", __func__, fl)); + + len = G_RSPD_LEN(len_newbuf); + + if ((len_newbuf & F_RSPD_NEWBUF) == 0) { + KASSERT(fl->rx_offset > 0, + ("%s: packed frame but driver at offset=0", __func__)); + + /* A packed frame is guaranteed to fit entirely in this buf. */ + KASSERT(FL_BUF_SIZE(sc, sd->tag_idx) - fl->rx_offset >= len, + ("%s: packing error. bufsz=%u, offset=%u, len=%u", + __func__, FL_BUF_SIZE(sc, sd->tag_idx), fl->rx_offset, + len)); + + m0 = get_mbuf_from_stash(fl); + if (m0 == NULL || + m_init(m0, NULL, 0, M_NOWAIT, MT_DATA, M_PKTHDR) != 0) { + return_mbuf_to_stash(fl, m0); + return (NULL); + } + + bus_dmamap_sync(fl->tag[sd->tag_idx], sd->map, + BUS_DMASYNC_POSTREAD); + if (len < RX_COPY_THRESHOLD) { +#ifdef T4_PKT_TIMESTAMP + /* Leave room for a timestamp */ + m0->m_data += 8; +#endif + bcopy(sd->cl + fl->rx_offset, mtod(m0, caddr_t), len); + m0->m_pkthdr.len = len; + m0->m_len = len; + } else { + m0->m_pkthdr.len = len; + m0->m_len = len; + m_extaddref(m0, sd->cl + fl->rx_offset, + roundup2(m0->m_len, fl_pad), + find_buf_refcnt(sd->cl), rxb_free, + FL_BUF_ZONE(sc, sd->tag_idx), sd->cl); + } + fl->rx_offset += len; + fl->rx_offset = roundup2(fl->rx_offset, fl_pad); + fl->rx_offset = roundup2(fl->rx_offset, pack_boundary); + if (fl->rx_offset >= FL_BUF_SIZE(sc, sd->tag_idx)) { + fl->rx_offset = 0; + (*fl_bufs_used) += 1; + if (__predict_false(++fl->cidx == fl->cap)) + fl->cidx = 0; + } + + return (m0); + } + + KASSERT(len_newbuf & F_RSPD_NEWBUF, + ("%s: only new buffer handled here", __func__)); + + nbuf = 0; + + /* + * Move to the start of the next buffer if we are still in the middle of + * some buffer. This is the case where there was some room left in the + * previous buffer but not enough to fit this frame in its entirety. + */ + if (fl->rx_offset > 0) { + KASSERT(roundup2(len, fl_pad) > FL_BUF_SIZE(sc, sd->tag_idx) - + fl->rx_offset, ("%s: frame (%u bytes) should have fit at " + "cidx %u offset %u bufsize %u", __func__, len, fl->cidx, + fl->rx_offset, FL_BUF_SIZE(sc, sd->tag_idx))); + nbuf++; + fl->rx_offset = 0; + sd++; + if (__predict_false(++fl->cidx == fl->cap)) { + sd = fl->sdesc; + fl->cidx = 0; + } + } + + m0 = find_buf_mbuf(sd->cl); + if (m_init(m0, NULL, 0, M_NOWAIT, MT_DATA, M_PKTHDR | M_NOFREE)) + goto done; + bus_dmamap_sync(fl->tag[sd->tag_idx], sd->map, BUS_DMASYNC_POSTREAD); + m0->m_len = min(len, FL_BUF_SIZE(sc, sd->tag_idx)); + m_extaddref(m0, sd->cl, roundup2(m0->m_len, fl_pad), + find_buf_refcnt(sd->cl), rxb_free, FL_BUF_ZONE(sc, sd->tag_idx), + sd->cl); + m0->m_pkthdr.len = len; + + fl->rx_offset = roundup2(m0->m_len, fl_pad); + fl->rx_offset = roundup2(fl->rx_offset, pack_boundary); + if (fl->rx_offset >= FL_BUF_SIZE(sc, sd->tag_idx)) { + fl->rx_offset = 0; + nbuf++; + sd++; + if (__predict_false(++fl->cidx == fl->cap)) { + sd = fl->sdesc; + fl->cidx = 0; + } + } + + m = m0; + len -= m->m_len; + + while (len > 0) { + m->m_next = find_buf_mbuf(sd->cl); + m = m->m_next; + + bus_dmamap_sync(fl->tag[sd->tag_idx], sd->map, + BUS_DMASYNC_POSTREAD); + + /* m_init for !M_PKTHDR can't fail so don't bother */ + m_init(m, NULL, 0, M_NOWAIT, MT_DATA, M_NOFREE); + m->m_len = min(len, FL_BUF_SIZE(sc, sd->tag_idx)); + m_extaddref(m, sd->cl, roundup2(m->m_len, fl_pad), + find_buf_refcnt(sd->cl), rxb_free, + FL_BUF_ZONE(sc, sd->tag_idx), sd->cl); + + fl->rx_offset = roundup2(m->m_len, fl_pad); + fl->rx_offset = roundup2(fl->rx_offset, pack_boundary); + if (fl->rx_offset >= FL_BUF_SIZE(sc, sd->tag_idx)) { + fl->rx_offset = 0; + nbuf++; + sd++; + if (__predict_false(++fl->cidx == fl->cap)) { + sd = fl->sdesc; + fl->cidx = 0; + } + } + + len -= m->m_len; + } +done: + (*fl_bufs_used) += nbuf; + return (m0); +} + +static struct mbuf * +get_fl_payload2(struct adapter *sc, struct sge_fl *fl, uint32_t len_newbuf, + int *fl_bufs_used) +{ + struct mbuf *m0, *m; + struct fl_sdesc *sd = &fl->sdesc[fl->cidx]; + unsigned int nbuf, len; + + /* + * No assertion for the fl lock because we don't need it. This routine + * is called only from the rx interrupt handler and it only updates + * fl->cidx. (Contrast that with fl->pidx/fl->needed which could be + * updated in the rx interrupt handler or the starvation helper routine. + * That's why code that manipulates fl->pidx/fl->needed needs the fl + * lock but this routine does not). + */ + + KASSERT((fl->flags & FL_BUF_PACKING) == 0, + ("%s: buffer packing enabled for fl %p", __func__, fl)); if (__predict_false((len_newbuf & F_RSPD_NEWBUF) == 0)) panic("%s: cannot handle packed frames", __func__); len = G_RSPD_LEN(len_newbuf); - m0 = sd->m; - sd->m = NULL; /* consumed */ + /* + * We never want to run out of mbufs in between a frame when a frame + * spans multiple fl buffers. If the fl's mbuf stash isn't full and + * can't be filled up to the brim then fail early. + */ + if (len > FL_BUF_SIZE(sc, sd->tag_idx) && fill_mbuf_stash(fl) != 0) + return (NULL); + + m0 = get_mbuf_from_stash(fl); + if (m0 == NULL || + m_init(m0, NULL, 0, M_NOWAIT, MT_DATA, M_PKTHDR) != 0) { + return_mbuf_to_stash(fl, m0); + return (NULL); + } bus_dmamap_sync(fl->tag[sd->tag_idx], sd->map, BUS_DMASYNC_POSTREAD); - m_init(m0, NULL, 0, M_NOWAIT, MT_DATA, M_PKTHDR); -#ifdef T4_PKT_TIMESTAMP - /* Leave room for a timestamp */ - m0->m_data += 8; -#endif if (len < RX_COPY_THRESHOLD) { +#ifdef T4_PKT_TIMESTAMP + /* Leave room for a timestamp */ + m0->m_data += 8; +#endif /* copy data to mbuf, buffer will be recycled */ bcopy(sd->cl, mtod(m0, caddr_t), len); m0->m_len = len; } else { bus_dmamap_unload(fl->tag[sd->tag_idx], sd->map); - m_cljset(m0, sd->cl, FL_BUF_TYPE(sd->tag_idx)); + m_cljset(m0, sd->cl, FL_BUF_TYPE(sc, sd->tag_idx)); sd->cl = NULL; /* consumed */ - m0->m_len = min(len, FL_BUF_SIZE(sd->tag_idx)); + m0->m_len = min(len, FL_BUF_SIZE(sc, sd->tag_idx)); } m0->m_pkthdr.len = len; @@ -1235,23 +1622,23 @@ get_fl_payload(struct adapter *sc, struc nbuf = 1; /* # of fl buffers used */ while (len > 0) { - m->m_next = sd->m; - sd->m = NULL; /* consumed */ + /* Can't fail, we checked earlier that the stash was full. */ + m->m_next = get_mbuf_from_stash(fl); m = m->m_next; bus_dmamap_sync(fl->tag[sd->tag_idx], sd->map, BUS_DMASYNC_POSTREAD); + /* m_init for !M_PKTHDR can't fail so don't bother */ m_init(m, NULL, 0, M_NOWAIT, MT_DATA, 0); if (len <= MLEN) { bcopy(sd->cl, mtod(m, caddr_t), len); m->m_len = len; } else { - bus_dmamap_unload(fl->tag[sd->tag_idx], - sd->map); - m_cljset(m, sd->cl, FL_BUF_TYPE(sd->tag_idx)); + bus_dmamap_unload(fl->tag[sd->tag_idx], sd->map); + m_cljset(m, sd->cl, FL_BUF_TYPE(sc, sd->tag_idx)); sd->cl = NULL; /* consumed */ - m->m_len = min(len, FL_BUF_SIZE(sd->tag_idx)); + m->m_len = min(len, FL_BUF_SIZE(sc, sd->tag_idx)); } sd++; @@ -1616,6 +2003,7 @@ void t4_update_fl_bufsize(struct ifnet *ifp) { struct port_info *pi = ifp->if_softc; + struct adapter *sc = pi->adapter; struct sge_rxq *rxq; #ifdef TCP_OFFLOAD struct sge_ofld_rxq *ofld_rxq; @@ -1628,7 +2016,7 @@ t4_update_fl_bufsize(struct ifnet *ifp) fl = &rxq->fl; FL_LOCK(fl); - set_fl_tag_idx(fl, bufsize); + set_fl_tag_idx(sc, fl, bufsize); FL_UNLOCK(fl); } #ifdef TCP_OFFLOAD @@ -1637,7 +2025,7 @@ t4_update_fl_bufsize(struct ifnet *ifp) fl = &ofld_rxq->fl; FL_LOCK(fl); - set_fl_tag_idx(fl, bufsize); + set_fl_tag_idx(sc, fl, bufsize); FL_UNLOCK(fl); } #endif @@ -1671,11 +2059,15 @@ init_iq(struct sge_iq *iq, struct adapte } static inline void -init_fl(struct sge_fl *fl, int qsize, int bufsize, char *name) +init_fl(struct adapter *sc, struct sge_fl *fl, int qsize, int bufsize, int pack, + char *name) { + fl->qsize = qsize; strlcpy(fl->lockname, name, sizeof(fl->lockname)); - set_fl_tag_idx(fl, bufsize); + if (pack) + fl->flags |= FL_BUF_PACKING; + set_fl_tag_idx(sc, fl, bufsize); } static inline void @@ -1804,7 +2196,7 @@ alloc_iq_fl(struct port_info *pi, struct if (fl) { mtx_init(&fl->fl_lock, fl->lockname, NULL, MTX_DEF); - for (i = 0; i < FL_BUF_SIZES; i++) { + for (i = 0; i < FL_BUF_SIZES(sc); i++) { /* * A freelist buffer must be 16 byte aligned as the SGE @@ -1813,8 +2205,8 @@ alloc_iq_fl(struct port_info *pi, struct */ rc = bus_dma_tag_create(sc->dmat, 16, 0, BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR, NULL, NULL, - FL_BUF_SIZE(i), 1, FL_BUF_SIZE(i), BUS_DMA_ALLOCNOW, - NULL, NULL, &fl->tag[i]); + FL_BUF_SIZE(sc, i), 1, FL_BUF_SIZE(sc, i), + BUS_DMA_ALLOCNOW, NULL, NULL, &fl->tag[i]); if (rc != 0) { device_printf(sc->dev, "failed to create fl DMA tag[%d]: %d\n", @@ -1843,7 +2235,9 @@ alloc_iq_fl(struct port_info *pi, struct c.iqns_to_fl0congen |= htobe32(V_FW_IQ_CMD_FL0HOSTFCMODE(X_HOSTFCMODE_NONE) | F_FW_IQ_CMD_FL0FETCHRO | F_FW_IQ_CMD_FL0DATARO | - F_FW_IQ_CMD_FL0PADEN); + (fl_pad ? F_FW_IQ_CMD_FL0PADEN : 0) | + (fl->flags & FL_BUF_PACKING ? F_FW_IQ_CMD_FL0PACKEN : + 0)); if (cong >= 0) { c.iqns_to_fl0congen |= htobe32(V_FW_IQ_CMD_FL0CNGCHMAP(cong) | @@ -1964,12 +2358,21 @@ free_iq_fl(struct port_info *pi, struct fl->desc); if (fl->sdesc) - free_fl_sdesc(fl); + free_fl_sdesc(sc, fl); + + for (i = 0; i < nitems(fl->mstash); i++) { + struct mbuf *m = fl->mstash[i]; + + if (m != NULL) { + m_init(m, NULL, 0, M_NOWAIT, MT_DATA, 0); + m_free(m); + } + } if (mtx_initialized(&fl->fl_lock)) mtx_destroy(&fl->fl_lock); - for (i = 0; i < FL_BUF_SIZES; i++) { + for (i = 0; i < FL_BUF_SIZES(sc); i++) { if (fl->tag[i]) bus_dma_tag_destroy(fl->tag[i]); *** DIFF OUTPUT TRUNCATED AT 1000 LINES *** From owner-svn-src-projects@FreeBSD.ORG Fri Aug 30 08:25:08 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id A291ED9F; Fri, 30 Aug 2013 08:25:08 +0000 (UTC) (envelope-from andrew@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 765FD2134; Fri, 30 Aug 2013 08:25:08 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id r7U8P82B077293; Fri, 30 Aug 2013 08:25:08 GMT (envelope-from andrew@svn.freebsd.org) Received: (from andrew@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id r7U8P8so077291; Fri, 30 Aug 2013 08:25:08 GMT (envelope-from andrew@svn.freebsd.org) Message-Id: <201308300825.r7U8P8so077291@svn.freebsd.org> From: Andrew Turner Date: Fri, 30 Aug 2013 08:25:08 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r255061 - projects/arm_eabi_vfp/contrib/llvm/tools/clang/lib/Driver X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 30 Aug 2013 08:25:08 -0000 Author: andrew Date: Fri Aug 30 08:25:07 2013 New Revision: 255061 URL: http://svnweb.freebsd.org/changeset/base/255061 Log: Start supporting the ARM EABI Hard-Float ABI in clang Modified: projects/arm_eabi_vfp/contrib/llvm/tools/clang/lib/Driver/ToolChains.cpp projects/arm_eabi_vfp/contrib/llvm/tools/clang/lib/Driver/Tools.cpp Modified: projects/arm_eabi_vfp/contrib/llvm/tools/clang/lib/Driver/ToolChains.cpp ============================================================================== --- projects/arm_eabi_vfp/contrib/llvm/tools/clang/lib/Driver/ToolChains.cpp Fri Aug 30 07:59:49 2013 (r255060) +++ projects/arm_eabi_vfp/contrib/llvm/tools/clang/lib/Driver/ToolChains.cpp Fri Aug 30 08:25:07 2013 (r255061) @@ -1841,6 +1841,7 @@ Tool *FreeBSD::buildLinker() const { bool FreeBSD::UseSjLjExceptions() const { // FreeBSD uses SjLj exceptions on ARM oabi. switch (getTriple().getEnvironment()) { + case llvm::Triple::GNUEABIHF: case llvm::Triple::GNUEABI: case llvm::Triple::EABI: return false; Modified: projects/arm_eabi_vfp/contrib/llvm/tools/clang/lib/Driver/Tools.cpp ============================================================================== --- projects/arm_eabi_vfp/contrib/llvm/tools/clang/lib/Driver/Tools.cpp Fri Aug 30 07:59:49 2013 (r255060) +++ projects/arm_eabi_vfp/contrib/llvm/tools/clang/lib/Driver/Tools.cpp Fri Aug 30 08:25:07 2013 (r255061) @@ -660,8 +660,15 @@ static StringRef getARMFloatABI(const Dr } case llvm::Triple::FreeBSD: - // FreeBSD defaults to soft float - FloatABI = "soft"; + switch(Triple.getEnvironment()) { + case llvm::Triple::GNUEABIHF: + FloatABI = "hard"; + break; + default: + // FreeBSD defaults to soft float + FloatABI = "soft"; + break; + } break; default: @@ -5401,8 +5408,18 @@ void freebsd::Assemble::ConstructJob(Com } } else if (getToolChain().getArch() == llvm::Triple::arm || getToolChain().getArch() == llvm::Triple::thumb) { - CmdArgs.push_back("-mfpu=softvfp"); + const Driver &D = getToolChain().getDriver(); + llvm::Triple Triple = getToolChain().getTriple(); + StringRef FloatABI = getARMFloatABI(D, Args, Triple); + + if (FloatABI == "hard") { + CmdArgs.push_back("-mfpu=vfp"); + } else { + CmdArgs.push_back("-mfpu=softvfp"); + } + switch(getToolChain().getTriple().getEnvironment()) { + case llvm::Triple::GNUEABIHF: case llvm::Triple::GNUEABI: case llvm::Triple::EABI: CmdArgs.push_back("-meabi=5"); From owner-svn-src-projects@FreeBSD.ORG Fri Aug 30 08:29:26 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id A2EB5ECC; Fri, 30 Aug 2013 08:29:26 +0000 (UTC) (envelope-from andrew@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 8EB562162; Fri, 30 Aug 2013 08:29:26 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id r7U8TQFG078661; Fri, 30 Aug 2013 08:29:26 GMT (envelope-from andrew@svn.freebsd.org) Received: (from andrew@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id r7U8TNQ5078602; Fri, 30 Aug 2013 08:29:23 GMT (envelope-from andrew@svn.freebsd.org) Message-Id: <201308300829.r7U8TNQ5078602@svn.freebsd.org> From: Andrew Turner Date: Fri, 30 Aug 2013 08:29:23 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r255062 - in projects/arm_eabi_vfp: . contrib/binutils/bfd gnu/usr.bin/binutils gnu/usr.bin/cc gnu/usr.bin/gdb gnu/usr.bin/gdb/libgdb lib/clang lib/libc share/mk usr.bin/xlint X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 30 Aug 2013 08:29:26 -0000 Author: andrew Date: Fri Aug 30 08:29:23 2013 New Revision: 255062 URL: http://svnweb.freebsd.org/changeset/base/255062 Log: Add a new TARGET_ARCH value for ARM hard-float, armv6hf. It is only buildable with clang as gcc is too old to build this using the VFP registers. Newer versions of gcc added this after it changed to GPLv3. Modified: projects/arm_eabi_vfp/Makefile projects/arm_eabi_vfp/Makefile.inc1 projects/arm_eabi_vfp/contrib/binutils/bfd/config.bfd projects/arm_eabi_vfp/gnu/usr.bin/binutils/Makefile.inc0 projects/arm_eabi_vfp/gnu/usr.bin/cc/Makefile.tgt projects/arm_eabi_vfp/gnu/usr.bin/gdb/Makefile.inc projects/arm_eabi_vfp/gnu/usr.bin/gdb/libgdb/Makefile projects/arm_eabi_vfp/lib/clang/clang.build.mk projects/arm_eabi_vfp/lib/libc/Makefile projects/arm_eabi_vfp/share/mk/bsd.endian.mk projects/arm_eabi_vfp/share/mk/bsd.own.mk projects/arm_eabi_vfp/share/mk/sys.mk projects/arm_eabi_vfp/usr.bin/xlint/Makefile.inc Modified: projects/arm_eabi_vfp/Makefile ============================================================================== --- projects/arm_eabi_vfp/Makefile Fri Aug 30 08:25:07 2013 (r255061) +++ projects/arm_eabi_vfp/Makefile Fri Aug 30 08:29:23 2013 (r255062) @@ -164,7 +164,7 @@ _MAKE= PATH=${PATH} ${SUB_MAKE} -f Makef _TARGET_ARCH= ${TARGET:S/pc98/i386/} .elif !defined(TARGET) && defined(TARGET_ARCH) && \ ${TARGET_ARCH} != ${MACHINE_ARCH} -_TARGET= ${TARGET_ARCH:C/mips(n32|64)?(el)?/mips/:C/arm(v6)?(eb)?/arm/} +_TARGET= ${TARGET_ARCH:C/mips(n32|64)?(el)?/mips/:C/arm(v6)?(eb|hf)?/arm/} .endif # Legacy names, for another transition period mips:mips(n32|64)?eb -> mips:mips\1 .if defined(TARGET) && defined(TARGET_ARCH) && \ @@ -374,7 +374,7 @@ kernel-toolchains: # .if make(universe) || make(universe_kernels) || make(tinderbox) || make(targets) TARGETS?=amd64 arm i386 ia64 mips pc98 powerpc sparc64 -TARGET_ARCHES_arm?= arm armeb armv6 armv6eb +TARGET_ARCHES_arm?= arm armeb armv6 armv6eb armv6hf TARGET_ARCHES_mips?= mipsel mips mips64el mips64 mipsn32 TARGET_ARCHES_powerpc?= powerpc powerpc64 TARGET_ARCHES_pc98?= i386 Modified: projects/arm_eabi_vfp/Makefile.inc1 ============================================================================== --- projects/arm_eabi_vfp/Makefile.inc1 Fri Aug 30 08:25:07 2013 (r255061) +++ projects/arm_eabi_vfp/Makefile.inc1 Fri Aug 30 08:29:23 2013 (r255062) @@ -132,7 +132,7 @@ VERSION!= uname -srp VERSION+= ${OSRELDATE} .endif -KNOWN_ARCHES?= amd64 arm armeb/arm armv6/arm armv6eb/arm i386 i386/pc98 ia64 mips mipsel/mips mips64el/mips mips64/mips mipsn32el/mips mipsn32/mips powerpc powerpc64/powerpc sparc64 +KNOWN_ARCHES?= amd64 arm armeb/arm armv6/arm armv6eb/arm armv6hf/arm i386 i386/pc98 ia64 mips mipsel/mips mips64el/mips mips64/mips mipsn32el/mips mipsn32/mips powerpc powerpc64/powerpc sparc64 .if ${TARGET} == ${TARGET_ARCH} _t= ${TARGET} .else @@ -326,6 +326,8 @@ XFLAGS+= -B${WORLDTMP}/usr/bin .if (${TARGET_ARCH} == "arm" || ${TARGET_ARCH} == "armv6") && \ ${MK_ARM_EABI} != "no" TARGET_ABI= gnueabi +.elif ${TARGET_ARCH} == "armv6hf" +TARGET_ABI= gnueabihf .else TARGET_ABI= unknown .endif Modified: projects/arm_eabi_vfp/contrib/binutils/bfd/config.bfd ============================================================================== --- projects/arm_eabi_vfp/contrib/binutils/bfd/config.bfd Fri Aug 30 08:25:07 2013 (r255061) +++ projects/arm_eabi_vfp/contrib/binutils/bfd/config.bfd Fri Aug 30 08:29:23 2013 (r255062) @@ -281,7 +281,7 @@ case "${targ}" in targ_defvec=bfd_elf32_bigarm_vec targ_selvecs=bfd_elf32_littlearm_vec ;; - armv6-*-freebsd*) + armv6-*-freebsd* | armv6hf-*-freebsd*) targ_defvec=bfd_elf32_littlearm_vec targ_selvecs=bfd_elf32_bigarm_vec ;; Modified: projects/arm_eabi_vfp/gnu/usr.bin/binutils/Makefile.inc0 ============================================================================== --- projects/arm_eabi_vfp/gnu/usr.bin/binutils/Makefile.inc0 Fri Aug 30 08:25:07 2013 (r255061) +++ projects/arm_eabi_vfp/gnu/usr.bin/binutils/Makefile.inc0 Fri Aug 30 08:29:23 2013 (r255062) @@ -7,7 +7,7 @@ VERSION= "2.17.50 [FreeBSD] 2007-07-03" .if defined(TARGET_ARCH) -TARGET_CPUARCH=${TARGET_ARCH:C/mips(n32|64)?(el)?/mips/:C/arm(v6)?(eb)?/arm/:C/powerpc64/powerpc/} +TARGET_CPUARCH=${TARGET_ARCH:C/mips(n32|64)?(el)?/mips/:C/arm(v6)?(eb|hf)?/arm/:C/powerpc64/powerpc/} .else TARGET_CPUARCH=${MACHINE_CPUARCH} .endif Modified: projects/arm_eabi_vfp/gnu/usr.bin/cc/Makefile.tgt ============================================================================== --- projects/arm_eabi_vfp/gnu/usr.bin/cc/Makefile.tgt Fri Aug 30 08:25:07 2013 (r255061) +++ projects/arm_eabi_vfp/gnu/usr.bin/cc/Makefile.tgt Fri Aug 30 08:29:23 2013 (r255062) @@ -4,7 +4,7 @@ # MACHINE_CPUARCH, but there's no easy way to export make functions... .if defined(TARGET_ARCH) -TARGET_CPUARCH=${TARGET_ARCH:C/mips(n32|64)?(el)?/mips/:C/arm(v6)?(eb)?/arm/:C/powerpc64/powerpc/} +TARGET_CPUARCH=${TARGET_ARCH:C/mips(n32|64)?(el)?/mips/:C/arm(v6)?(eb|hf)?/arm/:C/powerpc64/powerpc/} .else TARGET_CPUARCH=${MACHINE_CPUARCH} .endif Modified: projects/arm_eabi_vfp/gnu/usr.bin/gdb/Makefile.inc ============================================================================== --- projects/arm_eabi_vfp/gnu/usr.bin/gdb/Makefile.inc Fri Aug 30 08:25:07 2013 (r255061) +++ projects/arm_eabi_vfp/gnu/usr.bin/gdb/Makefile.inc Fri Aug 30 08:29:23 2013 (r255062) @@ -20,7 +20,7 @@ OBJ_GDB= ${OBJ_ROOT}/gdb # MACHINE_CPUARCH, but there's no easy way to export make functions... .if defined(TARGET_ARCH) -TARGET_CPUARCH=${TARGET_ARCH:C/mips(n32|64)?(el)?/mips/:C/arm(v6)?(eb)?/arm/:C/powerpc64/powerpc/} +TARGET_CPUARCH=${TARGET_ARCH:C/mips(n32|64)?(el)?/mips/:C/arm(v6)?(eb|hf)?/arm/:C/powerpc64/powerpc/} .else TARGET_CPUARCH=${MACHINE_CPUARCH} .endif Modified: projects/arm_eabi_vfp/gnu/usr.bin/gdb/libgdb/Makefile ============================================================================== --- projects/arm_eabi_vfp/gnu/usr.bin/gdb/libgdb/Makefile Fri Aug 30 08:25:07 2013 (r255061) +++ projects/arm_eabi_vfp/gnu/usr.bin/gdb/libgdb/Makefile Fri Aug 30 08:29:23 2013 (r255062) @@ -4,7 +4,7 @@ # MACHINE_CPUARCH, but there's no easy way to export make functions... .if defined(TARGET_ARCH) -TARGET_CPUARCH=${TARGET_ARCH:C/mips(n32|64)?(el)?/mips/:C/arm(v6)?(eb)?/arm/:C/powerpc64/powerpc/} +TARGET_CPUARCH=${TARGET_ARCH:C/mips(n32|64)?(el)?/mips/:C/arm(v6)?(eb|hf)?/arm/:C/powerpc64/powerpc/} .else TARGET_CPUARCH=${MACHINE_CPUARCH} .endif Modified: projects/arm_eabi_vfp/lib/clang/clang.build.mk ============================================================================== --- projects/arm_eabi_vfp/lib/clang/clang.build.mk Fri Aug 30 08:25:07 2013 (r255061) +++ projects/arm_eabi_vfp/lib/clang/clang.build.mk Fri Aug 30 08:29:23 2013 (r255062) @@ -23,12 +23,14 @@ BUILD_ARCH?= ${MACHINE_ARCH} .if (${TARGET_ARCH} == "arm" || ${TARGET_ARCH} == "armv6") && \ ${MK_ARM_EABI} != "no" TARGET_ABI= gnueabi +.elif ${TARGET_ARCH} == "armv6hf" +TARGET_ABI= gnueabihf .else TARGET_ABI= unknown .endif -TARGET_TRIPLE?= ${TARGET_ARCH:C/amd64/x86_64/}-${TARGET_ABI}-freebsd10.0 -BUILD_TRIPLE?= ${BUILD_ARCH:C/amd64/x86_64/}-unknown-freebsd10.0 +TARGET_TRIPLE?= ${TARGET_ARCH:C/amd64/x86_64/:C/armv6hf/armv6/}-${TARGET_ABI}-freebsd10.0 +BUILD_TRIPLE?= ${BUILD_ARCH:C/amd64/x86_64/:C/armv6hf/armv6/}-unknown-freebsd10.0 CFLAGS+= -DLLVM_DEFAULT_TARGET_TRIPLE=\"${TARGET_TRIPLE}\" \ -DLLVM_HOST_TRIPLE=\"${BUILD_TRIPLE}\" \ -DDEFAULT_SYSROOT=\"${TOOLS_PREFIX}\" Modified: projects/arm_eabi_vfp/lib/libc/Makefile ============================================================================== --- projects/arm_eabi_vfp/lib/libc/Makefile Fri Aug 30 08:25:07 2013 (r255061) +++ projects/arm_eabi_vfp/lib/libc/Makefile Fri Aug 30 08:29:23 2013 (r255062) @@ -93,7 +93,8 @@ NOASM= .include "${.CURDIR}/rpc/Makefile.inc" .include "${.CURDIR}/uuid/Makefile.inc" .include "${.CURDIR}/xdr/Makefile.inc" -.if ${LIBC_ARCH} == "arm" || ${LIBC_ARCH} == "mips" +.if (${LIBC_ARCH} == "arm" && ${MACHINE_ARCH} != "armv6hf") ||\ + ${LIBC_ARCH} == "mips" .include "${.CURDIR}/softfloat/Makefile.inc" .endif .if ${MK_NIS} != "no" Modified: projects/arm_eabi_vfp/share/mk/bsd.endian.mk ============================================================================== --- projects/arm_eabi_vfp/share/mk/bsd.endian.mk Fri Aug 30 08:25:07 2013 (r255061) +++ projects/arm_eabi_vfp/share/mk/bsd.endian.mk Fri Aug 30 08:29:23 2013 (r255062) @@ -5,6 +5,7 @@ ${MACHINE_ARCH} == "ia64" || \ ${MACHINE_ARCH} == "arm" || \ ${MACHINE_ARCH} == "armv6" || \ + ${MACHINE_ARCH} == "armv6hf" || \ ${MACHINE_ARCH:Mmips*el} != "" TARGET_ENDIANNESS= 1234 .elif ${MACHINE_ARCH} == "powerpc" || \ Modified: projects/arm_eabi_vfp/share/mk/bsd.own.mk ============================================================================== --- projects/arm_eabi_vfp/share/mk/bsd.own.mk Fri Aug 30 08:25:07 2013 (r255061) +++ projects/arm_eabi_vfp/share/mk/bsd.own.mk Fri Aug 30 08:29:23 2013 (r255062) @@ -284,7 +284,6 @@ __DEFAULT_YES_OPTIONS = \ FP_LIBC \ FREEBSD_UPDATE \ GAMES \ - GCC \ GCOV \ GDB \ GNU \ @@ -405,7 +404,7 @@ __T=${MACHINE_ARCH} # Clang is only for x86, powerpc and little-endian arm right now, by default. .if ${__T} == "amd64" || ${__T} == "i386" || ${__T:Mpowerpc*} __DEFAULT_YES_OPTIONS+=CLANG CLANG_FULL -.elif ${__T} == "arm" || ${__T} == "armv6" +.elif ${__T} == "arm" || ${__T} == "armv6" || ${__T} == "armv6hf" __DEFAULT_YES_OPTIONS+=CLANG # GCC is unable to build the full clang on arm, disable it by default. __DEFAULT_NO_OPTIONS+=CLANG_FULL @@ -414,11 +413,17 @@ __DEFAULT_NO_OPTIONS+=CLANG CLANG_FULL .endif # Clang the default system compiler only on little-endian arm and x86. .if ${__T} == "amd64" || ${__T} == "arm" || ${__T} == "armv6" || \ - ${__T} == "i386" + ${__T} == "armv6hf" || ${__T} == "i386" __DEFAULT_YES_OPTIONS+=CLANG_IS_CC .else __DEFAULT_NO_OPTIONS+=CLANG_IS_CC .endif +# GCC has no support for armv6hf +.if ${__T} == "armv6hf" +__DEFAULT_NO_OPTIONS+=GCC +.else +__DEFAULT_YES_OPTIONS+=GCC +.endif # FDT is needed only for arm, mips and powerpc .if ${__T:Marm*} || ${__T:Mpowerpc*} || ${__T:Mmips*} __DEFAULT_YES_OPTIONS+=FDT Modified: projects/arm_eabi_vfp/share/mk/sys.mk ============================================================================== --- projects/arm_eabi_vfp/share/mk/sys.mk Fri Aug 30 08:25:07 2013 (r255061) +++ projects/arm_eabi_vfp/share/mk/sys.mk Fri Aug 30 08:29:23 2013 (r255062) @@ -13,7 +13,7 @@ unix ?= We run FreeBSD, not UNIX. # and/or endian. This is called MACHINE_CPU in NetBSD, but that's used # for something different in FreeBSD. # -MACHINE_CPUARCH=${MACHINE_ARCH:C/mips(n32|64)?(el)?/mips/:C/arm(v6)?(eb)?/arm/:C/powerpc64/powerpc/} +MACHINE_CPUARCH=${MACHINE_ARCH:C/mips(n32|64)?(el)?/mips/:C/arm(v6)?(eb|hf)?/arm/:C/powerpc64/powerpc/} .endif # Set any local definitions first. Place this early, but it needs Modified: projects/arm_eabi_vfp/usr.bin/xlint/Makefile.inc ============================================================================== --- projects/arm_eabi_vfp/usr.bin/xlint/Makefile.inc Fri Aug 30 08:25:07 2013 (r255061) +++ projects/arm_eabi_vfp/usr.bin/xlint/Makefile.inc Fri Aug 30 08:29:23 2013 (r255062) @@ -8,7 +8,7 @@ WARNS?= 0 # These assignments duplicate much of the functionality of # MACHINE_CPUARCH, but there's no easy way to export make functions... .if defined(TARGET_ARCH) -TARGET_CPUARCH= ${TARGET_ARCH:C/mips(n32|64)?(el)?/mips/:C/arm(v6)?(eb)?/arm/} +TARGET_CPUARCH= ${TARGET_ARCH:C/mips(n32|64)?(el)?/mips/:C/arm(v6)?(eb|hf)?/arm/} .else TARGET_CPUARCH= ${MACHINE_CPUARCH} TARGET_ARCH= ${MACHINE_ARCH} From owner-svn-src-projects@FreeBSD.ORG Fri Aug 30 08:38:05 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id E5069202; Fri, 30 Aug 2013 08:38:05 +0000 (UTC) (envelope-from andrew@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id B783521F3; Fri, 30 Aug 2013 08:38:05 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id r7U8c5T4083894; Fri, 30 Aug 2013 08:38:05 GMT (envelope-from andrew@svn.freebsd.org) Received: (from andrew@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id r7U8c4HY083886; Fri, 30 Aug 2013 08:38:04 GMT (envelope-from andrew@svn.freebsd.org) Message-Id: <201308300838.r7U8c4HY083886@svn.freebsd.org> From: Andrew Turner Date: Fri, 30 Aug 2013 08:38:04 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r255063 - in projects/arm_eabi_vfp/lib/libc/arm: aeabi gen X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 30 Aug 2013 08:38:06 -0000 Author: andrew Date: Fri Aug 30 08:38:04 2013 New Revision: 255063 URL: http://svnweb.freebsd.org/changeset/base/255063 Log: Add the start of the libc __aeabi_* functions. These are written so we could use them with the soft float ABI. They are not fully working, for example: printf("%f", 0.22); will print: 0.0F0000 Added: projects/arm_eabi_vfp/lib/libc/arm/aeabi/aeabi_vfp.h (contents, props changed) projects/arm_eabi_vfp/lib/libc/arm/aeabi/aeabi_vfp_double.S (contents, props changed) projects/arm_eabi_vfp/lib/libc/arm/aeabi/aeabi_vfp_float.S (contents, props changed) Modified: projects/arm_eabi_vfp/lib/libc/arm/aeabi/Makefile.inc projects/arm_eabi_vfp/lib/libc/arm/gen/flt_rounds.c Modified: projects/arm_eabi_vfp/lib/libc/arm/aeabi/Makefile.inc ============================================================================== --- projects/arm_eabi_vfp/lib/libc/arm/aeabi/Makefile.inc Fri Aug 30 08:29:23 2013 (r255062) +++ projects/arm_eabi_vfp/lib/libc/arm/aeabi/Makefile.inc Fri Aug 30 08:38:04 2013 (r255063) @@ -3,9 +3,13 @@ .PATH: ${.CURDIR}/arm/aeabi SRCS+= aeabi_atexit.c \ - aeabi_double.c \ - aeabi_float.c \ - aeabi_unwind_cpp.c + aeabi_unwind_cpp.c \ + aeabi_vfp_double.S \ + aeabi_vfp_float.S +.if ${MACHINE_ARCH} != "armv6hf" +SRCS+= aeabi_double.c \ + aeabi_float.c +.endif # Add the aeabi_mem* functions. While they live in compiler-rt they call into # libc. This causes issues when other parts of libc call these functions. Added: projects/arm_eabi_vfp/lib/libc/arm/aeabi/aeabi_vfp.h ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/arm_eabi_vfp/lib/libc/arm/aeabi/aeabi_vfp.h Fri Aug 30 08:38:04 2013 (r255063) @@ -0,0 +1,112 @@ +/* + * Copyright (C) 2013 Andrew Turner + * 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. + * + */ + +#ifndef AEABI_VFP_H +#define AEABI_VFP_H + +/* + * ASM helper macros. These allow the functions to be changed when + * building for a hard-float version of the ABI. + */ + +#ifndef __ARM_PCS_VFP +/* Define a standard name for the function */ +#define AEABI_ENTRY(x) ENTRY(__aeabi_ ## x ## _softfp) +#define AEABI_END(x) END(__aeabi_ ## x ## _softfp) + +/* + * These should be used when a function either takes, or returns a floating + * point falue. They will load the data from an ARM to a VFP register(s), + * or from a VFP to an ARM register + */ +#ifdef __ARMEB__ +#define LOAD_DREG(vreg, reg0, reg1) vmov vreg, reg1, reg0 +#define UNLOAD_DREG(reg0, reg1, vreg) vmov reg1, reg0, vreg +#else +#define LOAD_DREG(vreg, reg0, reg1) vmov vreg, reg0, reg1 +#define UNLOAD_DREG(reg0, reg1, vreg) vmov reg0, reg1, vreg +#endif + +#define LOAD_SREGS(vreg0, vreg1, reg0, reg1) vmov vreg0, vreg1, reg0, reg1 +#define LOAD_SREG(vreg, reg) vmov vreg, reg +#define UNLOAD_SREG(reg, vreg) vmov reg, vreg +#else +#define AEABI_ENTRY(x) ENTRY(__aeabi_ ## x) +#define AEABI_END(x) END(__aeabi_ ## x) + +/* + * On ARM Hard-Float we don't need these as the data + * is already in the VFP registers. + */ +#define LOAD_DREG(vreg, reg0, reg1) +#define UNLOAD_DREG(reg0, reg1, vreg) + +#define LOAD_SREGS(vreg0, vreg1, reg0, reg1) +#define LOAD_SREG(vreg, reg) +#define UNLOAD_SREG(reg, vreg) +#endif + +/* + * C Helper macros + */ + +/* + * Generate a function that will either call into the VFP implementation, + * or the soft float version for a given __aeabi_* helper. The function + * will take a single argument of the type given by in_type. + */ +#define AEABI_FUNC(name, in_type, soft_func) \ +__aeabi_ ## name(in_type a) \ +{ \ + if (_libc_arm_fpu_present) \ + return __aeabi_ ## name ## _softfp(a); \ + else \ + return soft_func (a); \ +} + +/* As above, but takes two arguments of the same type */ +#define AEABI_FUNC2(name, in_type, soft_func) \ +__aeabi_ ## name(in_type a, in_type b) \ +{ \ + if (_libc_arm_fpu_present) \ + return __aeabi_ ## name ## _softfp(a, b); \ + else \ + return soft_func (a, b); \ +} + +/* As above, but with the soft float arguments reversed */ +#define AEABI_FUNC2_REV(name, in_type, soft_func) \ +__aeabi_ ## name(in_type a, in_type b) \ +{ \ + if (_libc_arm_fpu_present) \ + return __aeabi_ ## name ## _softfp(a, b); \ + else \ + return soft_func (b, a); \ +} + +#endif + Added: projects/arm_eabi_vfp/lib/libc/arm/aeabi/aeabi_vfp_double.S ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/arm_eabi_vfp/lib/libc/arm/aeabi/aeabi_vfp_double.S Fri Aug 30 08:38:04 2013 (r255063) @@ -0,0 +1,168 @@ +/* + * Copyright (C) 2013 Andrew Turner + * 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. + * + */ + +#include +#include "aeabi_vfp.h" + +.fpu vfp +.syntax unified + +/* int __aeabi_dcmpeq(double, double) */ +AEABI_ENTRY(dcmpeq) + LOAD_DREG(d0, r0, r1) + LOAD_DREG(d1, r2, r3) + vcmp.f64 d0, d1 + vmrs APSR_nzcv, fpscr + movne r0, #0 + moveq r0, #1 + RET +AEABI_END(dcmpeq) + +/* int __aeabi_dcmplt(double, double) */ +AEABI_ENTRY(dcmplt) + LOAD_DREG(d0, r0, r1) + LOAD_DREG(d1, r2, r3) + vcmp.f64 d0, d1 + vmrs APSR_nzcv, fpscr + movcs r0, #0 + movlt r0, #1 + RET +AEABI_END(dcmplt) + +/* int __aeabi_dcmple(double, double) */ +AEABI_ENTRY(dcmple) + LOAD_DREG(d0, r0, r1) + LOAD_DREG(d1, r2, r3) + vcmp.f64 d0, d1 + vmrs APSR_nzcv, fpscr + movhi r0, #0 + movls r0, #1 + RET +AEABI_END(dcmple) + +/* int __aeabi_dcmpge(double, double) */ +AEABI_ENTRY(dcmpge) + LOAD_DREG(d0, r0, r1) + LOAD_DREG(d1, r2, r3) + vcmp.f64 d0, d1 + vmrs APSR_nzcv, fpscr + movlt r0, #0 + movge r0, #1 + RET +AEABI_END(dcmpge) + +/* int __aeabi_dcmpgt(double, double) */ +AEABI_ENTRY(dcmpgt) + LOAD_DREG(d0, r0, r1) + LOAD_DREG(d1, r2, r3) + vcmp.f64 d0, d1 + vmrs APSR_nzcv, fpscr + movle r0, #0 + movgt r0, #1 + RET +AEABI_END(dcmpgt) + +/* int __aeabi_dcmpun(double, double) */ +AEABI_ENTRY(dcmpun) + LOAD_DREG(d0, r0, r1) + LOAD_DREG(d1, r2, r3) + vcmp.f64 d0, d1 + vmrs APSR_nzcv, fpscr + movvc r0, #0 + movvs r0, #1 + RET +AEABI_END(dcmpun) + +/* int __aeabi_d2iz(double) */ +AEABI_ENTRY(d2iz) + LOAD_DREG(d0, r0, r1) +#if 0 + /* + * This should be the correct instruction, but binutils incorrectly + * encodes it as the version that used FPSCR to determine the rounding. + * When binutils is fixed we can use this again. + */ + vcvt.s32.f64 s0, d0 +#else + ftosizd s0, d0 +#endif + vmov r0, s0 + RET +AEABI_END(d2iz) + +/* float __aeabi_d2f(double) */ +AEABI_ENTRY(d2f) + LOAD_DREG(d0, r0, r1) + vcvt.f32.f64 s0, d0 + UNLOAD_SREG(r0, s0) + RET +AEABI_END(d2f) + +/* double __aeabi_i2d(int) */ +AEABI_ENTRY(i2d) + vmov s0, r0 + vcvt.f64.s32 d0, s0 + UNLOAD_DREG(r0, r1, d0) + RET +AEABI_END(i2d) + +/* double __aeabi_dadd(double, double) */ +AEABI_ENTRY(dadd) + LOAD_DREG(d0, r0, r1) + LOAD_DREG(d1, r2, r3) + vadd.f64 d0, d0, d1 + UNLOAD_DREG(r0, r1, d0) + RET +AEABI_END(dadd) + +/* double __aeabi_ddiv(double, double) */ +AEABI_ENTRY(ddiv) + LOAD_DREG(d0, r0, r1) + LOAD_DREG(d1, r2, r3) + vdiv.f64 d0, d0, d1 + UNLOAD_DREG(r0, r1, d0) + RET +AEABI_END(ddiv) + +/* double __aeabi_dmul(double, double) */ +AEABI_ENTRY(dmul) + LOAD_DREG(d0, r0, r1) + LOAD_DREG(d1, r2, r3) + vmul.f64 d0, d0, d1 + UNLOAD_DREG(r0, r1, d0) + RET +AEABI_END(dmul) + +/* double __aeabi_dsub(double, double) */ +AEABI_ENTRY(dsub) + LOAD_DREG(d0, r0, r1) + LOAD_DREG(d1, r2, r3) + vsub.f64 d0, d0, d1 + UNLOAD_DREG(r0, r1, d0) + RET +AEABI_END(dsub) + Added: projects/arm_eabi_vfp/lib/libc/arm/aeabi/aeabi_vfp_float.S ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/arm_eabi_vfp/lib/libc/arm/aeabi/aeabi_vfp_float.S Fri Aug 30 08:38:04 2013 (r255063) @@ -0,0 +1,158 @@ +/* + * Copyright (C) 2013 Andrew Turner + * 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. + * + */ + +#include +#include "aeabi_vfp.h" + +.fpu vfp +.syntax unified + +/* int __aeabi_fcmpeq(float, float) */ +AEABI_ENTRY(fcmpeq) + LOAD_SREGS(s0, s1, r0, r1) + vcmp.f32 s0, s1 + vmrs APSR_nzcv, fpscr + movne r0, #0 + moveq r0, #1 + RET +AEABI_END(fcmpeq) + +/* int __aeabi_fcmplt(float, float) */ +AEABI_ENTRY(fcmplt) + LOAD_SREGS(s0, s1, r0, r1) + vcmp.f32 s0, s1 + vmrs APSR_nzcv, fpscr + movcs r0, #0 + movlt r0, #1 + RET +AEABI_END(fcmplt) + +/* int __aeabi_fcmple(float, float) */ +AEABI_ENTRY(fcmple) + LOAD_SREGS(s0, s1, r0, r1) + vcmp.f32 s0, s1 + vmrs APSR_nzcv, fpscr + movhi r0, #0 + movls r0, #1 + RET +AEABI_END(fcmple) + +/* int __aeabi_fcmpge(float, float) */ +AEABI_ENTRY(fcmpge) + LOAD_SREGS(s0, s1, r0, r1) + vcmp.f32 s0, s1 + vmrs APSR_nzcv, fpscr + movlt r0, #0 + movge r0, #1 + RET +AEABI_END(fcmpge) + +/* int __aeabi_fcmpgt(float, float) */ +AEABI_ENTRY(fcmpgt) + LOAD_SREGS(s0, s1, r0, r1) + vcmp.f32 s0, s1 + vmrs APSR_nzcv, fpscr + movle r0, #0 + movgt r0, #1 + RET +AEABI_END(fcmpgt) + +/* int __aeabi_fcmpun(float, float) */ +AEABI_ENTRY(fcmpun) + LOAD_SREGS(s0, s1, r0, r1) + vcmp.f32 s0, s1 + vmrs APSR_nzcv, fpscr + movvc r0, #0 + movvs r0, #1 + RET +AEABI_END(fcmpun) + +/* int __aeabi_f2iz(float) */ +AEABI_ENTRY(f2iz) + LOAD_SREG(s0, r0) +#if 0 + /* + * This should be the correct instruction, but binutils incorrectly + * encodes it as the version that used FPSCR to determine the rounding. + * When binutils is fixed we can use this again. + */ + vcvt.s32.f32 s0, s0 +#else + ftosizs s0, s0 +#endif + vmov r0, s0 + RET +AEABI_END(f2iz) + +/* double __aeabi_f2d(float) */ +AEABI_ENTRY(f2d) + LOAD_SREG(s0, r0) + vcvt.f64.f32 d0, s0 + UNLOAD_DREG(r0, r1, d0) + RET +AEABI_END(f2d) + +/* float __aeabi_i2f(int) */ +AEABI_ENTRY(i2f) + vmov s0, r0 + vcvt.f32.s32 s0, s0 + UNLOAD_SREG(r0, s0) + RET +AEABI_END(i2f) + +/* float __aeabi_fadd(float, float) */ +AEABI_ENTRY(fadd) + LOAD_SREGS(s0, s1, r0, r1) + vadd.f32 s0, s0, s1 + UNLOAD_SREG(r0, s0) + RET +AEABI_END(fadd) + +/* float __aeabi_fmul(float, float) */ +AEABI_ENTRY(fdiv) + LOAD_SREGS(s0, s1, r0, r1) + vdiv.f32 s0, s0, s1 + UNLOAD_SREG(r0, s0) + RET +AEABI_END(fdiv) + +/* float __aeabi_fmul(float, float) */ +AEABI_ENTRY(fmul) + LOAD_SREGS(s0, s1, r0, r1) + vmul.f32 s0, s0, s1 + UNLOAD_SREG(r0, s0) + RET +AEABI_END(fmul) + +/* float __aeabi_fsub(float, float) */ +AEABI_ENTRY(fsub) + LOAD_SREGS(s0, s1, r0, r1) + vsub.f32 s0, s0, s1 + UNLOAD_SREG(r0, s0) + RET +AEABI_END(fsub) + Modified: projects/arm_eabi_vfp/lib/libc/arm/gen/flt_rounds.c ============================================================================== --- projects/arm_eabi_vfp/lib/libc/arm/gen/flt_rounds.c Fri Aug 30 08:29:23 2013 (r255062) +++ projects/arm_eabi_vfp/lib/libc/arm/gen/flt_rounds.c Fri Aug 30 08:38:04 2013 (r255063) @@ -30,15 +30,17 @@ __FBSDID("$FreeBSD$"); #include #include +#ifndef __ARM_PCS_VFP #include "softfloat-for-gcc.h" #include "milieu.h" #include "softfloat.h" +#endif int __flt_rounds(void) { -#ifndef ARM_HARD_FLOAT +#ifndef __ARM_PCS_VFP /* * Translate our rounding modes to the unnamed * manifest constants required by C99 et. al. From owner-svn-src-projects@FreeBSD.ORG Fri Aug 30 11:38:41 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 073D5443; Fri, 30 Aug 2013 11:38:41 +0000 (UTC) (envelope-from markm@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id E5DDF2CED; Fri, 30 Aug 2013 11:38:40 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id r7UBcel7085622; Fri, 30 Aug 2013 11:38:40 GMT (envelope-from markm@svn.freebsd.org) Received: (from markm@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id r7UBcZGn085569; Fri, 30 Aug 2013 11:38:35 GMT (envelope-from markm@svn.freebsd.org) Message-Id: <201308301138.r7UBcZGn085569@svn.freebsd.org> From: Mark Murray Date: Fri, 30 Aug 2013 11:38:35 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r255070 - in projects/random_number_generator: . bin/ps bin/sh cddl/contrib/opensolaris/tools/ctf/cvt cddl/lib/libzpool cddl/usr.bin/ztest cddl/usr.sbin/zdb contrib/libexecinfo contrib/... X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 30 Aug 2013 11:38:41 -0000 Author: markm Date: Fri Aug 30 11:38:34 2013 New Revision: 255070 URL: http://svnweb.freebsd.org/changeset/base/255070 Log: MFC Added: projects/random_number_generator/etc/periodic/monthly/450.status-security - copied unchanged from r255069, head/etc/periodic/monthly/450.status-security projects/random_number_generator/etc/periodic/weekly/450.status-security - copied unchanged from r255069, head/etc/periodic/weekly/450.status-security projects/random_number_generator/share/man/man4/procdesc.4 - copied unchanged from r255069, head/share/man/man4/procdesc.4 projects/random_number_generator/sys/contrib/dev/iwn/iwlwifi-2000-18.168.6.1.fw.uu - copied unchanged from r255069, head/sys/contrib/dev/iwn/iwlwifi-2000-18.168.6.1.fw.uu projects/random_number_generator/sys/dev/xen/timer/ - copied from r255069, head/sys/dev/xen/timer/ projects/random_number_generator/sys/modules/iwnfw/iwn2000/ - copied from r255069, head/sys/modules/iwnfw/iwn2000/ projects/random_number_generator/sys/sys/_unrhdr.h - copied unchanged from r255069, head/sys/sys/_unrhdr.h projects/random_number_generator/sys/x86/xen/ - copied from r255069, head/sys/x86/xen/ projects/random_number_generator/sys/xen/evtchn/evtchnvar.h - copied unchanged from r255069, head/sys/xen/evtchn/evtchnvar.h projects/random_number_generator/sys/xen/xen-os.h - copied unchanged from r255069, head/sys/xen/xen-os.h Deleted: projects/random_number_generator/sys/dev/xen/xenpci/evtchn.c projects/random_number_generator/sys/i386/include/xen/xen_clock_util.h projects/random_number_generator/sys/i386/xen/xen_clock_util.c projects/random_number_generator/sys/i386/xen/xen_rtc.c projects/random_number_generator/sys/xen/evtchn/evtchn.c projects/random_number_generator/tools/build/options/WITH_BSDCONFIG projects/random_number_generator/tools/build/options/WITH_GNU_PATCH Modified: projects/random_number_generator/Makefile.inc1 projects/random_number_generator/ObsoleteFiles.inc projects/random_number_generator/UPDATING projects/random_number_generator/bin/ps/keyword.c projects/random_number_generator/bin/ps/ps.1 projects/random_number_generator/bin/sh/parser.c projects/random_number_generator/bin/sh/parser.h projects/random_number_generator/cddl/contrib/opensolaris/tools/ctf/cvt/dwarf.c projects/random_number_generator/cddl/lib/libzpool/Makefile projects/random_number_generator/cddl/usr.bin/ztest/Makefile projects/random_number_generator/cddl/usr.sbin/zdb/Makefile projects/random_number_generator/contrib/libexecinfo/backtrace.3 projects/random_number_generator/contrib/libexecinfo/backtrace.c projects/random_number_generator/contrib/libexecinfo/symtab.c projects/random_number_generator/contrib/pam_modules/pam_passwdqc/pam_passwdqc.c projects/random_number_generator/etc/defaults/periodic.conf projects/random_number_generator/etc/mtree/BSD.usr.dist projects/random_number_generator/etc/periodic/monthly/Makefile projects/random_number_generator/etc/periodic/security/100.chksetuid projects/random_number_generator/etc/periodic/security/110.neggrpperm projects/random_number_generator/etc/periodic/security/200.chkmounts projects/random_number_generator/etc/periodic/security/300.chkuid0 projects/random_number_generator/etc/periodic/security/400.passwdless projects/random_number_generator/etc/periodic/security/410.logincheck projects/random_number_generator/etc/periodic/security/460.chkportsum projects/random_number_generator/etc/periodic/security/500.ipfwdenied projects/random_number_generator/etc/periodic/security/510.ipfdenied projects/random_number_generator/etc/periodic/security/520.pfdenied projects/random_number_generator/etc/periodic/security/550.ipfwlimit projects/random_number_generator/etc/periodic/security/610.ipf6denied projects/random_number_generator/etc/periodic/security/700.kernelmsg projects/random_number_generator/etc/periodic/security/800.loginfail projects/random_number_generator/etc/periodic/security/900.tcpwrap projects/random_number_generator/etc/periodic/security/security.functions projects/random_number_generator/etc/periodic/weekly/Makefile projects/random_number_generator/etc/rc.d/savecore projects/random_number_generator/gnu/usr.bin/patch/Makefile projects/random_number_generator/lib/libc/gen/wordexp.c projects/random_number_generator/lib/libc/sys/pdfork.2 projects/random_number_generator/lib/libpam/modules/pam_passwdqc/Makefile projects/random_number_generator/lib/libutil/expand_number.c projects/random_number_generator/lib/libutil/login_auth.c projects/random_number_generator/lib/libutil/login_cap.c projects/random_number_generator/lib/libutil/pidfile.c projects/random_number_generator/lib/libutil/quotafile.c projects/random_number_generator/lib/libutil/uucplock.c projects/random_number_generator/lib/msun/src/s_erf.c projects/random_number_generator/lib/msun/src/s_erff.c projects/random_number_generator/release/scripts/mm-mtree.sh projects/random_number_generator/sbin/camcontrol/camcontrol.c projects/random_number_generator/sbin/etherswitchcfg/etherswitchcfg.8 projects/random_number_generator/share/man/man4/Makefile projects/random_number_generator/share/man/man4/capsicum.4 projects/random_number_generator/share/man/man4/cd.4 projects/random_number_generator/share/man/man4/sysmouse.4 projects/random_number_generator/share/man/man4/vmx.4 projects/random_number_generator/share/man/man5/periodic.conf.5 projects/random_number_generator/share/man/man5/src.conf.5 projects/random_number_generator/share/mk/bsd.own.mk projects/random_number_generator/share/mk/sys.mk projects/random_number_generator/sys/amd64/amd64/apic_vector.S projects/random_number_generator/sys/amd64/amd64/cpu_switch.S projects/random_number_generator/sys/amd64/amd64/genassym.c projects/random_number_generator/sys/amd64/amd64/machdep.c projects/random_number_generator/sys/amd64/amd64/mp_machdep.c projects/random_number_generator/sys/amd64/amd64/pmap.c projects/random_number_generator/sys/amd64/amd64/vm_machdep.c projects/random_number_generator/sys/amd64/include/apicvar.h projects/random_number_generator/sys/amd64/include/cpufunc.h projects/random_number_generator/sys/amd64/include/intr_machdep.h projects/random_number_generator/sys/amd64/include/pcpu.h projects/random_number_generator/sys/amd64/include/pmap.h projects/random_number_generator/sys/amd64/include/smp.h projects/random_number_generator/sys/amd64/include/xen/hypercall.h projects/random_number_generator/sys/amd64/include/xen/xen-os.h projects/random_number_generator/sys/amd64/vmm/vmm_instruction_emul.c projects/random_number_generator/sys/arm/arm/pmap-v6.c projects/random_number_generator/sys/arm/arm/pmap.c projects/random_number_generator/sys/boot/forth/beastie.4th projects/random_number_generator/sys/boot/forth/version.4th projects/random_number_generator/sys/boot/forth/version.4th.8 projects/random_number_generator/sys/cam/scsi/scsi_all.c projects/random_number_generator/sys/cam/scsi/scsi_ch.c projects/random_number_generator/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c projects/random_number_generator/sys/compat/freebsd32/freebsd32.h projects/random_number_generator/sys/conf/Makefile.amd64 projects/random_number_generator/sys/conf/files projects/random_number_generator/sys/conf/files.amd64 projects/random_number_generator/sys/conf/files.i386 projects/random_number_generator/sys/dev/ahci/ahci.c projects/random_number_generator/sys/dev/ath/if_ath.c projects/random_number_generator/sys/dev/cxgbe/adapter.h projects/random_number_generator/sys/dev/cxgbe/offload.h projects/random_number_generator/sys/dev/cxgbe/osdep.h projects/random_number_generator/sys/dev/cxgbe/t4_main.c projects/random_number_generator/sys/dev/cxgbe/t4_sge.c projects/random_number_generator/sys/dev/cxgbe/t4_tracer.c projects/random_number_generator/sys/dev/cxgbe/tom/t4_cpl_io.c projects/random_number_generator/sys/dev/cxgbe/tom/t4_tom.c projects/random_number_generator/sys/dev/drm2/drmP.h projects/random_number_generator/sys/dev/drm2/drm_atomic.h projects/random_number_generator/sys/dev/drm2/drm_context.c projects/random_number_generator/sys/dev/drm2/drm_irq.c projects/random_number_generator/sys/dev/drm2/drm_sysctl.c projects/random_number_generator/sys/dev/drm2/i915/i915_gem.c projects/random_number_generator/sys/dev/drm2/i915/i915_gem_execbuffer.c projects/random_number_generator/sys/dev/drm2/i915/intel_display.c projects/random_number_generator/sys/dev/drm2/ttm/ttm_bo.c projects/random_number_generator/sys/dev/drm2/ttm/ttm_bo_util.c projects/random_number_generator/sys/dev/drm2/ttm/ttm_bo_vm.c projects/random_number_generator/sys/dev/fb/vesa.c projects/random_number_generator/sys/dev/fdc/fdc.c projects/random_number_generator/sys/dev/flash/mx25l.c projects/random_number_generator/sys/dev/gpio/gpiobus.c projects/random_number_generator/sys/dev/hwpmc/pmc_events.h projects/random_number_generator/sys/dev/iwn/if_iwn.c projects/random_number_generator/sys/dev/qlxgbe/ql_misc.c projects/random_number_generator/sys/dev/qlxgbe/ql_os.c projects/random_number_generator/sys/dev/uart/uart_dev_ns8250.c projects/random_number_generator/sys/dev/vmware/vmxnet3/if_vmx.c projects/random_number_generator/sys/dev/vmware/vmxnet3/if_vmxvar.h projects/random_number_generator/sys/dev/xen/balloon/balloon.c projects/random_number_generator/sys/dev/xen/blkback/blkback.c projects/random_number_generator/sys/dev/xen/blkfront/blkfront.c projects/random_number_generator/sys/dev/xen/blkfront/block.h projects/random_number_generator/sys/dev/xen/console/console.c projects/random_number_generator/sys/dev/xen/console/xencons_ring.c projects/random_number_generator/sys/dev/xen/control/control.c projects/random_number_generator/sys/dev/xen/netback/netback.c projects/random_number_generator/sys/dev/xen/netfront/netfront.c projects/random_number_generator/sys/dev/xen/xenpci/xenpci.c projects/random_number_generator/sys/dev/xen/xenpci/xenpcivar.h projects/random_number_generator/sys/fs/nfs/nfs.h projects/random_number_generator/sys/fs/tmpfs/tmpfs_subr.c projects/random_number_generator/sys/geom/zero/g_zero.c projects/random_number_generator/sys/i386/i386/apic_vector.s projects/random_number_generator/sys/i386/i386/machdep.c projects/random_number_generator/sys/i386/i386/mp_machdep.c projects/random_number_generator/sys/i386/i386/pmap.c projects/random_number_generator/sys/i386/include/apicvar.h projects/random_number_generator/sys/i386/include/intr_machdep.h projects/random_number_generator/sys/i386/include/pcpu.h projects/random_number_generator/sys/i386/include/pmap.h projects/random_number_generator/sys/i386/include/xen/xen-os.h projects/random_number_generator/sys/i386/include/xen/xenfunc.h projects/random_number_generator/sys/i386/include/xen/xenvar.h projects/random_number_generator/sys/i386/isa/npx.c projects/random_number_generator/sys/i386/xen/clock.c projects/random_number_generator/sys/i386/xen/exception.s projects/random_number_generator/sys/i386/xen/mp_machdep.c projects/random_number_generator/sys/i386/xen/mptable.c projects/random_number_generator/sys/i386/xen/pmap.c projects/random_number_generator/sys/i386/xen/xen_machdep.c projects/random_number_generator/sys/ia64/ia64/pmap.c projects/random_number_generator/sys/kern/kern_event.c projects/random_number_generator/sys/kern/kern_physio.c projects/random_number_generator/sys/kern/kern_proc.c projects/random_number_generator/sys/kern/kern_synch.c projects/random_number_generator/sys/kern/subr_unit.c projects/random_number_generator/sys/kern/uipc_mbuf.c projects/random_number_generator/sys/kern/uipc_socket.c projects/random_number_generator/sys/kern/vfs_cluster.c projects/random_number_generator/sys/mips/atheros/ar71xx_spi.c projects/random_number_generator/sys/mips/atheros/if_arge.c projects/random_number_generator/sys/mips/conf/ROUTERSTATION.hints projects/random_number_generator/sys/mips/malta/gt_pci.c projects/random_number_generator/sys/mips/malta/yamon.c projects/random_number_generator/sys/mips/mips/pmap.c projects/random_number_generator/sys/modules/ip6_mroute_mod/Makefile projects/random_number_generator/sys/modules/linux/Makefile projects/random_number_generator/sys/net/if_lagg.c projects/random_number_generator/sys/net/if_lagg.h projects/random_number_generator/sys/net/if_llatbl.h projects/random_number_generator/sys/net/if_pfsync.h projects/random_number_generator/sys/net80211/ieee80211_output.c projects/random_number_generator/sys/net80211/ieee80211_proto.h projects/random_number_generator/sys/netinet/icmp_var.h projects/random_number_generator/sys/netinet/igmp_var.h projects/random_number_generator/sys/netinet/in.h projects/random_number_generator/sys/netinet/pim_var.h projects/random_number_generator/sys/netinet/tcp_lro.c projects/random_number_generator/sys/netinet/tcp_lro.h projects/random_number_generator/sys/netinet/tcp_var.h projects/random_number_generator/sys/netinet/udp_var.h projects/random_number_generator/sys/netinet6/pim6_var.h projects/random_number_generator/sys/netipsec/ipsec.h projects/random_number_generator/sys/netipsec/key_var.h projects/random_number_generator/sys/powerpc/powerpc/mmu_if.m projects/random_number_generator/sys/powerpc/powerpc/pmap_dispatch.c projects/random_number_generator/sys/sparc64/sparc64/pmap.c projects/random_number_generator/sys/sys/bitset.h projects/random_number_generator/sys/sys/cpuset.h projects/random_number_generator/sys/sys/kernel.h projects/random_number_generator/sys/sys/mbuf.h projects/random_number_generator/sys/sys/socket.h projects/random_number_generator/sys/sys/sysctl.h projects/random_number_generator/sys/sys/systm.h projects/random_number_generator/sys/sys/user.h projects/random_number_generator/sys/ufs/ffs/ffs_alloc.c projects/random_number_generator/sys/ufs/ufs/ufs_dirhash.c projects/random_number_generator/sys/vm/pmap.h projects/random_number_generator/sys/vm/vm_map.c projects/random_number_generator/sys/vm/vm_page.c projects/random_number_generator/sys/x86/include/segments.h projects/random_number_generator/sys/x86/x86/local_apic.c projects/random_number_generator/sys/xen/evtchn.h projects/random_number_generator/sys/xen/evtchn/evtchn_dev.c projects/random_number_generator/sys/xen/features.c projects/random_number_generator/sys/xen/gnttab.c projects/random_number_generator/sys/xen/gnttab.h projects/random_number_generator/sys/xen/hvm.h projects/random_number_generator/sys/xen/interface/event_channel.h projects/random_number_generator/sys/xen/xen_intr.h projects/random_number_generator/sys/xen/xenbus/xenbus.c projects/random_number_generator/sys/xen/xenbus/xenbus_if.m projects/random_number_generator/sys/xen/xenbus/xenbusb_front.c projects/random_number_generator/sys/xen/xenbus/xenbusvar.h projects/random_number_generator/sys/xen/xenstore/xenstore.c projects/random_number_generator/sys/xen/xenstore/xenstore_dev.c projects/random_number_generator/sys/xen/xenstore/xenstorevar.h projects/random_number_generator/tools/build/mk/OptionalObsoleteFiles.inc projects/random_number_generator/usr.bin/brandelf/brandelf.1 projects/random_number_generator/usr.bin/dig/Makefile projects/random_number_generator/usr.bin/host/Makefile projects/random_number_generator/usr.bin/nslookup/Makefile projects/random_number_generator/usr.bin/patch/Makefile projects/random_number_generator/usr.sbin/bhyve/pci_emul.c projects/random_number_generator/usr.sbin/bhyve/pci_virtio_block.c projects/random_number_generator/usr.sbin/crashinfo/crashinfo.sh projects/random_number_generator/usr.sbin/rtadvd/config.c Directory Properties: projects/random_number_generator/ (props changed) projects/random_number_generator/cddl/ (props changed) projects/random_number_generator/cddl/contrib/opensolaris/ (props changed) projects/random_number_generator/contrib/libexecinfo/ (props changed) projects/random_number_generator/lib/libc/ (props changed) projects/random_number_generator/lib/libutil/ (props changed) projects/random_number_generator/sbin/ (props changed) projects/random_number_generator/share/man/man4/ (props changed) projects/random_number_generator/sys/ (props changed) projects/random_number_generator/sys/amd64/include/xen/ (props changed) projects/random_number_generator/sys/amd64/vmm/ (props changed) projects/random_number_generator/sys/boot/ (props changed) projects/random_number_generator/sys/cddl/contrib/opensolaris/ (props changed) projects/random_number_generator/sys/conf/ (props changed) projects/random_number_generator/usr.sbin/bhyve/ (props changed) projects/random_number_generator/usr.sbin/rtadvd/ (props changed) Modified: projects/random_number_generator/Makefile.inc1 ============================================================================== --- projects/random_number_generator/Makefile.inc1 Fri Aug 30 11:21:52 2013 (r255069) +++ projects/random_number_generator/Makefile.inc1 Fri Aug 30 11:38:34 2013 (r255070) @@ -265,7 +265,7 @@ WMAKEENV= ${CROSSENV} \ PATH=${TMPPATH} # make hierarchy -HMAKE= PATH=${TMPPATH} ${MAKE} LOCAL_MTREE=${LOCAL_MTREE} +HMAKE= PATH=${TMPPATH} ${MAKE} LOCAL_MTREE=${LOCAL_MTREE:Q} .if defined(NO_ROOT) HMAKE+= PATH=${TMPPATH} METALOG=${METALOG} -DNO_ROOT .endif @@ -814,7 +814,7 @@ distributeworld installworld: installche cd ${.CURDIR}/etc; ${CROSSENV} PATH=${TMPPATH} ${MAKE} \ METALOG=${METALOG} ${IMAKE_INSTALL} ${IMAKE_MTREE} \ DISTBASE=/base DESTDIR=${DESTDIR}/${DISTDIR}/base \ - LOCAL_MTREE=${LOCAL_MTREE} distrib-dirs + LOCAL_MTREE=${LOCAL_MTREE:Q} distrib-dirs .endif ${_+_}cd ${.CURDIR}; ${IMAKE} re${.TARGET:S/world$//}; \ ${IMAKEENV} rm -rf ${INSTALLTMP} @@ -888,7 +888,7 @@ reinstall: @echo ">>> Making hierarchy" @echo "--------------------------------------------------------------" ${_+_}cd ${.CURDIR}; ${MAKE} -f Makefile.inc1 \ - LOCAL_MTREE=${LOCAL_MTREE} hierarchy + LOCAL_MTREE=${LOCAL_MTREE:Q} hierarchy @echo @echo "--------------------------------------------------------------" @echo ">>> Installing everything" Modified: projects/random_number_generator/ObsoleteFiles.inc ============================================================================== --- projects/random_number_generator/ObsoleteFiles.inc Fri Aug 30 11:21:52 2013 (r255069) +++ projects/random_number_generator/ObsoleteFiles.inc Fri Aug 30 11:38:34 2013 (r255070) @@ -38,6 +38,9 @@ # xargs -n1 | sort | uniq -d; # done +# 20130829: bsdpatch is patch unconditionally +OLD_FILES+=usr/bin/bsdpatch +OLD_FILES+=usr/share/man/man1/bsdpatch.1.gz # 20130822: bind 9.9.3-P2 import OLD_LIBS+=usr/lib/liblwres.so.80 # 20130814: vm_page_busy(9) Modified: projects/random_number_generator/UPDATING ============================================================================== --- projects/random_number_generator/UPDATING Fri Aug 30 11:21:52 2013 (r255069) +++ projects/random_number_generator/UPDATING Fri Aug 30 11:38:34 2013 (r255070) @@ -31,6 +31,19 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 10 disable the most expensive debugging functionality run "ln -s 'abort:false,junk:false' /etc/malloc.conf".) +20130827: + Thomas Dickey (vendor author thereof) reports that dialog(1) since + 2011/10/18 has a bug in handling --hline. Testers and I noticed the + --hline is not ignored but displayed as a NULL string, regardless of + value. This will cause confusion in some bsdconfig dialogs where the + --hline is used to inform users which keybindings to use. This will + likewise affect any other persons relying on --hline. It also looks + rather strange seeing "[]" at the bottom of dialog(1) widgets when + passing --hline "anything". Thomas said he will have a look in a few + weeks. NOTE: The "[]" brackets appear with the left-edge where it + would normally appear given the width of text to display, but the + displayed text is not there (part of the bug). + 20130821: The PADLOCK_RNG and RDRAND_RNG kernel options are now devices. Thus "device padlock_rng" and "device rdrand_rng" should be Modified: projects/random_number_generator/bin/ps/keyword.c ============================================================================== --- projects/random_number_generator/bin/ps/keyword.c Fri Aug 30 11:21:52 2013 (r255069) +++ projects/random_number_generator/bin/ps/keyword.c Fri Aug 30 11:38:34 2013 (r255070) @@ -87,6 +87,7 @@ static VAR var[] = { {"etimes", "ELAPSED", NULL, USER, elapseds, 0, CHAR, NULL, 0}, {"euid", "", "uid", 0, NULL, 0, CHAR, NULL, 0}, {"f", "F", NULL, 0, kvar, KOFF(ki_flag), INT, "x", 0}, + {"fib", "FIB", NULL, 0, kvar, KOFF(ki_fibnum), INT, "d", 0}, {"flags", "", "f", 0, NULL, 0, CHAR, NULL, 0}, {"gid", "GID", NULL, 0, kvar, KOFF(ki_groups), UINT, UIDFMT, 0}, {"group", "GROUP", NULL, LJUST, egroupname, 0, CHAR, NULL, 0}, Modified: projects/random_number_generator/bin/ps/ps.1 ============================================================================== --- projects/random_number_generator/bin/ps/ps.1 Fri Aug 30 11:21:52 2013 (r255069) +++ projects/random_number_generator/bin/ps/ps.1 Fri Aug 30 11:38:34 2013 (r255070) @@ -512,6 +512,9 @@ elapsed running time, format minutes:seconds. .It Cm etimes elapsed running time, in decimal integer seconds +.It Cm fib +default FIB number, see +.Xr setfib 1 .It Cm flags the process flags, in hexadecimal (alias .Cm f ) Modified: projects/random_number_generator/bin/sh/parser.c ============================================================================== --- projects/random_number_generator/bin/sh/parser.c Fri Aug 30 11:21:52 2013 (r255069) +++ projects/random_number_generator/bin/sh/parser.c Fri Aug 30 11:38:34 2013 (r255070) @@ -96,7 +96,7 @@ static struct heredoc *heredoclist; /* l static int doprompt; /* if set, prompt the user */ static int needprompt; /* true if interactive and at start of line */ static int lasttoken; /* last token read */ -int tokpushback; /* last token pushed back */ +static int tokpushback; /* last token pushed back */ static char *wordtext; /* text of last word returned by readtoken */ static int checkkwd; static struct nodelist *backquotelist; Modified: projects/random_number_generator/bin/sh/parser.h ============================================================================== --- projects/random_number_generator/bin/sh/parser.h Fri Aug 30 11:21:52 2013 (r255069) +++ projects/random_number_generator/bin/sh/parser.h Fri Aug 30 11:38:34 2013 (r255070) @@ -68,11 +68,9 @@ /* * NEOF is returned by parsecmd when it encounters an end of file. It - * must be distinct from NULL, so we use the address of a variable that - * happens to be handy. + * must be distinct from NULL. */ -extern int tokpushback; -#define NEOF ((union node *)&tokpushback) +#define NEOF ((union node *)-1) extern int whichprompt; /* 1 == PS1, 2 == PS2 */ extern const char *const parsekwd[]; Modified: projects/random_number_generator/cddl/contrib/opensolaris/tools/ctf/cvt/dwarf.c ============================================================================== --- projects/random_number_generator/cddl/contrib/opensolaris/tools/ctf/cvt/dwarf.c Fri Aug 30 11:21:52 2013 (r255069) +++ projects/random_number_generator/cddl/contrib/opensolaris/tools/ctf/cvt/dwarf.c Fri Aug 30 11:38:34 2013 (r255070) @@ -23,8 +23,6 @@ * Use is subject to license terms. */ -#pragma ident "%Z%%M% %I% %E% SMI" - /* * DWARF to tdata conversion * @@ -1796,6 +1794,59 @@ die_resolve(dwarf_t *dw) } while (dw->dw_nunres != 0); } +/* + * Any object containing a function or object symbol at any scope should also + * contain DWARF data. + */ +static boolean_t +should_have_dwarf(Elf *elf) +{ + Elf_Scn *scn = NULL; + Elf_Data *data = NULL; + GElf_Shdr shdr; + GElf_Sym sym; + uint32_t symdx = 0; + size_t nsyms = 0; + boolean_t found = B_FALSE; + + while ((scn = elf_nextscn(elf, scn)) != NULL) { + gelf_getshdr(scn, &shdr); + + if (shdr.sh_type == SHT_SYMTAB) { + found = B_TRUE; + break; + } + } + + if (!found) + terminate("cannot convert stripped objects\n"); + + data = elf_getdata(scn, NULL); + nsyms = shdr.sh_size / shdr.sh_entsize; + + for (symdx = 0; symdx < nsyms; symdx++) { + gelf_getsym(data, symdx, &sym); + + if ((GELF_ST_TYPE(sym.st_info) == STT_FUNC) || + (GELF_ST_TYPE(sym.st_info) == STT_TLS) || + (GELF_ST_TYPE(sym.st_info) == STT_OBJECT)) { + char *name; + + name = elf_strptr(elf, shdr.sh_link, sym.st_name); + + /* Studio emits these local symbols regardless */ + if ((strcmp(name, "Bbss.bss") != 0) && + (strcmp(name, "Ttbss.bss") != 0) && + (strcmp(name, "Ddata.data") != 0) && + (strcmp(name, "Ttdata.data") != 0) && + (strcmp(name, "Drodata.rodata") != 0)) + return (B_TRUE); + } + } + + return (B_FALSE); +} + /*ARGSUSED*/ int dw_read(tdata_t *td, Elf *elf, char *filename __unused) @@ -1820,8 +1871,12 @@ dw_read(tdata_t *td, Elf *elf, char *fil if ((rc = dwarf_elf_init(elf, DW_DLC_READ, &dw.dw_dw, &dw.dw_err)) == DW_DLV_NO_ENTRY) { - errno = ENOENT; - return (-1); + if (should_have_dwarf(elf)) { + errno = ENOENT; + return (-1); + } else { + return (0); + } } else if (rc != DW_DLV_OK) { if (dwarf_errno(&dw.dw_err) == DW_DLE_DEBUG_INFO_NULL) { /* @@ -1839,9 +1894,14 @@ dw_read(tdata_t *td, Elf *elf, char *fil &addrsz, &nxthdr, &dw.dw_err)) != DW_DLV_OK) terminate("rc = %d %s\n", rc, dwarf_errmsg(&dw.dw_err)); - if ((cu = die_sibling(&dw, NULL)) == NULL) + if ((cu = die_sibling(&dw, NULL)) == NULL || + (((child = die_child(&dw, cu)) == NULL) && + should_have_dwarf(elf))) { terminate("file does not contain dwarf type data " "(try compiling with -g)\n"); + } else if (child == NULL) { + return (0); + } dw.dw_maxoff = nxthdr - 1; Modified: projects/random_number_generator/cddl/lib/libzpool/Makefile ============================================================================== --- projects/random_number_generator/cddl/lib/libzpool/Makefile Fri Aug 30 11:21:52 2013 (r255069) +++ projects/random_number_generator/cddl/lib/libzpool/Makefile Fri Aug 30 11:38:34 2013 (r255070) @@ -64,7 +64,9 @@ NO_PROFILE= CSTD= c99 -CFLAGS+= -DDEBUG=1 -#DEBUG_FLAGS+= -g +# Since there are many asserts in this library, it makes no sense to compile +# it without debugging. + +CFLAGS+= -g -DDEBUG=1 .include Modified: projects/random_number_generator/cddl/usr.bin/ztest/Makefile ============================================================================== --- projects/random_number_generator/cddl/usr.bin/ztest/Makefile Fri Aug 30 11:21:52 2013 (r255069) +++ projects/random_number_generator/cddl/usr.bin/ztest/Makefile Fri Aug 30 11:38:34 2013 (r255070) @@ -25,7 +25,8 @@ LDADD= -lgeom -lm -lnvpair -lumem -lzpoo CSTD= c99 -CFLAGS+= -DDEBUG=1 -#DEBUG_FLAGS+= -g +# Since there are many asserts in this program, it makes no sense to compile +# it without debugging. +CFLAGS+= -g -DDEBUG=1 .include Modified: projects/random_number_generator/cddl/usr.sbin/zdb/Makefile ============================================================================== --- projects/random_number_generator/cddl/usr.sbin/zdb/Makefile Fri Aug 30 11:21:52 2013 (r255069) +++ projects/random_number_generator/cddl/usr.sbin/zdb/Makefile Fri Aug 30 11:38:34 2013 (r255070) @@ -27,7 +27,8 @@ DPADD= ${LIBGEOM} ${LIBM} ${LIBNVPAIR} $ ${LIBUUTIL} ${LIBZFS_CORE} ${LIBZFS} ${LIBZPOOL} LDADD= -lgeom -lm -lnvpair -lpthread -lumem -luutil -lzfs_core -lzfs -lzpool -CFLAGS+= -DDEBUG=1 -#DEBUG_FLAGS+= -g +# Since there are many asserts in this program, it makes no sense to compile +# it without debugging. +CFLAGS+= -g -DDEBUG=1 .include Modified: projects/random_number_generator/contrib/libexecinfo/backtrace.3 ============================================================================== --- projects/random_number_generator/contrib/libexecinfo/backtrace.3 Fri Aug 30 11:21:52 2013 (r255069) +++ projects/random_number_generator/contrib/libexecinfo/backtrace.3 Fri Aug 30 11:38:34 2013 (r255070) @@ -1,4 +1,4 @@ -.\" $NetBSD: backtrace.3,v 1.4 2012/06/10 00:24:36 christos Exp $ +.\" $NetBSD: backtrace.3,v 1.5 2013/08/22 17:08:43 christos Exp $ .\" $FreeBSD$ .\" .\" Copyright (c) 2012 The NetBSD Foundation, Inc. @@ -152,10 +152,4 @@ The Linux versions of the functions (the instead of .Ft size_t arguments. -.It -The -.Fn backtrace_symbols -functions currently rely on -.Xr procfs 5 -to locate the executable. .El Modified: projects/random_number_generator/contrib/libexecinfo/backtrace.c ============================================================================== --- projects/random_number_generator/contrib/libexecinfo/backtrace.c Fri Aug 30 11:21:52 2013 (r255069) +++ projects/random_number_generator/contrib/libexecinfo/backtrace.c Fri Aug 30 11:38:34 2013 (r255070) @@ -1,4 +1,4 @@ -/* $NetBSD: backtrace.c,v 1.2 2012/07/09 03:11:59 christos Exp $ */ +/* $NetBSD: backtrace.c,v 1.3 2013/08/29 14:58:56 christos Exp $ */ /*- * Copyright (c) 2012 The NetBSD Foundation, Inc. @@ -29,7 +29,7 @@ * POSSIBILITY OF SUCH DAMAGE. */ #include -__RCSID("$NetBSD: backtrace.c,v 1.2 2012/07/09 03:11:59 christos Exp $"); +__RCSID("$NetBSD: backtrace.c,v 1.3 2013/08/29 14:58:56 christos Exp $"); #include #include @@ -51,9 +51,29 @@ __RCSID("$NetBSD: backtrace.c,v 1.2 2012 #ifdef __linux__ #define SELF "/proc/self/exe" #else +#include #define SELF "/proc/curproc/file" #endif +static int +open_self(int flags) +{ + const char *pathname = SELF; +#ifdef KERN_PROC_PATHNAME + static const int name[] = { + CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1, + }; + char path[MAXPATHLEN]; + size_t len; + + len = sizeof(path); + if (sysctl(name, 4, path, &len, NULL, 0) != -1) + pathname = path; +#endif + return open(pathname, flags); +} + + static int __printflike(4, 5) rasprintf(char **buf, size_t *bufsiz, size_t offs, const char *fmt, ...) { @@ -163,7 +183,7 @@ backtrace_symbols_fmt(void *const *trace symtab_t *st; int fd; - if ((fd = open(SELF, O_RDONLY)) != -1) + if ((fd = open_self(O_RDONLY)) != -1) st = symtab_create(fd, -1, STT_FUNC); else st = NULL; Modified: projects/random_number_generator/contrib/libexecinfo/symtab.c ============================================================================== --- projects/random_number_generator/contrib/libexecinfo/symtab.c Fri Aug 30 11:21:52 2013 (r255069) +++ projects/random_number_generator/contrib/libexecinfo/symtab.c Fri Aug 30 11:38:34 2013 (r255070) @@ -1,4 +1,4 @@ -/* $NetBSD: symtab.c,v 1.1 2012/05/26 22:02:29 christos Exp $ */ +/* $NetBSD: symtab.c,v 1.2 2013/08/29 15:01:57 christos Exp $ */ /*- * Copyright (c) 2012 The NetBSD Foundation, Inc. @@ -29,12 +29,12 @@ * POSSIBILITY OF SUCH DAMAGE. */ #include -__RCSID("$NetBSD: symtab.c,v 1.1 2012/05/26 22:02:29 christos Exp $"); +__RCSID("$NetBSD: symtab.c,v 1.2 2013/08/29 15:01:57 christos Exp $"); #include #include -#include #include +#include #include #include Modified: projects/random_number_generator/contrib/pam_modules/pam_passwdqc/pam_passwdqc.c ============================================================================== --- projects/random_number_generator/contrib/pam_modules/pam_passwdqc/pam_passwdqc.c Fri Aug 30 11:21:52 2013 (r255069) +++ projects/random_number_generator/contrib/pam_modules/pam_passwdqc/pam_passwdqc.c Fri Aug 30 11:38:34 2013 (r255070) @@ -2,9 +2,9 @@ * Copyright (c) 2000-2002 by Solar Designer. See LICENSE. */ -#define _XOPEN_SOURCE 500 +#define _XOPEN_SOURCE 600 #define _XOPEN_SOURCE_EXTENDED -#define _XOPEN_VERSION 500 +#define _XOPEN_VERSION 600 #include #include #include @@ -132,17 +132,19 @@ static params_t defaults = { static int converse(pam_handle_t *pamh, int style, lo_const char *text, struct pam_response **resp) { - struct pam_conv *conv; + pam_item_t item; + lo_const struct pam_conv *conv; struct pam_message msg, *pmsg; int status; - status = pam_get_item(pamh, PAM_CONV, (pam_item_t *)&conv); + status = pam_get_item(pamh, PAM_CONV, &item); if (status != PAM_SUCCESS) return status; + conv = item; pmsg = &msg; msg.msg_style = style; - msg.msg = text; + msg.msg = (char *)text; *resp = NULL; return conv->conv(1, (lo_const struct pam_message **)&pmsg, resp, @@ -294,8 +296,11 @@ static int parse(params_t *params, pam_h } if (argc) { - say(pamh, PAM_ERROR_MSG, getuid() != 0 ? - MESSAGE_MISCONFIGURED : MESSAGE_INVALID_OPTION, *argv); + if (getuid() != 0) { + say(pamh, PAM_ERROR_MSG, MESSAGE_MISCONFIGURED); + } else { + say(pamh, PAM_ERROR_MSG, MESSAGE_INVALID_OPTION, *argv); + } return PAM_ABORT; } @@ -311,7 +316,9 @@ PAM_EXTERN int pam_sm_chauthtok(pam_hand #ifdef HAVE_SHADOW struct spwd *spw; #endif - char *user, *oldpass, *newpass, *randompass; + pam_item_t item; + lo_const char *user, *oldpass, *curpass; + char *newpass, *randompass; const char *reason; int ask_oldauthtok; int randomonly, enforce, retries_left, retry_wanted; @@ -353,17 +360,19 @@ PAM_EXTERN int pam_sm_chauthtok(pam_hand if (flags & PAM_PRELIM_CHECK) return status; - status = pam_get_item(pamh, PAM_USER, (pam_item_t *)&user); + status = pam_get_item(pamh, PAM_USER, &item); if (status != PAM_SUCCESS) return status; + user = item; - status = pam_get_item(pamh, PAM_OLDAUTHTOK, (pam_item_t *)&oldpass); + status = pam_get_item(pamh, PAM_OLDAUTHTOK, &item); if (status != PAM_SUCCESS) return status; + oldpass = item; if (params.flags & F_NON_UNIX) { pw = &fake_pw; - pw->pw_name = user; + pw->pw_name = (char *)user; pw->pw_gecos = ""; } else { pw = getpwnam(user); @@ -405,13 +414,13 @@ PAM_EXTERN int pam_sm_chauthtok(pam_hand enforce = params.flags & F_ENFORCE_ROOT; if (params.flags & F_USE_AUTHTOK) { - status = pam_get_item(pamh, PAM_AUTHTOK, - (pam_item_t *)&newpass); + status = pam_get_item(pamh, PAM_AUTHTOK, &item); if (status != PAM_SUCCESS) return status; - if (!newpass || (check_max(¶ms, pamh, newpass) && enforce)) + curpass = item; + if (!curpass || (check_max(¶ms, pamh, curpass) && enforce)) return PAM_AUTHTOK_ERR; - reason = _passwdqc_check(¶ms.qc, newpass, oldpass, pw); + reason = _passwdqc_check(¶ms.qc, curpass, oldpass, pw); if (reason) { say(pamh, PAM_ERROR_MSG, MESSAGE_WEAKPASS, reason); if (enforce) @@ -487,7 +496,7 @@ retry: if (!newpass) { if (randompass) _pam_overwrite(randompass); - return PAM_AUTHTOK_ERR; + return status; } if (check_max(¶ms, pamh, newpass) && enforce) { Modified: projects/random_number_generator/etc/defaults/periodic.conf ============================================================================== --- projects/random_number_generator/etc/defaults/periodic.conf Fri Aug 30 11:21:52 2013 (r255069) +++ projects/random_number_generator/etc/defaults/periodic.conf Fri Aug 30 11:38:34 2013 (r255070) @@ -128,7 +128,9 @@ daily_status_include_submit_mailq="YES" # 450.status-security daily_status_security_enable="YES" # Security check -# See "Security options" below for more options +# See also "Security options" below for more options +daily_status_security_inline="NO" # Run inline ? +daily_status_security_output="root" # user or /file # 460.status-mail-rejects daily_status_mail_rejects_enable="YES" # Check mail rejects @@ -163,59 +165,78 @@ daily_local="/etc/daily.local" # Loca # Security options # These options are used by the security periodic(8) scripts spawned in -# 450.status-security above. -daily_status_security_inline="NO" # Run inline ? -daily_status_security_output="root" # user or /file -daily_status_security_logdir="/var/log" # Directory for logs -daily_status_security_diff_flags="-b -u" # flags for diff output +# daily and weekly 450.status-security. +security_status_logdir="/var/log" # Directory for logs +security_status_diff_flags="-b -u" # flags for diff output + +# Each of the security_status_*_enable options below can have one of the +# following values: +# - NO +# - daily: only run during the daily security status +# - weekly: only run during the weekly security status # 100.chksetuid -daily_status_security_chksetuid_enable="YES" +security_status_chksetuid_enable="YES" +security_status_chksetuid_period="daily" # 110.neggrpperm -daily_status_security_neggrpperm_enable="YES" +security_status_neggrpperm_enable="YES" +security_status_neggrpperm_period="daily" # 200.chkmounts -daily_status_security_chkmounts_enable="YES" -#daily_status_security_chkmounts_ignore="^amd:" # Don't check matching +security_status_chkmounts_enable="YES" +security_status_chkmounts_period="daily" +#security_status_chkmounts_ignore="^amd:" # Don't check matching # FS types -daily_status_security_noamd="NO" # Don't check amd mounts +security_status_noamd="NO" # Don't check amd mounts # 300.chkuid0 -daily_status_security_chkuid0_enable="YES" +security_status_chkuid0_enable="YES" +security_status_chkuid0_period="daily" # 400.passwdless -daily_status_security_passwdless_enable="YES" +security_status_passwdless_enable="YES" +security_status_passwdless_period="daily" # 410.logincheck -daily_status_security_logincheck_enable="YES" +security_status_logincheck_enable="YES" +security_status_logincheck_period="daily" # 460.chkportsum -daily_status_security_chkportsum_enable="NO" # Check ports w/ wrong checksum +security_status_chkportsum_enable="NO" # Check ports w/ wrong checksum +security_status_chkportsum_period="daily" # 500.ipfwdenied -daily_status_security_ipfwdenied_enable="YES" +security_status_ipfwdenied_enable="YES" +security_status_ipfwdenied_period="daily" # 510.ipfdenied -daily_status_security_ipfdenied_enable="YES" +security_status_ipfdenied_enable="YES" +security_status_ipfdenied_period="daily" # 520.pfdenied -daily_status_security_pfdenied_enable="YES" +security_status_pfdenied_enable="YES" +security_status_pfdenied_period="daily" # 550.ipfwlimit -daily_status_security_ipfwlimit_enable="YES" +security_status_ipfwlimit_enable="YES" +security_status_ipfwlimit_period="daily" # 610.ipf6denied -daily_status_security_ipf6denied_enable="YES" +security_status_ipf6denied_enable="YES" +security_status_ipf6denied_period="daily" # 700.kernelmsg -daily_status_security_kernelmsg_enable="YES" +security_status_kernelmsg_enable="YES" +security_status_kernelmsg_period="daily" # 800.loginfail -daily_status_security_loginfail_enable="YES" +security_status_loginfail_enable="YES" +security_status_loginfail_period="daily" # 900.tcpwrap -daily_status_security_tcpwrap_enable="YES" +security_status_tcpwrap_enable="YES" +security_status_tcpwrap_period="daily" # Weekly options @@ -248,6 +269,12 @@ weekly_status_pkg_enable="NO" # Find pkg_version=pkg_version # Use this program pkg_version_index=/usr/ports/INDEX-10 # Use this index file +# 450.status-security +weekly_status_security_enable="YES" # Security check +# See also "Security options" above for more options +weekly_status_security_inline="NO" # Run inline ? +weekly_status_security_output="root" # user or /file + # 999.local weekly_local="/etc/weekly.local" # Local scripts @@ -267,6 +294,12 @@ monthly_show_badconfig="NO" # scripts # 200.accounting monthly_accounting_enable="YES" # Login accounting +# 450.status-security +monthly_status_security_enable="YES" # Security check +# See also "Security options" above for more options +monthly_status_security_inline="NO" # Run inline ? +monthly_status_security_output="root" # user or /file + # 999.local monthly_local="/etc/monthly.local" # Local scripts @@ -276,6 +309,74 @@ monthly_local="/etc/monthly.local" # L if [ -z "${source_periodic_confs_defined}" ]; then source_periodic_confs_defined=yes + + # Compatibility with old daily variable names. + # They can be removed in stable/11. + security_daily_compat_var() { + local var=$1 dailyvar value + + dailyvar=daily_status_security${#status_security} + periodvar=${var%enable}period + eval value=\"\$$dailyvar\" + [ -z "$value" ] && return + echo "Warning: Variable \$$dailyvar is deprecated," \ + "use \$$var instead." >&2 + case "$value" in + [Yy][Ee][Ss]) + $var=YES + $periodvar=daily + ;; + *) + $var="$value" + ;; + esac + } + + check_yesno_period() { + local var="$1" periodvar value period + + eval value=\"\$$var\" + case "$value" in + [Yy][Ee][Ss]) ;; + *) return 1 ;; + esac + + periodvar=${var%enable}period + eval period=\"\$$periodvar\" + case "$PERIODIC" in + "security daily") + case "$period" in + [Dd][Aa][Ii][Ll][Yy]) return 0 ;; + *) return 1 ;; + esac + ;; + "security weekly") + case "$period" in + [Ww][Ee][Ee][Kk][Ll][Yy]) return 0 ;; + *) return 1 ;; + esac + ;; + "security monthly") + case "$period" in + [Mm][Oo][Nn][Tt][Hh][Ll][Yy]) return 0 ;; + *) return 1 ;; + esac + ;; + security) + # Run directly from crontab(5). + case "$period" in + [Nn][Oo]) return 1 ;; + *) return 0 ;; + esac + ;; + *) + echo "ASSERTION FAILED: Unexpected value for " \ + "\$PERIODIC: '$PERIODIC'" >&2 + exit 127 + ;; + esac + } + source_periodic_confs() { local i sourced_files Modified: projects/random_number_generator/etc/mtree/BSD.usr.dist ============================================================================== --- projects/random_number_generator/etc/mtree/BSD.usr.dist Fri Aug 30 11:21:52 2013 (r255069) +++ projects/random_number_generator/etc/mtree/BSD.usr.dist Fri Aug 30 11:38:34 2013 (r255070) @@ -42,6 +42,62 @@ .. .. libexec + bsdconfig + 020.docsinstall + include + .. + .. + 030.packages + include + .. + .. + 040.password + include + .. + .. + 050.diskmgmt + include + .. + .. + 070.usermgmt + include + .. + .. + 080.console + include + .. + .. + 090.timezone + include + .. + .. + 110.mouse + include + .. + .. + 120.networking + include + .. + .. + 130.security + include + .. + .. + 140.startup + include + .. + .. + 150.ttys + include + .. + .. + dot + include + .. + .. + include + .. + .. bsdinstall .. lpr @@ -62,7 +118,25 @@ share atf .. + bsdconfig + media + .. + networking + .. + packages + .. + password + .. + startup + .. + timezone + .. + usermgmt + .. + .. calendar + de_AT.ISO_8859-15 + .. de_DE.ISO8859-1 .. fr_FR.ISO8859-1 @@ -71,8 +145,14 @@ .. hu_HU.ISO8859-2 .. + pt_BR.ISO8859-1 + .. + pt_BR.UTF-8 + .. ru_RU.KOI8-R .. + ru_RU.UTF-8 + .. uk_UA.KOI8-U .. .. @@ -221,6 +301,8 @@ .. bootforth .. + bsdconfig + .. csh .. cvsup Copied: projects/random_number_generator/etc/periodic/monthly/450.status-security (from r255069, head/etc/periodic/monthly/450.status-security) ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/random_number_generator/etc/periodic/monthly/450.status-security Fri Aug 30 11:38:34 2013 (r255070, copy of r255069, head/etc/periodic/monthly/450.status-security) @@ -0,0 +1,41 @@ +#!/bin/sh +# +# $FreeBSD$ +# + +# If there is a global system configuration file, suck it in. +# +if [ -r /etc/defaults/periodic.conf ] +then + . /etc/defaults/periodic.conf + source_periodic_confs +fi + +case "$monthly_status_security_enable" in + [Yy][Ee][Ss]) + echo "" + echo "Security check:" + + case "$monthly_status_security_inline" in + [Yy][Ee][Ss]) + monthly_status_security_output="";; + esac + + export security_output="${monthly_status_security_output}" + case "${monthly_status_security_output}" in + "") + rc=3;; + /*) + echo " (output logged separately)" + rc=0;; + *) + echo " (output mailed separately)" + rc=0;; + esac + + periodic security || rc=3;; + + *) rc=0;; +esac + +exit $rc Modified: projects/random_number_generator/etc/periodic/monthly/Makefile ============================================================================== --- projects/random_number_generator/etc/periodic/monthly/Makefile Fri Aug 30 11:21:52 2013 (r255069) +++ projects/random_number_generator/etc/periodic/monthly/Makefile Fri Aug 30 11:38:34 2013 (r255070) @@ -2,7 +2,8 @@ .include -FILES= 999.local +FILES= 450.status-security \ + 999.local # NB: keep these sorted by MK_* knobs Modified: projects/random_number_generator/etc/periodic/security/100.chksetuid ============================================================================== --- projects/random_number_generator/etc/periodic/security/100.chksetuid Fri Aug 30 11:21:52 2013 (r255069) +++ projects/random_number_generator/etc/periodic/security/100.chksetuid Fri Aug 30 11:38:34 2013 (r255070) @@ -37,10 +37,12 @@ fi . /etc/periodic/security/security.functions +security_daily_compat_var security_status_chksetuid_enable + rc=0 -case "$daily_status_security_chksetuid_enable" in - [Yy][Ee][Ss]) +if check_yesno_period security_status_chksetuid_enable +then echo "" echo 'Checking setuid files and devices:' MP=`mount -t ufs,zfs | awk '$0 !~ /no(suid|exec)/ { print $3 }'` @@ -49,10 +51,6 @@ case "$daily_status_security_chksetuid_e \( -perm -u+s -or -perm -g+s \) -exec ls -liTd \{\} \+ | check_diff setuid - "${host} setuid diffs:" rc=$? - ;; - *) - rc=0 - ;; -esac +fi exit $rc Modified: projects/random_number_generator/etc/periodic/security/110.neggrpperm ============================================================================== --- projects/random_number_generator/etc/periodic/security/110.neggrpperm Fri Aug 30 11:21:52 2013 (r255069) +++ projects/random_number_generator/etc/periodic/security/110.neggrpperm Fri Aug 30 11:38:34 2013 (r255070) @@ -35,10 +35,12 @@ then source_periodic_confs fi +security_daily_compat_var security_status_neggrpperm_enable + rc=0 -case "$daily_status_security_neggrpperm_enable" in - [Yy][Ee][Ss]) +if check_yesno_period security_status_neggrpperm_enable +then echo "" echo 'Checking negative group permissions:' MP=`mount -t ufs,zfs | awk '$0 !~ /no(suid|exec)/ { print $3 }'` @@ -48,7 +50,6 @@ case "$daily_status_security_neggrpperm_ \( ! -perm +040 -and -perm +004 \) \) \ -exec ls -liTd \{\} \+ | tee /dev/stderr | wc -l) [ $n -gt 0 ] && rc=1 || rc=0 - ;; -esac +fi exit $rc Modified: projects/random_number_generator/etc/periodic/security/200.chkmounts ============================================================================== --- projects/random_number_generator/etc/periodic/security/200.chkmounts Fri Aug 30 11:21:52 2013 (r255069) +++ projects/random_number_generator/etc/periodic/security/200.chkmounts Fri Aug 30 11:38:34 2013 (r255070) @@ -40,12 +40,16 @@ fi . /etc/periodic/security/security.functions -ignore="${daily_status_security_chkmounts_ignore}" +security_daily_compat_var security_status_chkmounts_enable +security_daily_compat_var security_status_chkmounts_ignore +security_daily_compat_var security_status_noamd + +ignore="${security_status_chkmounts_ignore}" rc=0 -case "$daily_status_security_chkmounts_enable" in - [Yy][Ee][Ss]) - case "$daily_status_security_noamd" in +if check_yesno_period security_status_chkmounts_enable +then + case "$security_status_noamd" in [Yy][Ee][Ss]) ignore="${ignore}|^amd:" esac @@ -55,8 +59,7 @@ case "$daily_status_security_chkmounts_e fi mount -p | sort | ${cmd} | check_diff mount - "${host} changes in mounted filesystems:" - rc=$?;; - *) rc=0;; -esac + rc=$? +fi exit "$rc" Modified: projects/random_number_generator/etc/periodic/security/300.chkuid0 ============================================================================== --- projects/random_number_generator/etc/periodic/security/300.chkuid0 Fri Aug 30 11:21:52 2013 (r255069) +++ projects/random_number_generator/etc/periodic/security/300.chkuid0 Fri Aug 30 11:38:34 2013 (r255070) @@ -36,16 +36,19 @@ then source_periodic_confs fi -case "$daily_status_security_chkuid0_enable" in - [Yy][Ee][Ss]) +security_daily_compat_var security_status_chkuid0_enable + +rc=0 + +if check_yesno_period security_status_chkuid0_enable +then echo "" echo 'Checking for uids of 0:' n=$(awk -F: '/^#/ {next} $3==0 {print $1,$3}' /etc/master.passwd | tee /dev/stderr | sed -e '/^root 0$/d' -e '/^toor 0$/d' | wc -l) - [ $n -gt 0 ] && rc=1 || rc=0;; - *) rc=0;; -esac + [ $n -gt 0 ] && rc=1 || rc=0 +fi exit "$rc" Modified: projects/random_number_generator/etc/periodic/security/400.passwdless ============================================================================== --- projects/random_number_generator/etc/periodic/security/400.passwdless Fri Aug 30 11:21:52 2013 (r255069) +++ projects/random_number_generator/etc/periodic/security/400.passwdless Fri Aug 30 11:38:34 2013 (r255070) @@ -35,14 +35,17 @@ then source_periodic_confs fi -case "$daily_status_security_passwdless_enable" in - [Yy][Ee][Ss]) +security_daily_compat_var security_status_passwdless_enable + +rc=0 + +if check_yesno_period security_status_passwdless_enable +then echo "" echo 'Checking for passwordless accounts:' n=$(awk -F: 'NF > 1 && $1 !~ /^[#+-]/ && $2=="" {print $0}' /etc/master.passwd | tee /dev/stderr | wc -l) - [ $n -gt 0 ] && rc=1 || rc=0;; - *) rc=0;; -esac + [ $n -gt 0 ] && rc=1 || rc=0 +fi exit "$rc" Modified: projects/random_number_generator/etc/periodic/security/410.logincheck ============================================================================== --- projects/random_number_generator/etc/periodic/security/410.logincheck Fri Aug 30 11:21:52 2013 (r255069) +++ projects/random_number_generator/etc/periodic/security/410.logincheck Fri Aug 30 11:38:34 2013 (r255070) @@ -35,8 +35,12 @@ then source_periodic_confs fi -case "$daily_status_security_logincheck_enable" in - [Yy][Ee][Ss]) +security_daily_compat_var security_status_logincheck_enable *** DIFF OUTPUT TRUNCATED AT 1000 LINES *** From owner-svn-src-projects@FreeBSD.ORG Fri Aug 30 11:42:58 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id DE0AD74F; Fri, 30 Aug 2013 11:42:58 +0000 (UTC) (envelope-from markm@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id C95962D42; Fri, 30 Aug 2013 11:42:58 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id r7UBgwCg089244; Fri, 30 Aug 2013 11:42:58 GMT (envelope-from markm@svn.freebsd.org) Received: (from markm@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id r7UBgww0089239; Fri, 30 Aug 2013 11:42:58 GMT (envelope-from markm@svn.freebsd.org) Message-Id: <201308301142.r7UBgww0089239@svn.freebsd.org> From: Mark Murray Date: Fri, 30 Aug 2013 11:42:58 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r255071 - in projects/random_number_generator/sys: conf dev/random X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 30 Aug 2013 11:42:58 -0000 Author: markm Date: Fri Aug 30 11:42:57 2013 New Revision: 255071 URL: http://svnweb.freebsd.org/changeset/base/255071 Log: Separate out the Software RNG entropy harvesting queue and thread into its own files. Submitted by: Arthur Mesh Added: projects/random_number_generator/sys/dev/random/random_harvestq.c (contents, props changed) projects/random_number_generator/sys/dev/random/random_harvestq.h (contents, props changed) Modified: projects/random_number_generator/sys/conf/files projects/random_number_generator/sys/dev/random/randomdev_soft.c Modified: projects/random_number_generator/sys/conf/files ============================================================================== --- projects/random_number_generator/sys/conf/files Fri Aug 30 11:38:34 2013 (r255070) +++ projects/random_number_generator/sys/conf/files Fri Aug 30 11:42:57 2013 (r255071) @@ -2032,8 +2032,9 @@ rt2860.fw optional rt2860fw | ralfw \ clean "rt2860.fw" dev/random/harvest.c standard dev/random/hash.c optional random -dev/random/random_adaptors.c standard dev/random/pseudo_rng.c standard +dev/random/random_adaptors.c standard +dev/random/random_harvestq.c standard dev/random/randomdev.c optional random dev/random/randomdev_soft.c optional random dev/random/yarrow.c optional random Added: projects/random_number_generator/sys/dev/random/random_harvestq.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/random_number_generator/sys/dev/random/random_harvestq.c Fri Aug 30 11:42:57 2013 (r255071) @@ -0,0 +1,251 @@ +/*- + * Copyright (c) 2013 Arthur Mesh + * Copyright (c) 2000-2009 Mark R V Murray + * Copyright (c) 2004 Robert N. M. Watson + * 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 + * in this position and unchanged. + * 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 ``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 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$ + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "random_harvestq.h" + +#define RANDOM_FIFO_MAX 256 /* How many events to queue up */ + +MALLOC_DEFINE(M_ENTROPY, "entropy", "Entropy harvesting buffers"); + +/* + * The harvest mutex protects the consistency of the entropy fifos and + * empty fifo. + */ +struct mtx harvest_mtx; + +/* Lockable FIFO queue holding entropy buffers */ +struct entropyfifo { + int count; + STAILQ_HEAD(harvestlist, harvest) head; +}; + +/* Empty entropy buffers */ +static struct entropyfifo emptyfifo; + +#define EMPTYBUFFERS 1024 + +/* Harvested entropy */ +static struct entropyfifo harvestfifo[ENTROPYSOURCE]; + +/* <0 to end the kthread, 0 to let it run, 1 to flush the harvest queues */ +int random_kthread_control = 0; + +static struct proc *random_kthread_proc; + +static void +random_kthread(void *arg) +{ + STAILQ_HEAD(, harvest) local_queue; + struct harvest *event = NULL; + int local_count; + enum esource source; + event_proc_f func = arg; + + STAILQ_INIT(&local_queue); + local_count = 0; + + /* Process until told to stop */ + mtx_lock_spin(&harvest_mtx); + for (; random_kthread_control >= 0;) { + + /* Cycle through all the entropy sources */ + for (source = RANDOM_START; source < ENTROPYSOURCE; source++) { + /* + * Drain entropy source records into a thread-local + * queue for processing while not holding the mutex. + */ + STAILQ_CONCAT(&local_queue, &harvestfifo[source].head); + local_count += harvestfifo[source].count; + harvestfifo[source].count = 0; + } + + /* + * Deal with events, if any, dropping the mutex as we process + * each event. Then push the events back into the empty + * fifo. + */ + if (!STAILQ_EMPTY(&local_queue)) { + mtx_unlock_spin(&harvest_mtx); + STAILQ_FOREACH(event, &local_queue, next) + func(event); + mtx_lock_spin(&harvest_mtx); + STAILQ_CONCAT(&emptyfifo.head, &local_queue); + emptyfifo.count += local_count; + local_count = 0; + } + + KASSERT(local_count == 0, ("random_kthread: local_count %d", + local_count)); + + /* + * If a queue flush was commanded, it has now happened, + * and we can mark this by resetting the command. + */ + if (random_kthread_control == 1) + random_kthread_control = 0; + + /* Work done, so don't belabour the issue */ + msleep_spin_sbt(&random_kthread_control, &harvest_mtx, + "-", SBT_1S / 10, 0, C_PREL(1)); + + } + mtx_unlock_spin(&harvest_mtx); + + random_set_wakeup_exit(&random_kthread_control); + /* NOTREACHED */ +} + +void +random_harvestq_init(event_proc_f cb) +{ + int error, i; + struct harvest *np; + enum esource e; + + /* Initialise the harvest fifos */ + STAILQ_INIT(&emptyfifo.head); + emptyfifo.count = 0; + for (i = 0; i < EMPTYBUFFERS; i++) { + np = malloc(sizeof(struct harvest), M_ENTROPY, M_WAITOK); + STAILQ_INSERT_TAIL(&emptyfifo.head, np, next); + } + for (e = RANDOM_START; e < ENTROPYSOURCE; e++) { + STAILQ_INIT(&harvestfifo[e].head); + harvestfifo[e].count = 0; + } + + mtx_init(&harvest_mtx, "entropy harvest mutex", NULL, MTX_SPIN); + + + /* Start the hash/reseed thread */ + error = kproc_create(random_kthread, cb, + &random_kthread_proc, RFHIGHPID, 0, "rand_harvestq"); /* RANDOM_CSPRNG_NAME */ + + if (error != 0) + panic("Cannot create entropy maintenance thread."); +} + +void +random_harvestq_deinit(void) +{ + struct harvest *np; + enum esource e; + + /* Destroy the harvest fifos */ + while (!STAILQ_EMPTY(&emptyfifo.head)) { + np = STAILQ_FIRST(&emptyfifo.head); + STAILQ_REMOVE_HEAD(&emptyfifo.head, next); + free(np, M_ENTROPY); + } + for (e = RANDOM_START; e < ENTROPYSOURCE; e++) { + while (!STAILQ_EMPTY(&harvestfifo[e].head)) { + np = STAILQ_FIRST(&harvestfifo[e].head); + STAILQ_REMOVE_HEAD(&harvestfifo[e].head, next); + free(np, M_ENTROPY); + } + } + + mtx_destroy(&harvest_mtx); +} + +/* + * Entropy harvesting routine. This is supposed to be fast; do + * not do anything slow in here! + */ +void +random_harvestq_internal(u_int64_t somecounter, const void *entropy, + u_int count, u_int bits, u_int frac, enum esource origin) +{ + struct harvest *event; + + KASSERT(origin >= RANDOM_START && origin <= RANDOM_PURE, + ("random_harvest_internal: origin %d invalid\n", origin)); + + /* Lockless read to avoid lock operations if fifo is full. */ + if (harvestfifo[origin].count >= RANDOM_FIFO_MAX) + return; + + mtx_lock_spin(&harvest_mtx); + + /* + * Don't make the harvest queues too big - help to prevent low-grade + * entropy swamping + */ + if (harvestfifo[origin].count < RANDOM_FIFO_MAX) { + event = STAILQ_FIRST(&emptyfifo.head); + if (event != NULL) { + /* Add the harvested data to the fifo */ + STAILQ_REMOVE_HEAD(&emptyfifo.head, next); + harvestfifo[origin].count++; + event->somecounter = somecounter; + event->size = count; + event->bits = bits; + event->frac = frac; + event->source = origin; + + /* XXXX Come back and make this dynamic! */ + count = MIN(count, HARVESTSIZE); + memcpy(event->entropy, entropy, count); + +#if 0 + { + int i; + printf("Harvest:%16jX ", event->somecounter); + for (i = 0; i < event->size; i++) + printf("%02X", event->entropy[i]); + for (; i < 16; i++) + printf(" "); + printf(" %2d 0x%2X.%03X %02X\n", event->size, event->bits, event->frac, event->source); + } +#endif + + STAILQ_INSERT_TAIL(&harvestfifo[origin].head, + event, next); + } + } + mtx_unlock_spin(&harvest_mtx); +} + Added: projects/random_number_generator/sys/dev/random/random_harvestq.h ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/random_number_generator/sys/dev/random/random_harvestq.h Fri Aug 30 11:42:57 2013 (r255071) @@ -0,0 +1,41 @@ +/*- + * Copyright (c) 2013 Arthur Mesh + * 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 + * in this position and unchanged. + * 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 ``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 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$ + */ + +#ifndef __RANDOM_HARVEST_H__ +#define __RANDOM_HARVEST_H__ + +typedef void (*event_proc_f)(struct harvest *event); + +void random_harvestq_init(event_proc_f); +void random_harvestq_deinit(void); +void random_harvestq_internal(u_int64_t, const void *, + u_int, u_int, u_int, enum esource); + +extern int random_kthread_control; + +#endif /* __RANDOM_HARVEST_H__ */ Modified: projects/random_number_generator/sys/dev/random/randomdev_soft.c ============================================================================== --- projects/random_number_generator/sys/dev/random/randomdev_soft.c Fri Aug 30 11:38:34 2013 (r255070) +++ projects/random_number_generator/sys/dev/random/randomdev_soft.c Fri Aug 30 11:42:57 2013 (r255071) @@ -37,17 +37,13 @@ __FBSDID("$FreeBSD$"); #include #include -#include -#include #include #include -#include #include #include #include #include #include -#include #include #include #include @@ -67,11 +63,8 @@ __FBSDID("$FreeBSD$"); #include #endif -#define RANDOM_FIFO_MAX 256 /* How many events to queue up */ +#include "random_harvestq.h" -static void random_kthread(void *); -static void random_harvest_internal(u_int64_t, const void *, u_int, - u_int, u_int, enum esource); static int randomdev_poll(int event, struct thread *td); static int randomdev_block(int flag); static void randomdev_flush_reseed(void); @@ -109,33 +102,6 @@ static struct random_adaptor random_cont #endif -MALLOC_DEFINE(M_ENTROPY, "entropy", "Entropy harvesting buffers for " RANDOM_CSPRNG_NAME); - -/* - * The harvest mutex protects the consistency of the entropy fifos and - * empty fifo. - */ -struct mtx harvest_mtx; - -/* Lockable FIFO queue holding entropy buffers */ -struct entropyfifo { - int count; - STAILQ_HEAD(harvestlist, harvest) head; -}; - -/* Empty entropy buffers */ -static struct entropyfifo emptyfifo; - -#define EMPTYBUFFERS 1024 - -/* Harvested entropy */ -static struct entropyfifo harvestfifo[ENTROPYSOURCE]; - -/* <0 to end the kthread, 0 to let it run, 1 to flush the harvest queues */ -static int random_kthread_control = 0; - -static struct proc *random_kthread_proc; - /* List for the dynamic sysctls */ static struct sysctl_ctx_list random_clist; @@ -151,10 +117,7 @@ random_check_boolean(SYSCTL_HANDLER_ARGS void randomdev_init(void) { - int error, i; - struct harvest *np; struct sysctl_oid *random_sys_o, *random_sys_harvest_o; - enum esource e; #if defined(YARROW_RNG) random_yarrow_init_alg(&random_clist); @@ -200,37 +163,16 @@ randomdev_init(void) &harvest.swi, 0, random_check_boolean, "I", "Harvest SWI entropy"); - /* Initialise the harvest fifos */ - STAILQ_INIT(&emptyfifo.head); - emptyfifo.count = 0; - for (i = 0; i < EMPTYBUFFERS; i++) { - np = malloc(sizeof(struct harvest), M_ENTROPY, M_WAITOK); - STAILQ_INSERT_TAIL(&emptyfifo.head, np, next); - } - for (e = RANDOM_START; e < ENTROPYSOURCE; e++) { - STAILQ_INIT(&harvestfifo[e].head); - harvestfifo[e].count = 0; - } - - mtx_init(&harvest_mtx, "entropy harvest mutex", NULL, MTX_SPIN); - - /* Start the hash/reseed thread */ - error = kproc_create(random_kthread, NULL, - &random_kthread_proc, RFHIGHPID, 0, RANDOM_CSPRNG_NAME); - if (error != 0) - panic("Cannot create entropy maintenance thread."); + random_harvestq_init(random_process_event); /* Register the randomness harvesting routine */ - randomdev_init_harvester(random_harvest_internal, + randomdev_init_harvester(random_harvestq_internal, random_context.read); } void randomdev_deinit(void) { - struct harvest *np; - enum esource e; - /* Deregister the randomness harvesting routine */ randomdev_deinit_harvester(); @@ -240,20 +182,6 @@ randomdev_deinit(void) random_kthread_control = -1; tsleep((void *)&random_kthread_control, 0, "term", 0); - /* Destroy the harvest fifos */ - while (!STAILQ_EMPTY(&emptyfifo.head)) { - np = STAILQ_FIRST(&emptyfifo.head); - STAILQ_REMOVE_HEAD(&emptyfifo.head, next); - free(np, M_ENTROPY); - } - for (e = RANDOM_START; e < ENTROPYSOURCE; e++) { - while (!STAILQ_EMPTY(&harvestfifo[e].head)) { - np = STAILQ_FIRST(&harvestfifo[e].head); - STAILQ_REMOVE_HEAD(&harvestfifo[e].head, next); - free(np, M_ENTROPY); - } - } - #if defined(YARROW_RNG) random_yarrow_deinit_alg(); #endif @@ -261,130 +189,9 @@ randomdev_deinit(void) random_fortuna_deinit_alg(); #endif - mtx_destroy(&harvest_mtx); - sysctl_ctx_free(&random_clist); } -/* ARGSUSED */ -static void -random_kthread(void *arg __unused) -{ - STAILQ_HEAD(, harvest) local_queue; - struct harvest *event = NULL; - int local_count; - enum esource source; - - STAILQ_INIT(&local_queue); - local_count = 0; - - /* Process until told to stop */ - mtx_lock_spin(&harvest_mtx); - for (; random_kthread_control >= 0;) { - - /* Cycle through all the entropy sources */ - for (source = RANDOM_START; source < ENTROPYSOURCE; source++) { - /* - * Drain entropy source records into a thread-local - * queue for processing while not holding the mutex. - */ - STAILQ_CONCAT(&local_queue, &harvestfifo[source].head); - local_count += harvestfifo[source].count; - harvestfifo[source].count = 0; - } - - /* - * Deal with events, if any, dropping the mutex as we process - * each event. Then push the events back into the empty - * fifo. - */ - if (!STAILQ_EMPTY(&local_queue)) { - mtx_unlock_spin(&harvest_mtx); - STAILQ_FOREACH(event, &local_queue, next) - random_process_event(event); - mtx_lock_spin(&harvest_mtx); - STAILQ_CONCAT(&emptyfifo.head, &local_queue); - emptyfifo.count += local_count; - local_count = 0; - } - - KASSERT(local_count == 0, ("random_kthread: local_count %d", - local_count)); - - /* - * If a queue flush was commanded, it has now happened, - * and we can mark this by resetting the command. - */ - if (random_kthread_control == 1) - random_kthread_control = 0; - - /* Work done, so don't belabour the issue */ - msleep_spin_sbt(&random_kthread_control, &harvest_mtx, - "-", SBT_1S / 10, 0, C_PREL(1)); - - } - mtx_unlock_spin(&harvest_mtx); - - random_set_wakeup_exit(&random_kthread_control); - /* NOTREACHED */ -} - -/* Entropy harvesting routine. This is supposed to be fast; do - * not do anything slow in here! - */ -static void -random_harvest_internal(u_int64_t somecounter, const void *entropy, - u_int count, u_int bits, u_int frac, enum esource origin) -{ - struct harvest *event; - - KASSERT(origin >= RANDOM_START && origin <= RANDOM_PURE, - ("random_harvest_internal: origin %d invalid\n", origin)); - - /* Lockless read to avoid lock operations if fifo is full. */ - if (harvestfifo[origin].count >= RANDOM_FIFO_MAX) - return; - - mtx_lock_spin(&harvest_mtx); - - /* - * Don't make the harvest queues too big - help to thwart low-grade - * entropy swamping - */ - if (harvestfifo[origin].count < RANDOM_FIFO_MAX) { - event = STAILQ_FIRST(&emptyfifo.head); - if (event != NULL) { - count = MIN(count, HARVESTSIZE); - /* Add the harvested data to the fifo */ - STAILQ_REMOVE_HEAD(&emptyfifo.head, next); - harvestfifo[origin].count++; - event->somecounter = somecounter; - event->size = count; - event->bits = bits; - event->frac = frac; - event->source = origin; - - memcpy(event->entropy, entropy, count); - -#if 1 - { - int i; - printf("Harvest:%16jX ", event->somecounter); - for (i = 0; i < event->size; i++) - printf("%02X", event->entropy[i]); - for (; i < 16; i++) - printf(" "); - printf(" %2d 0x%2X.%03X %02X\n", event->size, event->bits, event->frac, event->source); - } -#endif - - STAILQ_INSERT_TAIL(&harvestfifo[origin].head, - event, next); - } - } - mtx_unlock_spin(&harvest_mtx); -} - void randomdev_write(void *buf, int count) { @@ -399,7 +206,7 @@ randomdev_write(void *buf, int count) chunk = HARVESTSIZE; if (i + chunk >= count) chunk = (u_int)(count - i); - random_harvest_internal(get_cyclecount(), (char *)buf + i, + random_harvestq_internal(get_cyclecount(), (char *)buf + i, chunk, 0, 0, RANDOM_WRITE); } } From owner-svn-src-projects@FreeBSD.ORG Fri Aug 30 17:47:54 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 9C9AF8A1; Fri, 30 Aug 2013 17:47:54 +0000 (UTC) (envelope-from markm@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 796DA24CB; Fri, 30 Aug 2013 17:47:54 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id r7UHlsto098383; Fri, 30 Aug 2013 17:47:54 GMT (envelope-from markm@svn.freebsd.org) Received: (from markm@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id r7UHlr88098379; Fri, 30 Aug 2013 17:47:53 GMT (envelope-from markm@svn.freebsd.org) Message-Id: <201308301747.r7UHlr88098379@svn.freebsd.org> From: Mark Murray Date: Fri, 30 Aug 2013 17:47:53 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r255075 - in projects/random_number_generator: share/examples/kld/random_adaptor sys/dev/random X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 30 Aug 2013 17:47:54 -0000 Author: markm Date: Fri Aug 30 17:47:53 2013 New Revision: 255075 URL: http://svnweb.freebsd.org/changeset/base/255075 Log: Remove short-lived idea; thread to harvest (eg) RDRAND enropy into the usual harvest queues. It was a nifty idea, but too heavyweight. Submitted by: Arthur Mesh Modified: projects/random_number_generator/share/examples/kld/random_adaptor/random_adaptor_example.c projects/random_number_generator/sys/dev/random/random_adaptors.c projects/random_number_generator/sys/dev/random/random_adaptors.h Modified: projects/random_number_generator/share/examples/kld/random_adaptor/random_adaptor_example.c ============================================================================== --- projects/random_number_generator/share/examples/kld/random_adaptor/random_adaptor_example.c Fri Aug 30 15:26:45 2013 (r255074) +++ projects/random_number_generator/share/examples/kld/random_adaptor/random_adaptor_example.c Fri Aug 30 17:47:53 2013 (r255075) @@ -37,16 +37,13 @@ __FBSDID("$FreeBSD$"); #include #include -static int random_example_entropy_control; - #define RNG_NAME "example" static int random_example_read(void *, int); -static void random_example_init(void); struct random_adaptor random_example = { .ident = "Example RNG", - .init = random_example_init, + .init = (random_init_func_t *)random_null_func, .deinit = (random_deinit_func_t *)random_null_func, .read = random_example_read, .write = (random_write_func_t *)random_null_func, @@ -54,18 +51,6 @@ struct random_adaptor random_example = { .seeded = 1, }; -static void -random_example_init(void) -{ - - /* - * Init() is called only if this RNG was chosen to plugin in to - * random(4). In which case, we should no longer use this adaptor as - * an entropy source. - */ - random_example_entropy_control = 1; -} - /* * Used under the license provided @ http://xkcd.com/221/ * http://creativecommons.org/licenses/by-nc/2.5/ @@ -98,9 +83,6 @@ random_example_modevent(module_t mod, in switch (type) { case MOD_LOAD: - /* start off by using this as an entropy source */ - random_adaptor_use_as_entropy(RNG_NAME, &random_example, - &random_example_entropy_control); random_adaptor_register(RNG_NAME, &random_example); EVENTHANDLER_INVOKE(random_adaptor_attach, &random_example); return (0); Modified: projects/random_number_generator/sys/dev/random/random_adaptors.c ============================================================================== --- projects/random_number_generator/sys/dev/random/random_adaptors.c Fri Aug 30 15:26:45 2013 (r255074) +++ projects/random_number_generator/sys/dev/random/random_adaptors.c Fri Aug 30 17:47:53 2013 (r255075) @@ -55,11 +55,6 @@ static struct sysctl_ctx_list random_cli MALLOC_DEFINE(M_RANDOM_ADAPTORS, "random_adaptors", "Random adaptors buffers"); -struct entropy_thread_ctx { - struct random_adaptor *adaptor; - int *control; -}; - int random_adaptor_register(const char *name, struct random_adaptor *rsp) { @@ -186,72 +181,6 @@ random_adaptor_choose(struct random_adap } static void -random_proc(void *arg) -{ - struct entropy_thread_ctx *ctx; - u_char randomness[HARVESTSIZE]; - int i; - - ctx = (struct entropy_thread_ctx *)arg; - - /* Sanity check. */ - if (ctx->adaptor == NULL || ctx->adaptor->read == NULL) - return; - - for (; *ctx->control == 0;) { - i = ctx->adaptor->read(randomness, sizeof(randomness)); - - if (i > 0) - /* Be very conservative with entropy estimation here. */ - random_harvest(randomness, i, 0, 0, RANDOM_PURE); - - /* Wake up every 10 secs. */ - tsleep_sbt(ctx->adaptor, PWAIT | PCATCH, "-", SBT_1M / 6, 0, 0); - } - - printf("<%s> entropy source is exiting\n", ctx->adaptor->ident); - free(ctx, M_RANDOM_ADAPTORS); - kproc_exit(0); -} - -/* - * Use RNG's output as an entropy source for another RNG. i.e.: - * +--------+ +--------+ - * | Intel | | Yarrow | - * | RDRAND +--------->| | - * +--------+ +--------+ - * Very useful for seeding software RNGs with output of - * Hardware RNGs like Intel's RdRand and VIA's Padlock. - * - * Returns a handle to the newly created kernel process. - */ -void * -random_adaptor_use_as_entropy(const char *id, struct random_adaptor *adaptor, - int *control) -{ - int error; - struct proc *random_chain_proc; - struct entropy_thread_ctx *ctx; - - KASSERT(adaptor != NULL, ("can't obtain randomness")); - KASSERT(control != NULL, ("can't control entropy process")); - - ctx = malloc(sizeof(struct entropy_thread_ctx), M_RANDOM_ADAPTORS, - M_WAITOK); - - ctx->control = control; - ctx->adaptor = adaptor; - - /* Start the thread */ - error = kproc_create(random_proc, ctx, &random_chain_proc, RFHIGHPID, - 0, "%s_entropy", id); - if (error != 0) - panic("Cannot create rng chaining thread"); - - return random_chain_proc; -} - -static void random_adaptors_deinit(void *unused) { Modified: projects/random_number_generator/sys/dev/random/random_adaptors.h ============================================================================== --- projects/random_number_generator/sys/dev/random/random_adaptors.h Fri Aug 30 15:26:45 2013 (r255074) +++ projects/random_number_generator/sys/dev/random/random_adaptors.h Fri Aug 30 17:47:53 2013 (r255075) @@ -40,8 +40,6 @@ struct random_adaptors { struct random_adaptor *random_adaptor_get(const char *); int random_adaptor_register(const char *, struct random_adaptor *); void random_adaptor_choose(struct random_adaptor **); -void *random_adaptor_use_as_entropy(const char *, struct random_adaptor *, - int *); /* * random_adaptor's should be registered prior to From owner-svn-src-projects@FreeBSD.ORG Sat Aug 31 13:41:25 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 4DEA214E; Sat, 31 Aug 2013 13:41:25 +0000 (UTC) (envelope-from markm@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 3884A22A7; Sat, 31 Aug 2013 13:41:25 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id r7VDfPow087455; Sat, 31 Aug 2013 13:41:25 GMT (envelope-from markm@svn.freebsd.org) Received: (from markm@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id r7VDfLsT087435; Sat, 31 Aug 2013 13:41:21 GMT (envelope-from markm@svn.freebsd.org) Message-Id: <201308311341.r7VDfLsT087435@svn.freebsd.org> From: Mark Murray Date: Sat, 31 Aug 2013 13:41:21 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r255094 - in projects/random_number_generator: bin/sh contrib/libcxxrt contrib/llvm/lib/Transforms/InstCombine lib/libcompiler_rt share/man/man4 sys/amd64/amd64 sys/arm/arm sys/dev/acpi... X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 31 Aug 2013 13:41:25 -0000 Author: markm Date: Sat Aug 31 13:41:20 2013 New Revision: 255094 URL: http://svnweb.freebsd.org/changeset/base/255094 Log: MFC Added: projects/random_number_generator/sys/mips/conf/PICOSTATION_M2HP - copied unchanged from r255093, head/sys/mips/conf/PICOSTATION_M2HP projects/random_number_generator/sys/mips/conf/PICOSTATION_M2HP.hints - copied unchanged from r255093, head/sys/mips/conf/PICOSTATION_M2HP.hints projects/random_number_generator/sys/mips/malta/gt_pci_bus_space.c - copied unchanged from r255093, head/sys/mips/malta/gt_pci_bus_space.c projects/random_number_generator/sys/mips/malta/gt_pci_bus_space.h - copied unchanged from r255093, head/sys/mips/malta/gt_pci_bus_space.h projects/random_number_generator/tools/regression/bin/sh/builtins/type3.0 - copied unchanged from r255093, head/tools/regression/bin/sh/builtins/type3.0 Modified: projects/random_number_generator/bin/sh/exec.c projects/random_number_generator/bin/sh/parser.c projects/random_number_generator/contrib/libcxxrt/exception.cc projects/random_number_generator/contrib/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp projects/random_number_generator/lib/libcompiler_rt/Makefile projects/random_number_generator/share/man/man4/vmx.4 projects/random_number_generator/sys/amd64/amd64/pmap.c projects/random_number_generator/sys/arm/arm/machdep.c projects/random_number_generator/sys/arm/arm/stdatomic.c projects/random_number_generator/sys/dev/acpica/acpi_thermal.c projects/random_number_generator/sys/dev/md/md.c projects/random_number_generator/sys/dev/uart/uart_dev_ns8250.c projects/random_number_generator/sys/dev/usb/usbdevs projects/random_number_generator/sys/mips/conf/MALTA projects/random_number_generator/sys/mips/conf/MALTA64 projects/random_number_generator/sys/mips/malta/files.malta projects/random_number_generator/sys/mips/malta/gt_pci.c projects/random_number_generator/sys/mips/malta/malta_machdep.c projects/random_number_generator/sys/netgraph/bluetooth/drivers/ubt/ng_ubt.c projects/random_number_generator/sys/sys/sysctl.h Directory Properties: projects/random_number_generator/ (props changed) projects/random_number_generator/contrib/libcxxrt/ (props changed) projects/random_number_generator/contrib/llvm/ (props changed) projects/random_number_generator/share/man/man4/ (props changed) projects/random_number_generator/sys/ (props changed) Modified: projects/random_number_generator/bin/sh/exec.c ============================================================================== --- projects/random_number_generator/bin/sh/exec.c Sat Aug 31 08:56:33 2013 (r255093) +++ projects/random_number_generator/bin/sh/exec.c Sat Aug 31 13:41:20 2013 (r255094) @@ -762,5 +762,7 @@ typecmd_impl(int argc, char **argv, int int typecmd(int argc, char **argv) { + if (argc > 2 && strcmp(argv[1], "--") == 0) + argc--, argv++; return typecmd_impl(argc, argv, TYPECMD_TYPE, bltinlookup("PATH", 1)); } Modified: projects/random_number_generator/bin/sh/parser.c ============================================================================== --- projects/random_number_generator/bin/sh/parser.c Sat Aug 31 08:56:33 2013 (r255093) +++ projects/random_number_generator/bin/sh/parser.c Sat Aug 31 13:41:20 2013 (r255094) @@ -108,12 +108,13 @@ static int funclinno; /* line # where t static struct parser_temp *parser_temp; -static union node *list(int, int); +static union node *list(int); static union node *andor(void); static union node *pipeline(void); static union node *command(void); static union node *simplecmd(union node **, union node *); static union node *makename(void); +static union node *makebinary(int type, union node *n1, union node *n2); static void parsefname(void); static void parseheredoc(void); static int peektoken(void); @@ -121,6 +122,7 @@ static int readtoken(void); static int xxreadtoken(void); static int readtoken1(int, const char *, const char *, int); static int noexpand(char *); +static void consumetoken(int); static void synexpect(int) __dead2; static void synerror(const char *) __dead2; static void setprompt(int); @@ -223,18 +225,18 @@ parsecmd(int interact) if (t == TNL) return NULL; tokpushback++; - return list(1, 1); + return list(1); } static union node * -list(int nlflag, int erflag) +list(int nlflag) { union node *ntop, *n1, *n2, *n3; int tok; checkkwd = CHKNL | CHKKWD | CHKALIAS; - if (!nlflag && !erflag && tokendlist[peektoken()]) + if (!nlflag && tokendlist[peektoken()]) return NULL; ntop = n1 = NULL; for (;;) { @@ -256,17 +258,11 @@ list(int nlflag, int erflag) if (ntop == NULL) ntop = n2; else if (n1 == NULL) { - n1 = (union node *)stalloc(sizeof (struct nbinary)); - n1->type = NSEMI; - n1->nbinary.ch1 = ntop; - n1->nbinary.ch2 = n2; + n1 = makebinary(NSEMI, ntop, n2); ntop = n1; } else { - n3 = (union node *)stalloc(sizeof (struct nbinary)); - n3->type = NSEMI; - n3->nbinary.ch1 = n1->nbinary.ch2; - n3->nbinary.ch2 = n2; + n3 = makebinary(NSEMI, n1->nbinary.ch2, n2); n1->nbinary.ch2 = n3; n1 = n3; } @@ -287,8 +283,7 @@ list(int nlflag, int erflag) tokpushback++; } checkkwd = CHKNL | CHKKWD | CHKALIAS; - if (!nlflag && (erflag ? peektoken() == TEOF : - tokendlist[peektoken()])) + if (!nlflag && tokendlist[peektoken()]) return ntop; break; case TEOF: @@ -298,7 +293,7 @@ list(int nlflag, int erflag) pungetc(); /* push back EOF on input */ return ntop; default: - if (nlflag || erflag) + if (nlflag) synexpect(-1); tokpushback++; return ntop; @@ -311,10 +306,10 @@ list(int nlflag, int erflag) static union node * andor(void) { - union node *n1, *n2, *n3; + union node *n; int t; - n1 = pipeline(); + n = pipeline(); for (;;) { if ((t = readtoken()) == TAND) { t = NAND; @@ -322,14 +317,9 @@ andor(void) t = NOR; } else { tokpushback++; - return n1; + return n; } - n2 = pipeline(); - n3 = (union node *)stalloc(sizeof (struct nbinary)); - n3->type = t; - n3->nbinary.ch1 = n1; - n3->nbinary.ch2 = n2; - n1 = n3; + n = makebinary(t, n, pipeline()); } } @@ -411,49 +401,39 @@ command(void) case TIF: n1 = (union node *)stalloc(sizeof (struct nif)); n1->type = NIF; - if ((n1->nif.test = list(0, 0)) == NULL) + if ((n1->nif.test = list(0)) == NULL) synexpect(-1); - if (readtoken() != TTHEN) - synexpect(TTHEN); - n1->nif.ifpart = list(0, 0); + consumetoken(TTHEN); + n1->nif.ifpart = list(0); n2 = n1; while (readtoken() == TELIF) { n2->nif.elsepart = (union node *)stalloc(sizeof (struct nif)); n2 = n2->nif.elsepart; n2->type = NIF; - if ((n2->nif.test = list(0, 0)) == NULL) + if ((n2->nif.test = list(0)) == NULL) synexpect(-1); - if (readtoken() != TTHEN) - synexpect(TTHEN); - n2->nif.ifpart = list(0, 0); + consumetoken(TTHEN); + n2->nif.ifpart = list(0); } if (lasttoken == TELSE) - n2->nif.elsepart = list(0, 0); + n2->nif.elsepart = list(0); else { n2->nif.elsepart = NULL; tokpushback++; } - if (readtoken() != TFI) - synexpect(TFI); + consumetoken(TFI); checkkwd = CHKKWD | CHKALIAS; break; case TWHILE: - case TUNTIL: { - int got; - n1 = (union node *)stalloc(sizeof (struct nbinary)); - n1->type = (lasttoken == TWHILE)? NWHILE : NUNTIL; - if ((n1->nbinary.ch1 = list(0, 0)) == NULL) + case TUNTIL: + t = lasttoken; + if ((n1 = list(0)) == NULL) synexpect(-1); - if ((got=readtoken()) != TDO) { -TRACE(("expecting DO got %s %s\n", tokname[got], got == TWORD ? wordtext : "")); - synexpect(TDO); - } - n1->nbinary.ch2 = list(0, 0); - if (readtoken() != TDONE) - synexpect(TDONE); + consumetoken(TDO); + n1 = makebinary((t == TWHILE)? NWHILE : NUNTIL, n1, list(0)); + consumetoken(TDONE); checkkwd = CHKKWD | CHKALIAS; break; - } case TFOR: if (readtoken() != TWORD || quoteflag || ! goodname(wordtext)) synerror("Bad for loop variable"); @@ -465,10 +445,7 @@ TRACE(("expecting DO got %s %s\n", tokna if (lasttoken == TWORD && ! quoteflag && equal(wordtext, "in")) { app = ≈ while (readtoken() == TWORD) { - n2 = (union node *)stalloc(sizeof (struct narg)); - n2->type = NARG; - n2->narg.text = wordtext; - n2->narg.backquote = backquotelist; + n2 = makename(); *app = n2; app = &n2->narg.next; } @@ -500,21 +477,15 @@ TRACE(("expecting DO got %s %s\n", tokna t = TEND; else synexpect(-1); - n1->nfor.body = list(0, 0); - if (readtoken() != t) - synexpect(t); + n1->nfor.body = list(0); + consumetoken(t); checkkwd = CHKKWD | CHKALIAS; break; case TCASE: n1 = (union node *)stalloc(sizeof (struct ncase)); n1->type = NCASE; - if (readtoken() != TWORD) - synexpect(TWORD); - n1->ncase.expr = n2 = (union node *)stalloc(sizeof (struct narg)); - n2->type = NARG; - n2->narg.text = wordtext; - n2->narg.backquote = backquotelist; - n2->narg.next = NULL; + consumetoken(TWORD); + n1->ncase.expr = makename(); while (readtoken() == TNL); if (lasttoken != TWORD || ! equal(wordtext, "in")) synerror("expecting \"in\""); @@ -527,10 +498,7 @@ TRACE(("expecting DO got %s %s\n", tokna if (lasttoken == TLP) readtoken(); for (;;) { - *app = ap = (union node *)stalloc(sizeof (struct narg)); - ap->type = NARG; - ap->narg.text = wordtext; - ap->narg.backquote = backquotelist; + *app = ap = makename(); checkkwd = CHKNL | CHKKWD; if (readtoken() != TPIPE) break; @@ -540,7 +508,7 @@ TRACE(("expecting DO got %s %s\n", tokna ap->narg.next = NULL; if (lasttoken != TRP) synexpect(TRP); - cp->nclist.body = list(0, 0); + cp->nclist.body = list(0); checkkwd = CHKNL | CHKKWD | CHKALIAS; if ((t = readtoken()) != TESAC) { @@ -560,17 +528,15 @@ TRACE(("expecting DO got %s %s\n", tokna case TLP: n1 = (union node *)stalloc(sizeof (struct nredir)); n1->type = NSUBSHELL; - n1->nredir.n = list(0, 0); + n1->nredir.n = list(0); n1->nredir.redirect = NULL; - if (readtoken() != TRP) - synexpect(TRP); + consumetoken(TRP); checkkwd = CHKKWD | CHKALIAS; is_subshell = 1; break; case TBEGIN: - n1 = list(0, 0); - if (readtoken() != TEND) - synexpect(TEND); + n1 = list(0); + consumetoken(TEND); checkkwd = CHKKWD | CHKALIAS; break; /* A simple command must have at least one redirection or word. */ @@ -644,10 +610,7 @@ simplecmd(union node **rpp, union node * for (;;) { checkkwd = savecheckkwd; if (readtoken() == TWORD) { - n = (union node *)stalloc(sizeof (struct narg)); - n->type = NARG; - n->narg.text = wordtext; - n->narg.backquote = backquotelist; + n = makename(); *app = n; app = &n->narg.next; if (savecheckkwd != 0 && !isassignment(wordtext)) @@ -659,8 +622,7 @@ simplecmd(union node **rpp, union node * } else if (lasttoken == TLP && app == &args->narg.next && rpp == orig_rpp) { /* We have a function */ - if (readtoken() != TRP) - synexpect(TRP); + consumetoken(TRP); funclinno = plinno; /* * - Require plain text. @@ -708,6 +670,18 @@ makename(void) return n; } +static union node * +makebinary(int type, union node *n1, union node *n2) +{ + union node *n; + + n = (union node *)stalloc(sizeof (struct nbinary)); + n->type = type; + n->nbinary.ch1 = n1; + n->nbinary.ch2 = n2; + return (n); +} + void fixredir(union node *n, const char *text, int err) { @@ -734,8 +708,7 @@ parsefname(void) { union node *n = redirnode; - if (readtoken() != TWORD) - synexpect(-1); + consumetoken(TWORD); if (n->type == NHERE) { struct heredoc *here = heredoc; struct heredoc *p; @@ -786,11 +759,7 @@ parseheredoc(void) } readtoken1(pgetc(), here->here->type == NHERE? SQSYNTAX : DQSYNTAX, here->eofmark, here->striptabs); - n = (union node *)stalloc(sizeof (struct narg)); - n->narg.type = NARG; - n->narg.next = NULL; - n->narg.text = wordtext; - n->narg.backquote = backquotelist; + n = makename(); here->here->nhere.doc = n; } } @@ -1090,14 +1059,14 @@ done: doprompt = 0; } - n = list(0, oldstyle); + n = list(0); - if (oldstyle) + if (oldstyle) { + if (peektoken() != TEOF) + synexpect(-1); doprompt = saveprompt; - else { - if (readtoken() != TRP) - synexpect(TRP); - } + } else + consumetoken(TRP); (*nlpp)->n = n; if (oldstyle) { @@ -1880,6 +1849,14 @@ isassignment(const char *p) } +static void +consumetoken(int token) +{ + if (readtoken() != token) + synexpect(token); +} + + /* * Called when an unexpected token is read during the parse. The argument * is the token that is expected, or -1 if more than one type of token can Modified: projects/random_number_generator/contrib/libcxxrt/exception.cc ============================================================================== --- projects/random_number_generator/contrib/libcxxrt/exception.cc Sat Aug 31 08:56:33 2013 (r255093) +++ projects/random_number_generator/contrib/libcxxrt/exception.cc Sat Aug 31 13:41:20 2013 (r255094) @@ -715,7 +715,9 @@ static void report_failure(_Unwind_Reaso if (status == 0) { free(demangled); } // Print a back trace if no handler is found. // TODO: Make this optional +#ifndef __arm__ _Unwind_Backtrace(trace, 0); +#endif break; } std::terminate(); Modified: projects/random_number_generator/contrib/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp ============================================================================== --- projects/random_number_generator/contrib/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp Sat Aug 31 08:56:33 2013 (r255093) +++ projects/random_number_generator/contrib/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp Sat Aug 31 13:41:20 2013 (r255094) @@ -845,21 +845,26 @@ Value *InstCombiner::SimplifyDemandedUse Value *InstCombiner::SimplifyShrShlDemandedBits(Instruction *Shr, Instruction *Shl, APInt DemandedMask, APInt &KnownZero, APInt &KnownOne) { - unsigned ShlAmt = cast(Shl->getOperand(1))->getZExtValue(); - unsigned ShrAmt = cast(Shr->getOperand(1))->getZExtValue(); + const APInt &ShlOp1 = cast(Shl->getOperand(1))->getValue(); + const APInt &ShrOp1 = cast(Shr->getOperand(1))->getValue(); + if (!ShlOp1 || !ShrOp1) + return 0; // Noop. + + Value *VarX = Shr->getOperand(0); + Type *Ty = VarX->getType(); + unsigned BitWidth = Ty->getIntegerBitWidth(); + if (ShlOp1.uge(BitWidth) || ShrOp1.uge(BitWidth)) + return 0; // Undef. + + unsigned ShlAmt = ShlOp1.getZExtValue(); + unsigned ShrAmt = ShrOp1.getZExtValue(); KnownOne.clearAllBits(); KnownZero = APInt::getBitsSet(KnownZero.getBitWidth(), 0, ShlAmt-1); KnownZero &= DemandedMask; - if (ShlAmt == 0 || ShrAmt == 0) - return 0; - - Value *VarX = Shr->getOperand(0); - Type *Ty = VarX->getType(); - - APInt BitMask1(APInt::getAllOnesValue(Ty->getIntegerBitWidth())); - APInt BitMask2(APInt::getAllOnesValue(Ty->getIntegerBitWidth())); + APInt BitMask1(APInt::getAllOnesValue(BitWidth)); + APInt BitMask2(APInt::getAllOnesValue(BitWidth)); bool isLshr = (Shr->getOpcode() == Instruction::LShr); BitMask1 = isLshr ? (BitMask1.lshr(ShrAmt) << ShlAmt) : Modified: projects/random_number_generator/lib/libcompiler_rt/Makefile ============================================================================== --- projects/random_number_generator/lib/libcompiler_rt/Makefile Sat Aug 31 08:56:33 2013 (r255093) +++ projects/random_number_generator/lib/libcompiler_rt/Makefile Sat Aug 31 13:41:20 2013 (r255094) @@ -153,10 +153,11 @@ SRCF+= divsi3 \ .endif # FreeBSD-specific atomic intrinsics. -.if ${MACHINE_CPUARCH} == "arm" +.if ${MACHINE_CPUARCH} == "arm" || ${MACHINE_CPUARCH} == "armv6" .PATH: ${.CURDIR}/../../sys/arm/arm SRCF+= stdatomic +CFLAGS+= -DEMIT_SYNC_ATOMICS .elif ${MACHINE_CPUARCH} == "mips" .PATH: ${.CURDIR}/../../sys/mips/mips Modified: projects/random_number_generator/share/man/man4/vmx.4 ============================================================================== --- projects/random_number_generator/share/man/man4/vmx.4 Sat Aug 31 08:56:33 2013 (r255093) +++ projects/random_number_generator/share/man/man4/vmx.4 Sat Aug 31 13:41:20 2013 (r255094) @@ -100,6 +100,7 @@ Number of receive descriptors per ring a The default value is 256. The value must be a multiple of 32, and the maximum is 2048. There are two rings so the actual usage is doubled. +.El .Sh EXAMPLES The following entry must be added to the VMware configuration file to provide the Modified: projects/random_number_generator/sys/amd64/amd64/pmap.c ============================================================================== --- projects/random_number_generator/sys/amd64/amd64/pmap.c Sat Aug 31 08:56:33 2013 (r255093) +++ projects/random_number_generator/sys/amd64/amd64/pmap.c Sat Aug 31 13:41:20 2013 (r255094) @@ -1863,6 +1863,7 @@ pmap_pinit0(pmap_t pmap) pmap->pm_pml4 = (pml4_entry_t *)PHYS_TO_DMAP(KPML4phys); pmap->pm_root.rt_root = 0; CPU_ZERO(&pmap->pm_active); + CPU_ZERO(&pmap->pm_save); PCPU_SET(curpmap, pmap); TAILQ_INIT(&pmap->pm_pvchunk); bzero(&pmap->pm_stats, sizeof pmap->pm_stats); @@ -5939,7 +5940,6 @@ pmap_activate(struct thread *td) critical_enter(); pmap = vmspace_pmap(td->td_proc->p_vmspace); oldpmap = PCPU_GET(curpmap); - CPU_ZERO(&pmap->pm_save); cpuid = PCPU_GET(cpuid); #ifdef SMP CPU_CLR_ATOMIC(cpuid, &oldpmap->pm_active); Modified: projects/random_number_generator/sys/arm/arm/machdep.c ============================================================================== --- projects/random_number_generator/sys/arm/arm/machdep.c Sat Aug 31 08:56:33 2013 (r255093) +++ projects/random_number_generator/sys/arm/arm/machdep.c Sat Aug 31 13:41:20 2013 (r255094) @@ -1263,7 +1263,7 @@ initarm(struct arm_boot_params *abp) break; /* * Restricted region includes memory region - * skip availble region + * skip available region */ if ((start >= rstart) && (rend >= end)) { start = rend; Modified: projects/random_number_generator/sys/arm/arm/stdatomic.c ============================================================================== --- projects/random_number_generator/sys/arm/arm/stdatomic.c Sat Aug 31 08:56:33 2013 (r255093) +++ projects/random_number_generator/sys/arm/arm/stdatomic.c Sat Aug 31 13:41:20 2013 (r255094) @@ -194,6 +194,7 @@ EMIT_ALL_OPS_N(1, uint8_t) EMIT_ALL_OPS_N(2, uint16_t) EMIT_ALL_OPS_N(4, uint32_t) EMIT_ALL_OPS_N(8, uint64_t) +#undef EMIT_ALL_OPS_N #else /* !_KERNEL */ @@ -330,6 +331,7 @@ EMIT_FETCH_OP_N(N, uintN_t, ldr, str, fe EMIT_ALL_OPS_N(1, uint8_t, "ldrb", "strb", "strbeq") EMIT_ALL_OPS_N(2, uint16_t, "ldrh", "strh", "strheq") EMIT_ALL_OPS_N(4, uint32_t, "ldr", "str", "streq") +#undef EMIT_ALL_OPS_N #endif /* _KERNEL */ @@ -337,7 +339,31 @@ EMIT_ALL_OPS_N(4, uint32_t, "ldr", "str" #endif /* __CLANG_ATOMICS || __GNUC_ATOMICS */ -#if defined(__SYNC_ATOMICS) +#if defined(__SYNC_ATOMICS) || defined(EMIT_SYNC_ATOMICS) + +#ifdef __clang__ +#pragma redefine_extname __sync_lock_test_and_set_1_c __sync_lock_test_and_set_1 +#pragma redefine_extname __sync_lock_test_and_set_2_c __sync_lock_test_and_set_2 +#pragma redefine_extname __sync_lock_test_and_set_4_c __sync_lock_test_and_set_4 +#pragma redefine_extname __sync_val_compare_and_swap_1_c __sync_val_compare_and_swap_1 +#pragma redefine_extname __sync_val_compare_and_swap_2_c __sync_val_compare_and_swap_2 +#pragma redefine_extname __sync_val_compare_and_swap_4_c __sync_val_compare_and_swap_4 +#pragma redefine_extname __sync_fetch_and_add_1_c __sync_fetch_and_add_1 +#pragma redefine_extname __sync_fetch_and_add_2_c __sync_fetch_and_add_2 +#pragma redefine_extname __sync_fetch_and_add_4_c __sync_fetch_and_add_4 +#pragma redefine_extname __sync_fetch_and_and_1_c __sync_fetch_and_and_1 +#pragma redefine_extname __sync_fetch_and_and_2_c __sync_fetch_and_and_2 +#pragma redefine_extname __sync_fetch_and_and_4_c __sync_fetch_and_and_4 +#pragma redefine_extname __sync_fetch_and_or_1_c __sync_fetch_and_or_1 +#pragma redefine_extname __sync_fetch_and_or_2_c __sync_fetch_and_or_2 +#pragma redefine_extname __sync_fetch_and_or_4_c __sync_fetch_and_or_4 +#pragma redefine_extname __sync_fetch_and_xor_1_c __sync_fetch_and_xor_1 +#pragma redefine_extname __sync_fetch_and_xor_2_c __sync_fetch_and_xor_2 +#pragma redefine_extname __sync_fetch_and_xor_4_c __sync_fetch_and_xor_4 +#pragma redefine_extname __sync_fetch_and_sub_1_c __sync_fetch_and_sub_1 +#pragma redefine_extname __sync_fetch_and_sub_2_c __sync_fetch_and_sub_2 +#pragma redefine_extname __sync_fetch_and_sub_4_c __sync_fetch_and_sub_4 +#endif /* * Old __sync_* API. @@ -430,7 +456,7 @@ get_2(const reg_t *r, const uint16_t *of #define EMIT_LOCK_TEST_AND_SET_N(N, uintN_t) \ uintN_t \ -__sync_lock_test_and_set_##N(uintN_t *mem, uintN_t val) \ +__sync_lock_test_and_set_##N##_c(uintN_t *mem, uintN_t val) \ { \ uint32_t *mem32; \ reg_t val32, negmask, old; \ @@ -462,7 +488,7 @@ EMIT_LOCK_TEST_AND_SET_N(2, uint16_t) #define EMIT_VAL_COMPARE_AND_SWAP_N(N, uintN_t) \ uintN_t \ -__sync_val_compare_and_swap_##N(uintN_t *mem, uintN_t expected, \ +__sync_val_compare_and_swap_##N##_c(uintN_t *mem, uintN_t expected, \ uintN_t desired) \ { \ uint32_t *mem32; \ @@ -503,7 +529,7 @@ EMIT_VAL_COMPARE_AND_SWAP_N(2, uint16_t) #define EMIT_ARITHMETIC_FETCH_AND_OP_N(N, uintN_t, name, op) \ uintN_t \ -__sync_##name##_##N(uintN_t *mem, uintN_t val) \ +__sync_##name##_##N##_c(uintN_t *mem, uintN_t val) \ { \ uint32_t *mem32; \ reg_t val32, posmask, old; \ @@ -541,7 +567,7 @@ EMIT_ARITHMETIC_FETCH_AND_OP_N(2, uint16 #define EMIT_BITWISE_FETCH_AND_OP_N(N, uintN_t, name, op, idempotence) \ uintN_t \ -__sync_##name##_##N(uintN_t *mem, uintN_t val) \ +__sync_##name##_##N##_c(uintN_t *mem, uintN_t val) \ { \ uint32_t *mem32; \ reg_t val32, old; \ @@ -577,7 +603,7 @@ EMIT_BITWISE_FETCH_AND_OP_N(2, uint16_t, */ uint32_t -__sync_lock_test_and_set_4(uint32_t *mem, uint32_t val) +__sync_lock_test_and_set_4_c(uint32_t *mem, uint32_t val) { uint32_t old, temp; @@ -594,7 +620,7 @@ __sync_lock_test_and_set_4(uint32_t *mem } uint32_t -__sync_val_compare_and_swap_4(uint32_t *mem, uint32_t expected, +__sync_val_compare_and_swap_4_c(uint32_t *mem, uint32_t expected, uint32_t desired) { uint32_t old, temp; @@ -616,7 +642,7 @@ __sync_val_compare_and_swap_4(uint32_t * #define EMIT_FETCH_AND_OP_4(name, op) \ uint32_t \ -__sync_##name##_4(uint32_t *mem, uint32_t val) \ +__sync_##name##_4##_c(uint32_t *mem, uint32_t val) \ { \ uint32_t old, temp1, temp2; \ \ @@ -694,6 +720,7 @@ EMIT_ALL_OPS_N(1, uint8_t) EMIT_ALL_OPS_N(2, uint16_t) EMIT_ALL_OPS_N(4, uint32_t) EMIT_ALL_OPS_N(8, uint64_t) +#undef EMIT_ALL_OPS_N #else /* !_KERNEL */ @@ -705,7 +732,7 @@ EMIT_ALL_OPS_N(8, uint64_t) #define EMIT_LOCK_TEST_AND_SET_N(N, uintN_t, ldr, str) \ uintN_t \ -__sync_lock_test_and_set_##N(uintN_t *mem, uintN_t val) \ +__sync_lock_test_and_set_##N##_c(uintN_t *mem, uintN_t val) \ { \ uint32_t old, temp, ras_start; \ \ @@ -734,7 +761,7 @@ __sync_lock_test_and_set_##N(uintN_t *me #define EMIT_VAL_COMPARE_AND_SWAP_N(N, uintN_t, ldr, streq) \ uintN_t \ -__sync_val_compare_and_swap_##N(uintN_t *mem, uintN_t expected, \ +__sync_val_compare_and_swap_##N##_c(uintN_t *mem, uintN_t expected, \ uintN_t desired) \ { \ uint32_t old, temp, ras_start; \ @@ -766,7 +793,7 @@ __sync_val_compare_and_swap_##N(uintN_t #define EMIT_FETCH_AND_OP_N(N, uintN_t, ldr, str, name, op) \ uintN_t \ -__sync_##name##_##N(uintN_t *mem, uintN_t val) \ +__sync_##name##_##N##_c(uintN_t *mem, uintN_t val) \ { \ uint32_t old, temp, ras_start; \ \ @@ -807,6 +834,30 @@ EMIT_ALL_OPS_N(1, uint8_t, "ldrb", "strb EMIT_ALL_OPS_N(2, uint16_t, "ldrh", "strh", "streqh") EMIT_ALL_OPS_N(4, uint32_t, "ldr", "str", "streq") +#ifndef __clang__ +__strong_reference(__sync_lock_test_and_set_1_c, __sync_lock_test_and_set_1); +__strong_reference(__sync_lock_test_and_set_2_c, __sync_lock_test_and_set_2); +__strong_reference(__sync_lock_test_and_set_4_c, __sync_lock_test_and_set_4); +__strong_reference(__sync_val_compare_and_swap_1_c, __sync_val_compare_and_swap_1); +__strong_reference(__sync_val_compare_and_swap_2_c, __sync_val_compare_and_swap_2); +__strong_reference(__sync_val_compare_and_swap_4_c, __sync_val_compare_and_swap_4); +__strong_reference(__sync_fetch_and_add_1_c, __sync_fetch_and_add_1); +__strong_reference(__sync_fetch_and_add_2_c, __sync_fetch_and_add_2); +__strong_reference(__sync_fetch_and_add_4_c, __sync_fetch_and_add_4); +__strong_reference(__sync_fetch_and_and_1_c, __sync_fetch_and_and_1); +__strong_reference(__sync_fetch_and_and_2_c, __sync_fetch_and_and_2); +__strong_reference(__sync_fetch_and_and_4_c, __sync_fetch_and_and_4); +__strong_reference(__sync_fetch_and_sub_1_c, __sync_fetch_and_sub_1); +__strong_reference(__sync_fetch_and_sub_2_c, __sync_fetch_and_sub_2); +__strong_reference(__sync_fetch_and_sub_4_c, __sync_fetch_and_sub_4); +__strong_reference(__sync_fetch_and_or_1_c, __sync_fetch_and_or_1); +__strong_reference(__sync_fetch_and_or_2_c, __sync_fetch_and_or_2); +__strong_reference(__sync_fetch_and_or_4_c, __sync_fetch_and_or_4); +__strong_reference(__sync_fetch_and_xor_1_c, __sync_fetch_and_xor_1); +__strong_reference(__sync_fetch_and_xor_2_c, __sync_fetch_and_xor_2); +__strong_reference(__sync_fetch_and_xor_4_c, __sync_fetch_and_xor_4); +#endif + #endif /* _KERNEL */ #endif Modified: projects/random_number_generator/sys/dev/acpica/acpi_thermal.c ============================================================================== --- projects/random_number_generator/sys/dev/acpica/acpi_thermal.c Sat Aug 31 08:56:33 2013 (r255093) +++ projects/random_number_generator/sys/dev/acpica/acpi_thermal.c Sat Aug 31 13:41:20 2013 (r255094) @@ -111,6 +111,7 @@ struct acpi_tz_softc { struct acpi_tz_zone tz_zone; /*Thermal zone parameters*/ int tz_validchecks; + int tz_insane_tmp_notified; /* passive cooling */ struct proc *tz_cooling_proc; @@ -161,6 +162,8 @@ static driver_t acpi_tz_driver = { sizeof(struct acpi_tz_softc), }; +static char *acpi_tz_tmp_name = "_TMP"; + static devclass_t acpi_tz_devclass; DRIVER_MODULE(acpi_tz, acpi, acpi_tz_driver, acpi_tz_devclass, 0, 0); MODULE_DEPEND(acpi_tz, acpi, 1, 1, 1); @@ -456,12 +459,11 @@ acpi_tz_get_temperature(struct acpi_tz_s { int temp; ACPI_STATUS status; - static char *tmp_name = "_TMP"; ACPI_FUNCTION_NAME ("acpi_tz_get_temperature"); /* Evaluate the thermal zone's _TMP method. */ - status = acpi_GetInteger(sc->tz_handle, tmp_name, &temp); + status = acpi_GetInteger(sc->tz_handle, acpi_tz_tmp_name, &temp); if (ACPI_FAILURE(status)) { ACPI_VPRINT(sc->tz_dev, acpi_device_get_parent_softc(sc->tz_dev), "error fetching current temperature -- %s\n", @@ -470,7 +472,7 @@ acpi_tz_get_temperature(struct acpi_tz_s } /* Check it for validity. */ - acpi_tz_sanity(sc, &temp, tmp_name); + acpi_tz_sanity(sc, &temp, acpi_tz_tmp_name); if (temp == -1) return (FALSE); @@ -696,10 +698,29 @@ static void acpi_tz_sanity(struct acpi_tz_softc *sc, int *val, char *what) { if (*val != -1 && (*val < TZ_ZEROC || *val > TZ_ZEROC + 2000)) { - device_printf(sc->tz_dev, "%s value is absurd, ignored (%d.%dC)\n", - what, TZ_KELVTOC(*val)); + /* + * If the value we are checking is _TMP, warn the user only + * once. This avoids spamming messages if, for instance, the + * sensor is broken and always returns an invalid temperature. + * + * This is only done for _TMP; other values always emit a + * warning. + */ + if (what != acpi_tz_tmp_name || !sc->tz_insane_tmp_notified) { + device_printf(sc->tz_dev, "%s value is absurd, ignored (%d.%dC)\n", + what, TZ_KELVTOC(*val)); + + /* Don't warn the user again if the read value doesn't improve. */ + if (what == acpi_tz_tmp_name) + sc->tz_insane_tmp_notified = 1; + } *val = -1; + return; } + + /* This value is correct. Warn if it's incorrect again. */ + if (what == acpi_tz_tmp_name) + sc->tz_insane_tmp_notified = 0; } /* Modified: projects/random_number_generator/sys/dev/md/md.c ============================================================================== --- projects/random_number_generator/sys/dev/md/md.c Sat Aug 31 08:56:33 2013 (r255093) +++ projects/random_number_generator/sys/dev/md/md.c Sat Aug 31 13:41:20 2013 (r255094) @@ -826,7 +826,7 @@ mdstart_swap(struct md_s *sc, struct bio vm_object_pip_add(sc->object, 1); for (i = bp->bio_offset / PAGE_SIZE; i <= lastp; i++) { len = ((i == lastp) ? lastend : PAGE_SIZE) - offs; - m = vm_page_grab(sc->object, i, VM_ALLOC_NORMAL); + m = vm_page_grab(sc->object, i, VM_ALLOC_SYSTEM); if (bp->bio_cmd == BIO_READ) { if (m->valid == VM_PAGE_BITS_ALL) rv = VM_PAGER_OK; Modified: projects/random_number_generator/sys/dev/uart/uart_dev_ns8250.c ============================================================================== --- projects/random_number_generator/sys/dev/uart/uart_dev_ns8250.c Sat Aug 31 08:56:33 2013 (r255093) +++ projects/random_number_generator/sys/dev/uart/uart_dev_ns8250.c Sat Aug 31 13:41:20 2013 (r255094) @@ -465,7 +465,7 @@ ns8250_bus_attach(struct uart_softc *sc) * accidental manner as before. More analysis is warranted, but * at least now we fixed a known regression. */ - DELAY(150); + DELAY(200); return (0); } Modified: projects/random_number_generator/sys/dev/usb/usbdevs ============================================================================== --- projects/random_number_generator/sys/dev/usb/usbdevs Sat Aug 31 08:56:33 2013 (r255093) +++ projects/random_number_generator/sys/dev/usb/usbdevs Sat Aug 31 13:41:20 2013 (r255094) @@ -515,11 +515,13 @@ vendor USR 0x0baf U.S. Robotics vendor AMBIT 0x0bb2 Ambit Microsystems vendor HTC 0x0bb4 HTC vendor REALTEK 0x0bda Realtek +vendor ERICSSON2 0x0bdb Ericsson vendor MEI 0x0bed MEI vendor ADDONICS2 0x0bf6 Addonics Technology vendor FSC 0x0bf8 Fujitsu Siemens Computers vendor AGATE 0x0c08 Agate Technologies vendor DMI 0x0c0b DMI +vendor CANYON 0x0c10 Canyon vendor ICOM 0x0c26 Icom Inc. vendor GNOTOMETRICS 0x0c33 GN Otometrics vendor CHICONY2 0x0c45 Chicony Modified: projects/random_number_generator/sys/mips/conf/MALTA ============================================================================== --- projects/random_number_generator/sys/mips/conf/MALTA Sat Aug 31 08:56:33 2013 (r255093) +++ projects/random_number_generator/sys/mips/conf/MALTA Sat Aug 31 13:41:20 2013 (r255094) @@ -65,5 +65,6 @@ device loop device ether device le device miibus +device bpf device md device uart Modified: projects/random_number_generator/sys/mips/conf/MALTA64 ============================================================================== --- projects/random_number_generator/sys/mips/conf/MALTA64 Sat Aug 31 08:56:33 2013 (r255093) +++ projects/random_number_generator/sys/mips/conf/MALTA64 Sat Aug 31 13:41:20 2013 (r255094) @@ -31,6 +31,8 @@ makeoptions MODULES_OVERRIDE="" options TICK_USE_YAMON_FREQ=defined #options TICK_USE_MALTA_RTC=defined +makeoptions KERNLOADADDR=0xffffffff80100000 + include "../malta/std.malta" hints "MALTA.hints" #Default places to look for devices. @@ -66,4 +68,5 @@ device ether device le device miibus device md +device bpf device uart Copied: projects/random_number_generator/sys/mips/conf/PICOSTATION_M2HP (from r255093, head/sys/mips/conf/PICOSTATION_M2HP) ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/random_number_generator/sys/mips/conf/PICOSTATION_M2HP Sat Aug 31 13:41:20 2013 (r255094, copy of r255093, head/sys/mips/conf/PICOSTATION_M2HP) @@ -0,0 +1,68 @@ +# +# Specific board setup for the Picostation M2 HP board. +# +# This board has the following hardware: +# +# + AR7241 CPU SoC +# + AR9287 Wifi +# + Integrated switch (XXX speed?) +# + 8MB flash +# + 32MB RAM +# + uboot environment + +# $FreeBSD$ + +include "AR724X_BASE" +ident "PICOSTATION_M2HP" +hints "PICOSTATION_M2HP.hints" + +options AR71XX_REALMEM=32*1024*1024 + +options AR71XX_ENV_UBOOT + +# Limit inlines +makeoptions INLINE_LIMIT=768 + +# We bite the performance overhead for now; the kernel won't +# fit if the mutexes are inlined. +options MUTEX_NOINLINE +options RWLOCK_NOINLINE +options SX_NOINLINE + +# There's no need to enable swapping on this platform. +options NO_SWAPPING + +# For DOS - enable if required +# options MSDOSFS + +# uncompress - to boot read-only lzma natively from flash +device geom_uncompress +options GEOM_UNCOMPRESS +options ROOTDEVNAME=\"ufs:/dev/map/rootfs.uncompress\" + +# Not enough space for these.. +nooptions INVARIANTS +nooptions INVARIANT_SUPPORT +nooptions WITNESS +nooptions WITNESS_SKIPSPIN +nooptions DEBUG_REDZONE +nooptions DEBUG_MEMGUARD + +# Used for the static uboot partition map +device geom_map + +# Options needed for the EEPROM based calibration/PCI configuration data. +options AR71XX_ATH_EEPROM # Fetch EEPROM/PCI config from flash +options ATH_EEPROM_FIRMWARE # Use EEPROM from flash +device firmware # Used by the above + +# Options required for miiproxy and mdiobus +options ARGE_MDIO # Export an MDIO bus separate from arge +device miiproxy # MDIO bus <-> MII PHY rendezvous + +device etherswitch +device arswitch + +# Enable GPIO +device gpio +device gpioled Copied: projects/random_number_generator/sys/mips/conf/PICOSTATION_M2HP.hints (from r255093, head/sys/mips/conf/PICOSTATION_M2HP.hints) ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/random_number_generator/sys/mips/conf/PICOSTATION_M2HP.hints Sat Aug 31 13:41:20 2013 (r255094, copy of r255093, head/sys/mips/conf/PICOSTATION_M2HP.hints) @@ -0,0 +1,103 @@ +# $FreeBSD$ + +# arge1 MDIO bus +hint.argemdio.0.at="nexus0" +hint.argemdio.0.maddr=0x1a000000 +hint.argemdio.0.msize=0x1000 +hint.argemdio.0.order=0 + +# Override MAC Address with the one on EEPROM +hint.arge.0.eeprommac=0x1fff0000 + +# arge0: dedicated switch port; RMII; dedicated PHY 4 on switch, connected +# via internal switch MDIO bus. +hint.arge.0.media=100 # Map to 100/full +hint.arge.0.fduplex=1 # +hint.arge.0.phymask=0x10 # PHY4 +hint.arge.0.mdio=mdioproxy1 # .. off of the switch mdiobus + +# arge1: nail to 1000/full, RMII - connected to the switch +hint.arge.1.media=1000 # Map to 1000/full +hint.arge.1.fduplex=1 # +hint.arge.1.phymask=0x0 # no directly mapped PHYs + +# +# AR7240 switch config +# +hint.arswitch.0.at="mdio0" +hint.arswitch.0.is_7240=1 # We need to be explicitly told this +hint.arswitch.0.numphys=4 # 4 active switch PHYs (PHY 0 -> 3) +hint.arswitch.0.phy4cpu=1 # Yes, PHY 4 == dedicated PHY +hint.arswitch.0.is_rgmii=0 # No, not RGMII +hint.arswitch.0.is_gmii=0 # No, not GMII + +# ath0 hint - pcie slot 0 +hint.pcib.0.bus.0.0.0.ath_fixup_addr=0x1fff1000 +hint.pcib.0.bus.0.0.0.ath_fixup_size=4096 + +# ath +hint.ath.0.eeprom_firmware="pcib.0.bus.0.0.0.eeprom_firmware" + +# GPIO pins +# Pin 0: red led (sig1) +# Pin 1: yellow led (sig2) +# Pin 11: green len (sig3) +# Pin 7: green len (sig4) +# Pin 12: Reset switch +hint.gpio.0.pinmask=0x1883 + +# Signal leds +hint.gpioled.0.at="gpiobus0" +hint.gpioled.0.name="sig1" +hint.gpioled.0.pins=0x0001 # pin 0 +hint.gpioled.1.at="gpiobus0" +hint.gpioled.1.name="sig2" +hint.gpioled.1.pins=0x0002 # pin 1 +hint.gpioled.2.at="gpiobus0" +hint.gpioled.2.name="sig3" +hint.gpioled.2.pins=0x0800 # pin 11 +hint.gpioled.3.at="gpiobus0" +hint.gpioled.3.name="sig4" +hint.gpioled.3.pins=0x0080 # pin 7 + +# GEOM_MAP +# +# Picostation M2 HP +# +# mtdparts=ar7240-nor0:256k(u-boot),64k(u-boot-env),1024k(kernel),6528k(rootfs),256k(cfg),64k(EEPROM) + +hint.map.0.at="flash/spi0" +hint.map.0.start=0x00000000 +hint.map.0.end=0x00040000 # 256k u-boot +hint.map.0.name="u-boot" +hint.map.0.readonly=1 + +hint.map.1.at="flash/spi0" +hint.map.1.start=0x00040000 +hint.map.1.end=0x00050000 # 64k u-boot-env +hint.map.1.name="u-boot-env" +hint.map.1.readonly=1 + +hint.map.2.at="flash/spi0" +hint.map.2.start=0x00050000 +hint.map.2.end=0x00130000 # 896k kernel +hint.map.2.name="kernel" +hint.map.2.readonly=1 + +hint.map.3.at="flash/spi0" +hint.map.3.start=0x130000 +hint.map.3.end=0x007b0000 # 6656k rootfs +hint.map.3.name="rootfs" +hint.map.3.readonly=0 + +hint.map.4.at="flash/spi0" +hint.map.4.start=0x007b0000 +hint.map.4.end=0x007f0000 # 256k cfg +hint.map.4.name="cfg" +hint.map.4.readonly=0 + +hint.map.5.at="flash/spi0" +hint.map.5.start=0x007f0000 +hint.map.5.end=0x00800000 # 64k EEPROM +hint.map.5.name="eeprom" +hint.map.5.readonly=1 Modified: projects/random_number_generator/sys/mips/malta/files.malta ============================================================================== --- projects/random_number_generator/sys/mips/malta/files.malta Sat Aug 31 08:56:33 2013 (r255093) +++ projects/random_number_generator/sys/mips/malta/files.malta Sat Aug 31 13:41:20 2013 (r255094) @@ -1,6 +1,7 @@ # $FreeBSD$ mips/malta/gt.c standard mips/malta/gt_pci.c standard +mips/malta/gt_pci_bus_space.c standard mips/malta/obio.c optional uart mips/malta/uart_cpu_maltausart.c optional uart mips/malta/uart_bus_maltausart.c optional uart Modified: projects/random_number_generator/sys/mips/malta/gt_pci.c ============================================================================== --- projects/random_number_generator/sys/mips/malta/gt_pci.c Sat Aug 31 08:56:33 2013 (r255093) +++ projects/random_number_generator/sys/mips/malta/gt_pci.c Sat Aug 31 13:41:20 2013 (r255094) @@ -75,6 +75,7 @@ __FBSDID("$FreeBSD$"); #include #include "pcib_if.h" +#include #define ICU_LEN 16 /* number of ISA IRQs */ @@ -635,7 +636,6 @@ gt_pci_alloc_resource(device_t bus, devi struct gt_pci_softc *sc = device_get_softc(bus); struct resource *rv = NULL; struct rman *rm; - bus_space_tag_t bt = 0; bus_space_handle_t bh = 0; switch (type) { @@ -644,12 +644,10 @@ gt_pci_alloc_resource(device_t bus, devi *** DIFF OUTPUT TRUNCATED AT 1000 LINES *** From owner-svn-src-projects@FreeBSD.ORG Sat Aug 31 16:57:00 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 62022F8F; Sat, 31 Aug 2013 16:57:00 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 404582AE1; Sat, 31 Aug 2013 16:57:00 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id r7VGv0KE097710; Sat, 31 Aug 2013 16:57:00 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id r7VGv0Cn097709; Sat, 31 Aug 2013 16:57:00 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201308311657.r7VGv0Cn097709@svn.freebsd.org> From: Alexander Motin Date: Sat, 31 Aug 2013 16:57:00 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r255101 - projects/camlock/sys/cam/ctl X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 31 Aug 2013 16:57:00 -0000 Author: mav Date: Sat Aug 31 16:56:59 2013 New Revision: 255101 URL: http://svnweb.freebsd.org/changeset/base/255101 Log: - Introduce new lock to protect list of target luns per bus, mentioned at r254254 commit message. - Remove unused sim variables. Modified: projects/camlock/sys/cam/ctl/scsi_ctl.c Modified: projects/camlock/sys/cam/ctl/scsi_ctl.c ============================================================================== --- projects/camlock/sys/cam/ctl/scsi_ctl.c Sat Aug 31 16:31:48 2013 (r255100) +++ projects/camlock/sys/cam/ctl/scsi_ctl.c Sat Aug 31 16:56:59 2013 (r255101) @@ -81,6 +81,7 @@ struct ctlfe_softc { path_id_t path_id; struct cam_sim *sim; char port_name[DEV_IDLEN]; + struct mtx lun_softc_mtx; STAILQ_HEAD(, ctlfe_lun_softc) lun_softc_list; STAILQ_ENTRY(ctlfe_softc) links; }; @@ -374,6 +375,8 @@ ctlfeasync(void *callback_arg, uint32_t bus_softc->path_id = cpi->ccb_h.path_id; bus_softc->sim = xpt_path_sim(path); + mtx_init(&bus_softc->lun_softc_mtx, "LUN softc mtx", NULL, + MTX_DEF); STAILQ_INIT(&bus_softc->lun_softc_list); fe = &bus_softc->fe; @@ -427,6 +430,7 @@ ctlfeasync(void *callback_arg, uint32_t if (retval != 0) { printf("%s: ctl_frontend_register() failed with " "error %d!\n", __func__, retval); + mtx_destroy(&bus_softc->lun_softc_mtx); free(bus_softc, M_CTLFE); break; } else { @@ -456,6 +460,7 @@ ctlfeasync(void *callback_arg, uint32_t * are no outstanding commands for this frontend? */ ctl_frontend_deregister(&softc->fe); + mtx_destroy(&softc->lun_softc_mtx); free(softc, M_CTLFE); } break; @@ -530,14 +535,12 @@ ctlferegister(struct cam_periph *periph, { struct ctlfe_softc *bus_softc; struct ctlfe_lun_softc *softc; - struct cam_sim *sim; union ccb en_lun_ccb; cam_status status; int i; softc = (struct ctlfe_lun_softc *)arg; bus_softc = softc->parent_softc; - sim = xpt_path_sim(periph->path); TAILQ_INIT(&softc->work_queue); softc->periph = periph; @@ -639,6 +642,7 @@ ctlfeoninvalidate(struct cam_periph *per { union ccb en_lun_ccb; cam_status status; + struct ctlfe_softc *bus_softc; struct ctlfe_lun_softc *softc; softc = (struct ctlfe_lun_softc *)periph->softc; @@ -661,21 +665,22 @@ ctlfeoninvalidate(struct cam_periph *per "INOTs outstanding, %d refs\n", softc->atios_sent - softc->atios_returned, softc->inots_sent - softc->inots_returned, periph->refcount); + + bus_softc = softc->parent_softc; + mtx_lock(&bus_softc->lun_softc_mtx); + STAILQ_REMOVE(&bus_softc->lun_softc_list, softc, ctlfe_lun_softc, links); + mtx_unlock(&bus_softc->lun_softc_mtx); } static void ctlfecleanup(struct cam_periph *periph) { struct ctlfe_lun_softc *softc; - struct ctlfe_softc *bus_softc; xpt_print(periph->path, "%s: Called\n", __func__); softc = (struct ctlfe_lun_softc *)periph->softc; - bus_softc = softc->parent_softc; - STAILQ_REMOVE(&bus_softc->lun_softc_list, softc, ctlfe_lun_softc, links); - /* * XXX KDM is there anything else that needs to be done here? */ @@ -1819,10 +1824,8 @@ ctlfe_online(void *arg) struct cam_path *path; cam_status status; struct ctlfe_lun_softc *lun_softc; - struct cam_sim *sim; bus_softc = (struct ctlfe_softc *)arg; - sim = bus_softc->sim; /* * Create the wildcard LUN before bringing the port online. @@ -1849,8 +1852,9 @@ ctlfe_online(void *arg) lun_softc->parent_softc = bus_softc; lun_softc->flags |= CTLFE_LUN_WILDCARD; + mtx_lock(&bus_softc->lun_softc_mtx); STAILQ_INSERT_TAIL(&bus_softc->lun_softc_list, lun_softc, links); - + mtx_unlock(&bus_softc->lun_softc_mtx); status = cam_periph_alloc(ctlferegister, ctlfeoninvalidate, @@ -1886,10 +1890,8 @@ ctlfe_offline(void *arg) struct cam_path *path; cam_status status; struct cam_periph *periph; - struct cam_sim *sim; bus_softc = (struct ctlfe_softc *)arg; - sim = bus_softc->sim; /* * Disable the wildcard LUN for this port now that we have taken @@ -1899,7 +1901,6 @@ ctlfe_offline(void *arg) bus_softc->path_id, CAM_TARGET_WILDCARD, CAM_LUN_WILDCARD); if (status != CAM_REQ_CMP) { - CAM_SIM_UNLOCK(sim); printf("%s: unable to create path for wildcard periph\n", __func__); return; @@ -1939,11 +1940,9 @@ ctlfe_lun_enable(void *arg, struct ctl_i struct ctlfe_lun_softc *softc; struct cam_path *path; struct cam_periph *periph; - struct cam_sim *sim; cam_status status; bus_softc = (struct ctlfe_softc *)arg; - sim = bus_softc->sim; status = xpt_create_path(&path, /*periph*/ NULL, bus_softc->path_id, @@ -1967,7 +1966,9 @@ ctlfe_lun_enable(void *arg, struct ctl_i } softc->parent_softc = bus_softc; + mtx_lock(&bus_softc->lun_softc_mtx); STAILQ_INSERT_TAIL(&bus_softc->lun_softc_list, softc, links); + mtx_unlock(&bus_softc->lun_softc_mtx); status = cam_periph_alloc(ctlferegister, ctlfeoninvalidate, @@ -1994,11 +1995,10 @@ ctlfe_lun_disable(void *arg, struct ctl_ { struct ctlfe_softc *softc; struct ctlfe_lun_softc *lun_softc; - struct cam_sim *sim; softc = (struct ctlfe_softc *)arg; - sim = softc->sim; + mtx_lock(&softc->lun_softc_mtx); STAILQ_FOREACH(lun_softc, &softc->lun_softc_list, links) { struct cam_path *path; @@ -2010,14 +2010,18 @@ ctlfe_lun_disable(void *arg, struct ctl_ } } if (lun_softc == NULL) { + mtx_unlock(&softc->lun_softc_mtx); printf("%s: can't find target %d lun %d\n", __func__, targ_id.id, lun_id); return (1); } + cam_periph_acquire(lun_softc->periph); + mtx_unlock(&softc->lun_softc_mtx); cam_periph_lock(lun_softc->periph); cam_periph_invalidate(lun_softc->periph); cam_periph_unlock(lun_softc->periph); + cam_periph_release(lun_softc->periph); return (0); } From owner-svn-src-projects@FreeBSD.ORG Sat Aug 31 17:22:48 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 03FDA5D4; Sat, 31 Aug 2013 17:22:48 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id E210B2C07; Sat, 31 Aug 2013 17:22:47 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id r7VHMle0013655; Sat, 31 Aug 2013 17:22:47 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id r7VHMitj013616; Sat, 31 Aug 2013 17:22:44 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201308311722.r7VHMitj013616@svn.freebsd.org> From: Alexander Motin Date: Sat, 31 Aug 2013 17:22:44 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r255102 - in projects/camlock: . bin/ps bin/sh cddl/contrib/opensolaris/tools/ctf/cvt cddl/lib/libdtrace cddl/lib/libzpool cddl/usr.bin/ztest cddl/usr.sbin/zdb contrib/gcc/config/arm co... X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 31 Aug 2013 17:22:48 -0000 Author: mav Date: Sat Aug 31 17:22:43 2013 New Revision: 255102 URL: http://svnweb.freebsd.org/changeset/base/255102 Log: MFC @ r255101 Added: projects/camlock/cddl/lib/libdtrace/ip.d - copied unchanged from r255101, head/cddl/lib/libdtrace/ip.d projects/camlock/cddl/lib/libdtrace/tcp.d - copied unchanged from r255101, head/cddl/lib/libdtrace/tcp.d projects/camlock/cddl/lib/libdtrace/udp.d - copied unchanged from r255101, head/cddl/lib/libdtrace/udp.d projects/camlock/etc/periodic/monthly/450.status-security - copied unchanged from r255101, head/etc/periodic/monthly/450.status-security projects/camlock/etc/periodic/weekly/450.status-security - copied unchanged from r255101, head/etc/periodic/weekly/450.status-security projects/camlock/share/man/man4/procdesc.4 - copied unchanged from r255101, head/share/man/man4/procdesc.4 projects/camlock/sys/contrib/dev/drm2/ - copied from r255101, head/sys/contrib/dev/drm2/ projects/camlock/sys/contrib/dev/iwn/iwlwifi-2000-18.168.6.1.fw.uu - copied unchanged from r255101, head/sys/contrib/dev/iwn/iwlwifi-2000-18.168.6.1.fw.uu projects/camlock/sys/dev/drm2/ati_pcigart.c - copied unchanged from r255101, head/sys/dev/drm2/ati_pcigart.c projects/camlock/sys/dev/drm2/drm_buffer.c - copied unchanged from r255101, head/sys/dev/drm2/drm_buffer.c projects/camlock/sys/dev/drm2/drm_buffer.h - copied unchanged from r255101, head/sys/dev/drm2/drm_buffer.h projects/camlock/sys/dev/drm2/drm_core.h - copied unchanged from r255101, head/sys/dev/drm2/drm_core.h projects/camlock/sys/dev/drm2/drm_dp_helper.c - copied unchanged from r255101, head/sys/dev/drm2/drm_dp_helper.c projects/camlock/sys/dev/drm2/drm_fixed.h - copied unchanged from r255101, head/sys/dev/drm2/drm_fixed.h projects/camlock/sys/dev/drm2/drm_os_freebsd.h - copied unchanged from r255101, head/sys/dev/drm2/drm_os_freebsd.h projects/camlock/sys/dev/drm2/radeon/ - copied from r255101, head/sys/dev/drm2/radeon/ projects/camlock/sys/dev/xen/timer/ - copied from r255101, head/sys/dev/xen/timer/ projects/camlock/sys/mips/conf/PICOSTATION_M2HP - copied unchanged from r255101, head/sys/mips/conf/PICOSTATION_M2HP projects/camlock/sys/mips/conf/PICOSTATION_M2HP.hints - copied unchanged from r255101, head/sys/mips/conf/PICOSTATION_M2HP.hints projects/camlock/sys/mips/malta/gt_pci_bus_space.c - copied unchanged from r255101, head/sys/mips/malta/gt_pci_bus_space.c projects/camlock/sys/mips/malta/gt_pci_bus_space.h - copied unchanged from r255101, head/sys/mips/malta/gt_pci_bus_space.h projects/camlock/sys/modules/drm2/radeonkms/ - copied from r255101, head/sys/modules/drm2/radeonkms/ projects/camlock/sys/modules/drm2/radeonkmsfw/ - copied from r255101, head/sys/modules/drm2/radeonkmsfw/ projects/camlock/sys/modules/iwnfw/iwn2000/ - copied from r255101, head/sys/modules/iwnfw/iwn2000/ projects/camlock/sys/netinet/in_kdtrace.c - copied unchanged from r255101, head/sys/netinet/in_kdtrace.c projects/camlock/sys/netinet/in_kdtrace.h - copied unchanged from r255101, head/sys/netinet/in_kdtrace.h projects/camlock/sys/sys/_unrhdr.h - copied unchanged from r255101, head/sys/sys/_unrhdr.h projects/camlock/sys/x86/xen/ - copied from r255101, head/sys/x86/xen/ projects/camlock/sys/xen/evtchn/evtchnvar.h - copied unchanged from r255101, head/sys/xen/evtchn/evtchnvar.h projects/camlock/sys/xen/xen-os.h - copied unchanged from r255101, head/sys/xen/xen-os.h projects/camlock/tools/build/options/WITHOUT_ICONV - copied unchanged from r255101, head/tools/build/options/WITHOUT_ICONV projects/camlock/tools/build/options/WITH_LIBICONV_COMPAT - copied unchanged from r255101, head/tools/build/options/WITH_LIBICONV_COMPAT projects/camlock/tools/build/options/WITH_USB_GADGET_EXAMPLES - copied unchanged from r255101, head/tools/build/options/WITH_USB_GADGET_EXAMPLES projects/camlock/tools/regression/bin/sh/builtins/alias4.0 - copied unchanged from r255101, head/tools/regression/bin/sh/builtins/alias4.0 projects/camlock/tools/regression/bin/sh/builtins/type3.0 - copied unchanged from r255101, head/tools/regression/bin/sh/builtins/type3.0 projects/camlock/tools/regression/bin/sh/expansion/arith13.0 - copied unchanged from r255101, head/tools/regression/bin/sh/expansion/arith13.0 projects/camlock/tools/regression/bin/sh/parser/empty-cmd1.0 - copied unchanged from r255101, head/tools/regression/bin/sh/parser/empty-cmd1.0 projects/camlock/tools/regression/file/fcntlflags/ - copied from r255101, head/tools/regression/file/fcntlflags/ projects/camlock/tools/tools/drm/ - copied from r255101, head/tools/tools/drm/ Deleted: projects/camlock/sys/dev/xen/xenpci/evtchn.c projects/camlock/sys/i386/include/xen/xen_clock_util.h projects/camlock/sys/i386/xen/xen_clock_util.c projects/camlock/sys/i386/xen/xen_rtc.c projects/camlock/sys/xen/evtchn/evtchn.c projects/camlock/tools/build/options/WITH_BSDCONFIG projects/camlock/tools/build/options/WITH_GNU_PATCH projects/camlock/tools/build/options/WITH_ICONV Modified: projects/camlock/Makefile.inc1 projects/camlock/ObsoleteFiles.inc projects/camlock/UPDATING projects/camlock/bin/ps/keyword.c projects/camlock/bin/ps/ps.1 projects/camlock/bin/sh/alias.c projects/camlock/bin/sh/arith_yylex.c projects/camlock/bin/sh/exec.c projects/camlock/bin/sh/parser.c projects/camlock/bin/sh/parser.h projects/camlock/cddl/contrib/opensolaris/tools/ctf/cvt/dwarf.c projects/camlock/cddl/lib/libdtrace/Makefile projects/camlock/cddl/lib/libzpool/Makefile projects/camlock/cddl/usr.bin/ztest/Makefile projects/camlock/cddl/usr.sbin/zdb/Makefile projects/camlock/contrib/gcc/config/arm/libunwind.S projects/camlock/contrib/gcc/config/arm/unwind-arm.c projects/camlock/contrib/gcc/config/arm/unwind-arm.h projects/camlock/contrib/libcxxrt/exception.cc projects/camlock/contrib/libexecinfo/backtrace.3 projects/camlock/contrib/libexecinfo/backtrace.c projects/camlock/contrib/libexecinfo/symtab.c projects/camlock/contrib/llvm/include/llvm/MC/MCInstPrinter.h projects/camlock/contrib/llvm/lib/MC/MCInstPrinter.cpp projects/camlock/contrib/llvm/lib/Target/X86/InstPrinter/X86ATTInstPrinter.cpp projects/camlock/contrib/llvm/lib/Target/X86/InstPrinter/X86IntelInstPrinter.cpp projects/camlock/contrib/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp projects/camlock/contrib/llvm/tools/lldb/source/Expression/IRForTarget.cpp projects/camlock/contrib/llvm/tools/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp projects/camlock/contrib/llvm/tools/lldb/source/lldb.cpp projects/camlock/contrib/pam_modules/pam_passwdqc/pam_passwdqc.c projects/camlock/etc/defaults/periodic.conf projects/camlock/etc/mtree/BSD.usr.dist projects/camlock/etc/periodic/monthly/Makefile projects/camlock/etc/periodic/security/100.chksetuid projects/camlock/etc/periodic/security/110.neggrpperm projects/camlock/etc/periodic/security/200.chkmounts projects/camlock/etc/periodic/security/300.chkuid0 projects/camlock/etc/periodic/security/400.passwdless projects/camlock/etc/periodic/security/410.logincheck projects/camlock/etc/periodic/security/460.chkportsum projects/camlock/etc/periodic/security/500.ipfwdenied projects/camlock/etc/periodic/security/510.ipfdenied projects/camlock/etc/periodic/security/520.pfdenied projects/camlock/etc/periodic/security/550.ipfwlimit projects/camlock/etc/periodic/security/610.ipf6denied projects/camlock/etc/periodic/security/700.kernelmsg projects/camlock/etc/periodic/security/800.loginfail projects/camlock/etc/periodic/security/900.tcpwrap projects/camlock/etc/periodic/security/security.functions projects/camlock/etc/periodic/weekly/Makefile projects/camlock/etc/rc.d/savecore projects/camlock/gnu/usr.bin/patch/Makefile projects/camlock/lib/libc/gen/wordexp.c projects/camlock/lib/libc/sys/pdfork.2 projects/camlock/lib/libcompiler_rt/Makefile projects/camlock/lib/libpam/modules/pam_passwdqc/Makefile projects/camlock/lib/libutil/expand_number.c projects/camlock/lib/libutil/login_auth.c projects/camlock/lib/libutil/login_cap.c projects/camlock/lib/libutil/pidfile.c projects/camlock/lib/libutil/quotafile.c projects/camlock/lib/libutil/uucplock.c projects/camlock/lib/msun/src/s_erf.c projects/camlock/lib/msun/src/s_erff.c projects/camlock/release/scripts/mm-mtree.sh projects/camlock/sbin/camcontrol/camcontrol.c projects/camlock/sbin/etherswitchcfg/etherswitchcfg.8 projects/camlock/share/man/man4/Makefile projects/camlock/share/man/man4/capsicum.4 projects/camlock/share/man/man4/cd.4 projects/camlock/share/man/man4/sysmouse.4 projects/camlock/share/man/man4/vmx.4 projects/camlock/share/man/man5/periodic.conf.5 projects/camlock/share/man/man5/src.conf.5 projects/camlock/share/man/man9/EVENTHANDLER.9 projects/camlock/share/man/man9/Makefile projects/camlock/share/man/man9/pfil.9 projects/camlock/share/man/man9/timeout.9 projects/camlock/share/misc/committers-src.dot projects/camlock/share/mk/bsd.own.mk projects/camlock/share/mk/sys.mk projects/camlock/sys/amd64/amd64/apic_vector.S projects/camlock/sys/amd64/amd64/cpu_switch.S projects/camlock/sys/amd64/amd64/genassym.c projects/camlock/sys/amd64/amd64/machdep.c projects/camlock/sys/amd64/amd64/mp_machdep.c projects/camlock/sys/amd64/amd64/pmap.c projects/camlock/sys/amd64/amd64/vm_machdep.c projects/camlock/sys/amd64/include/apicvar.h projects/camlock/sys/amd64/include/cpufunc.h projects/camlock/sys/amd64/include/intr_machdep.h projects/camlock/sys/amd64/include/pcpu.h projects/camlock/sys/amd64/include/pmap.h projects/camlock/sys/amd64/include/smp.h projects/camlock/sys/amd64/include/xen/hypercall.h projects/camlock/sys/amd64/include/xen/xen-os.h projects/camlock/sys/amd64/vmm/vmm_instruction_emul.c projects/camlock/sys/arm/arm/irq_dispatch.S projects/camlock/sys/arm/arm/machdep.c projects/camlock/sys/arm/arm/pmap-v6.c projects/camlock/sys/arm/arm/pmap.c projects/camlock/sys/arm/arm/stdatomic.c projects/camlock/sys/arm/arm/swtch.S projects/camlock/sys/arm/conf/VERSATILEPB projects/camlock/sys/arm/include/param.h projects/camlock/sys/arm/include/pmap.h projects/camlock/sys/arm/include/pte.h projects/camlock/sys/arm/include/vmparam.h projects/camlock/sys/boot/forth/beastie.4th projects/camlock/sys/boot/forth/version.4th projects/camlock/sys/boot/forth/version.4th.8 projects/camlock/sys/cam/scsi/scsi_all.c projects/camlock/sys/cam/scsi/scsi_ch.c projects/camlock/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c projects/camlock/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c projects/camlock/sys/cddl/dev/dtrace/dtrace_load.c projects/camlock/sys/cddl/dev/dtrace/dtrace_unload.c projects/camlock/sys/cddl/dev/dtrace/powerpc/dtrace_isa.c projects/camlock/sys/cddl/dev/dtrace/powerpc/dtrace_subr.c projects/camlock/sys/cddl/dev/fbt/fbt_powerpc.c projects/camlock/sys/cddl/dev/sdt/sdt.c projects/camlock/sys/compat/freebsd32/freebsd32.h projects/camlock/sys/compat/ndis/kern_ndis.c projects/camlock/sys/compat/ndis/ndis_var.h projects/camlock/sys/conf/Makefile.amd64 projects/camlock/sys/conf/files projects/camlock/sys/conf/files.amd64 projects/camlock/sys/conf/files.i386 projects/camlock/sys/dev/acpica/acpi_thermal.c projects/camlock/sys/dev/ahci/ahci.c projects/camlock/sys/dev/amdtemp/amdtemp.c projects/camlock/sys/dev/ath/if_ath.c projects/camlock/sys/dev/cas/if_cas.c projects/camlock/sys/dev/cxgb/cxgb_sge.c projects/camlock/sys/dev/cxgbe/adapter.h projects/camlock/sys/dev/cxgbe/offload.h projects/camlock/sys/dev/cxgbe/osdep.h projects/camlock/sys/dev/cxgbe/t4_main.c projects/camlock/sys/dev/cxgbe/t4_sge.c projects/camlock/sys/dev/cxgbe/t4_tracer.c projects/camlock/sys/dev/cxgbe/tom/t4_cpl_io.c projects/camlock/sys/dev/cxgbe/tom/t4_tom.c projects/camlock/sys/dev/drm2/drmP.h projects/camlock/sys/dev/drm2/drm_atomic.h projects/camlock/sys/dev/drm2/drm_context.c projects/camlock/sys/dev/drm2/drm_crtc.c projects/camlock/sys/dev/drm2/drm_crtc.h projects/camlock/sys/dev/drm2/drm_crtc_helper.h projects/camlock/sys/dev/drm2/drm_dp_helper.h projects/camlock/sys/dev/drm2/drm_dp_iic_helper.c projects/camlock/sys/dev/drm2/drm_drv.c projects/camlock/sys/dev/drm2/drm_edid.c projects/camlock/sys/dev/drm2/drm_gem.c projects/camlock/sys/dev/drm2/drm_gem_names.c projects/camlock/sys/dev/drm2/drm_ioctl.c projects/camlock/sys/dev/drm2/drm_irq.c projects/camlock/sys/dev/drm2/drm_linux_list.h projects/camlock/sys/dev/drm2/drm_pci.c projects/camlock/sys/dev/drm2/drm_pciids.h projects/camlock/sys/dev/drm2/drm_sysctl.c projects/camlock/sys/dev/drm2/i915/i915_gem.c projects/camlock/sys/dev/drm2/i915/i915_gem_execbuffer.c projects/camlock/sys/dev/drm2/i915/intel_crt.c projects/camlock/sys/dev/drm2/i915/intel_display.c projects/camlock/sys/dev/drm2/i915/intel_dp.c projects/camlock/sys/dev/drm2/i915/intel_drv.h projects/camlock/sys/dev/drm2/i915/intel_hdmi.c projects/camlock/sys/dev/drm2/i915/intel_lvds.c projects/camlock/sys/dev/drm2/i915/intel_panel.c projects/camlock/sys/dev/drm2/i915/intel_sdvo.c projects/camlock/sys/dev/drm2/i915/intel_tv.c projects/camlock/sys/dev/drm2/ttm/ttm_bo.c projects/camlock/sys/dev/drm2/ttm/ttm_bo_driver.h projects/camlock/sys/dev/drm2/ttm/ttm_bo_util.c projects/camlock/sys/dev/drm2/ttm/ttm_bo_vm.c projects/camlock/sys/dev/drm2/ttm/ttm_execbuf_util.c projects/camlock/sys/dev/drm2/ttm/ttm_page_alloc.c projects/camlock/sys/dev/drm2/ttm/ttm_tt.c projects/camlock/sys/dev/e1000/if_igb.c projects/camlock/sys/dev/fb/vesa.c projects/camlock/sys/dev/fdc/fdc.c projects/camlock/sys/dev/flash/mx25l.c projects/camlock/sys/dev/gpio/gpiobus.c projects/camlock/sys/dev/hatm/if_hatm_intr.c projects/camlock/sys/dev/hwpmc/hwpmc_core.c projects/camlock/sys/dev/hwpmc/hwpmc_mod.c projects/camlock/sys/dev/hwpmc/pmc_events.h projects/camlock/sys/dev/if_ndis/if_ndis.c projects/camlock/sys/dev/iscsi_initiator/isc_soc.c projects/camlock/sys/dev/iwn/if_iwn.c projects/camlock/sys/dev/ixgbe/ixgbe.c projects/camlock/sys/dev/ixgbe/ixv.c projects/camlock/sys/dev/jme/if_jme.c projects/camlock/sys/dev/lge/if_lge.c projects/camlock/sys/dev/md/md.c projects/camlock/sys/dev/mwl/if_mwl.c projects/camlock/sys/dev/nfe/if_nfe.c projects/camlock/sys/dev/patm/if_patm.c projects/camlock/sys/dev/patm/if_patm_tx.c projects/camlock/sys/dev/pci/pcivar.h projects/camlock/sys/dev/pci/vga_pci.c projects/camlock/sys/dev/qlxgb/qla_hw.c projects/camlock/sys/dev/qlxgbe/ql_misc.c projects/camlock/sys/dev/qlxgbe/ql_os.c projects/camlock/sys/dev/sfxge/sfxge_rx.c projects/camlock/sys/dev/uart/uart_dev_ns8250.c projects/camlock/sys/dev/usb/controller/dwc_otg.c projects/camlock/sys/dev/usb/controller/musb_otg.c projects/camlock/sys/dev/usb/usbdevs projects/camlock/sys/dev/vmware/vmxnet3/if_vmx.c projects/camlock/sys/dev/vmware/vmxnet3/if_vmxvar.h projects/camlock/sys/dev/wb/if_wb.c projects/camlock/sys/dev/xen/balloon/balloon.c projects/camlock/sys/dev/xen/blkback/blkback.c projects/camlock/sys/dev/xen/blkfront/blkfront.c projects/camlock/sys/dev/xen/blkfront/block.h projects/camlock/sys/dev/xen/console/console.c projects/camlock/sys/dev/xen/console/xencons_ring.c projects/camlock/sys/dev/xen/control/control.c projects/camlock/sys/dev/xen/netback/netback.c projects/camlock/sys/dev/xen/netfront/netfront.c projects/camlock/sys/dev/xen/xenpci/xenpci.c projects/camlock/sys/dev/xen/xenpci/xenpcivar.h projects/camlock/sys/fs/nfs/nfs.h projects/camlock/sys/fs/tmpfs/tmpfs_subr.c projects/camlock/sys/i386/i386/apic_vector.s projects/camlock/sys/i386/i386/machdep.c projects/camlock/sys/i386/i386/mp_machdep.c projects/camlock/sys/i386/i386/pmap.c projects/camlock/sys/i386/include/apicvar.h projects/camlock/sys/i386/include/intr_machdep.h projects/camlock/sys/i386/include/pcpu.h projects/camlock/sys/i386/include/pmap.h projects/camlock/sys/i386/include/xen/xen-os.h projects/camlock/sys/i386/include/xen/xenfunc.h projects/camlock/sys/i386/include/xen/xenvar.h projects/camlock/sys/i386/isa/npx.c projects/camlock/sys/i386/xen/clock.c projects/camlock/sys/i386/xen/exception.s projects/camlock/sys/i386/xen/mp_machdep.c projects/camlock/sys/i386/xen/mptable.c projects/camlock/sys/i386/xen/pmap.c projects/camlock/sys/i386/xen/xen_machdep.c projects/camlock/sys/ia64/ia64/pmap.c projects/camlock/sys/kern/kern_event.c projects/camlock/sys/kern/kern_linker.c projects/camlock/sys/kern/kern_mbuf.c projects/camlock/sys/kern/kern_physio.c projects/camlock/sys/kern/kern_proc.c projects/camlock/sys/kern/kern_synch.c projects/camlock/sys/kern/link_elf.c projects/camlock/sys/kern/subr_mbpool.c projects/camlock/sys/kern/subr_unit.c projects/camlock/sys/kern/uipc_cow.c projects/camlock/sys/kern/uipc_mbuf.c projects/camlock/sys/kern/uipc_socket.c projects/camlock/sys/kern/uipc_syscalls.c projects/camlock/sys/kern/vfs_cluster.c projects/camlock/sys/mips/atheros/ar71xx_spi.c projects/camlock/sys/mips/atheros/if_arge.c projects/camlock/sys/mips/conf/MALTA projects/camlock/sys/mips/conf/MALTA64 projects/camlock/sys/mips/conf/ROUTERSTATION.hints projects/camlock/sys/mips/malta/files.malta projects/camlock/sys/mips/malta/gt_pci.c projects/camlock/sys/mips/malta/malta_machdep.c projects/camlock/sys/mips/malta/yamon.c projects/camlock/sys/mips/mips/pmap.c projects/camlock/sys/modules/drm2/Makefile projects/camlock/sys/modules/drm2/drm2/Makefile projects/camlock/sys/modules/ip6_mroute_mod/Makefile projects/camlock/sys/modules/linux/Makefile projects/camlock/sys/modules/vmware/vmxnet3/Makefile projects/camlock/sys/net/if.h projects/camlock/sys/net/if_fddisubr.c projects/camlock/sys/net/if_iso88025subr.c projects/camlock/sys/net/if_lagg.c projects/camlock/sys/net/if_lagg.h projects/camlock/sys/net/if_llatbl.h projects/camlock/sys/net/if_pfsync.h projects/camlock/sys/net80211/ieee80211_output.c projects/camlock/sys/net80211/ieee80211_proto.h projects/camlock/sys/net80211/ieee80211_superg.c projects/camlock/sys/netgraph/bluetooth/drivers/ubt/ng_ubt.c projects/camlock/sys/netinet/icmp_var.h projects/camlock/sys/netinet/igmp.c projects/camlock/sys/netinet/igmp_var.h projects/camlock/sys/netinet/in.h projects/camlock/sys/netinet/ip_fastfwd.c projects/camlock/sys/netinet/ip_input.c projects/camlock/sys/netinet/ip_output.c projects/camlock/sys/netinet/pim_var.h projects/camlock/sys/netinet/sctp_input.c projects/camlock/sys/netinet/tcp_input.c projects/camlock/sys/netinet/tcp_lro.c projects/camlock/sys/netinet/tcp_lro.h projects/camlock/sys/netinet/tcp_output.c projects/camlock/sys/netinet/tcp_subr.c projects/camlock/sys/netinet/tcp_syncache.c projects/camlock/sys/netinet/tcp_usrreq.c projects/camlock/sys/netinet/tcp_var.h projects/camlock/sys/netinet/udp_usrreq.c projects/camlock/sys/netinet/udp_var.h projects/camlock/sys/netinet6/ip6_input.c projects/camlock/sys/netinet6/ip6_mroute.c projects/camlock/sys/netinet6/ip6_output.c projects/camlock/sys/netinet6/mld6.c projects/camlock/sys/netinet6/nd6.c projects/camlock/sys/netinet6/pim6_var.h projects/camlock/sys/netinet6/sctp6_usrreq.c projects/camlock/sys/netinet6/send.c projects/camlock/sys/netinet6/udp6_usrreq.c projects/camlock/sys/netipsec/ipsec.h projects/camlock/sys/netipsec/key_var.h projects/camlock/sys/ofed/drivers/net/mlx4/en_frag.c projects/camlock/sys/powerpc/powermac/atibl.c projects/camlock/sys/powerpc/powermac/nvbl.c projects/camlock/sys/powerpc/powerpc/mmu_if.m projects/camlock/sys/powerpc/powerpc/pmap_dispatch.c projects/camlock/sys/sparc64/sparc64/pmap.c projects/camlock/sys/sys/bitset.h projects/camlock/sys/sys/cpuset.h projects/camlock/sys/sys/eventhandler.h projects/camlock/sys/sys/fcntl.h projects/camlock/sys/sys/kernel.h projects/camlock/sys/sys/mbpool.h projects/camlock/sys/sys/mbuf.h projects/camlock/sys/sys/param.h projects/camlock/sys/sys/pmckern.h projects/camlock/sys/sys/sf_buf.h projects/camlock/sys/sys/socket.h projects/camlock/sys/sys/sysctl.h projects/camlock/sys/sys/systm.h projects/camlock/sys/sys/user.h projects/camlock/sys/ufs/ffs/ffs_alloc.c projects/camlock/sys/ufs/ufs/ufs_dirhash.c projects/camlock/sys/vm/pmap.h projects/camlock/sys/vm/uma_core.c projects/camlock/sys/vm/vm_map.c projects/camlock/sys/vm/vm_page.c projects/camlock/sys/x86/include/segments.h projects/camlock/sys/x86/x86/local_apic.c projects/camlock/sys/xen/evtchn.h projects/camlock/sys/xen/evtchn/evtchn_dev.c projects/camlock/sys/xen/features.c projects/camlock/sys/xen/gnttab.c projects/camlock/sys/xen/gnttab.h projects/camlock/sys/xen/hvm.h projects/camlock/sys/xen/interface/event_channel.h projects/camlock/sys/xen/xen_intr.h projects/camlock/sys/xen/xenbus/xenbus.c projects/camlock/sys/xen/xenbus/xenbus_if.m projects/camlock/sys/xen/xenbus/xenbusb_front.c projects/camlock/sys/xen/xenbus/xenbusvar.h projects/camlock/sys/xen/xenstore/xenstore.c projects/camlock/sys/xen/xenstore/xenstore_dev.c projects/camlock/sys/xen/xenstore/xenstorevar.h projects/camlock/tools/tools/README projects/camlock/usr.bin/brandelf/brandelf.1 projects/camlock/usr.bin/dig/Makefile projects/camlock/usr.bin/host/Makefile projects/camlock/usr.bin/kdump/kdump.c projects/camlock/usr.bin/kdump/mksubr projects/camlock/usr.bin/nslookup/Makefile projects/camlock/usr.bin/patch/Makefile projects/camlock/usr.sbin/bhyve/pci_emul.c projects/camlock/usr.sbin/bhyve/pci_virtio_block.c projects/camlock/usr.sbin/crashinfo/crashinfo.sh projects/camlock/usr.sbin/mfiutil/mfi_drive.c projects/camlock/usr.sbin/mfiutil/mfiutil.8 projects/camlock/usr.sbin/mfiutil/mfiutil.c projects/camlock/usr.sbin/periodic/periodic.sh projects/camlock/usr.sbin/rtadvd/config.c Directory Properties: projects/camlock/ (props changed) projects/camlock/cddl/ (props changed) projects/camlock/cddl/contrib/opensolaris/ (props changed) projects/camlock/contrib/gcc/ (props changed) projects/camlock/contrib/libcxxrt/ (props changed) projects/camlock/contrib/libexecinfo/ (props changed) projects/camlock/contrib/llvm/ (props changed) projects/camlock/lib/libc/ (props changed) projects/camlock/lib/libutil/ (props changed) projects/camlock/sbin/ (props changed) projects/camlock/share/man/man4/ (props changed) projects/camlock/sys/ (props changed) projects/camlock/sys/amd64/include/xen/ (props changed) projects/camlock/sys/amd64/vmm/ (props changed) projects/camlock/sys/boot/ (props changed) projects/camlock/sys/cddl/contrib/opensolaris/ (props changed) projects/camlock/sys/conf/ (props changed) projects/camlock/usr.sbin/bhyve/ (props changed) projects/camlock/usr.sbin/rtadvd/ (props changed) Modified: projects/camlock/Makefile.inc1 ============================================================================== --- projects/camlock/Makefile.inc1 Sat Aug 31 16:56:59 2013 (r255101) +++ projects/camlock/Makefile.inc1 Sat Aug 31 17:22:43 2013 (r255102) @@ -265,7 +265,7 @@ WMAKEENV= ${CROSSENV} \ PATH=${TMPPATH} # make hierarchy -HMAKE= PATH=${TMPPATH} ${MAKE} LOCAL_MTREE=${LOCAL_MTREE} +HMAKE= PATH=${TMPPATH} ${MAKE} LOCAL_MTREE=${LOCAL_MTREE:Q} .if defined(NO_ROOT) HMAKE+= PATH=${TMPPATH} METALOG=${METALOG} -DNO_ROOT .endif @@ -814,7 +814,7 @@ distributeworld installworld: installche cd ${.CURDIR}/etc; ${CROSSENV} PATH=${TMPPATH} ${MAKE} \ METALOG=${METALOG} ${IMAKE_INSTALL} ${IMAKE_MTREE} \ DISTBASE=/base DESTDIR=${DESTDIR}/${DISTDIR}/base \ - LOCAL_MTREE=${LOCAL_MTREE} distrib-dirs + LOCAL_MTREE=${LOCAL_MTREE:Q} distrib-dirs .endif ${_+_}cd ${.CURDIR}; ${IMAKE} re${.TARGET:S/world$//}; \ ${IMAKEENV} rm -rf ${INSTALLTMP} @@ -888,7 +888,7 @@ reinstall: @echo ">>> Making hierarchy" @echo "--------------------------------------------------------------" ${_+_}cd ${.CURDIR}; ${MAKE} -f Makefile.inc1 \ - LOCAL_MTREE=${LOCAL_MTREE} hierarchy + LOCAL_MTREE=${LOCAL_MTREE:Q} hierarchy @echo @echo "--------------------------------------------------------------" @echo ">>> Installing everything" Modified: projects/camlock/ObsoleteFiles.inc ============================================================================== --- projects/camlock/ObsoleteFiles.inc Sat Aug 31 16:56:59 2013 (r255101) +++ projects/camlock/ObsoleteFiles.inc Sat Aug 31 17:22:43 2013 (r255102) @@ -38,6 +38,17 @@ # xargs -n1 | sort | uniq -d; # done +# 20130829: bsdpatch is patch unconditionally +OLD_FILES+=usr/bin/bsdpatch +OLD_FILES+=usr/share/man/man1/bsdpatch.1.gz +# 20130822: bind 9.9.3-P2 import +OLD_LIBS+=usr/lib/liblwres.so.80 +# 20130814: vm_page_busy(9) +OLD_FILES+=usr/share/man/man9/vm_page_flash.9.gz +OLD_FILES+=usr/share/man/man9/vm_page_io.9.gz +OLD_FILES+=usr/share/man/man9/vm_page_io_finish.9.gz +OLD_FILES+=usr/share/man/man9/vm_page_io_start.9.gz +OLD_FILES+=usr/share/man/man9/vm_page_wakeup.9.gz # 20130710: libkvm version bump OLD_LIBS+=lib/libkvm.so.5 OLD_LIBS+=usr/lib32/libkvm.so.5 @@ -114,6 +125,7 @@ OLD_FILES+=usr/include/clang/3.2/xmmintr OLD_FILES+=usr/include/clang/3.2/xopintrin.h OLD_DIRS+=usr/include/clang/3.2 # 20130404: legacy ATA stack removed +OLD_FILES+=etc/periodic/daily/405.status-ata-raid OLD_FILES+=rescue/atacontrol OLD_FILES+=sbin/atacontrol OLD_FILES+=usr/share/man/man8/atacontrol.8.gz Modified: projects/camlock/UPDATING ============================================================================== --- projects/camlock/UPDATING Sat Aug 31 16:56:59 2013 (r255101) +++ projects/camlock/UPDATING Sat Aug 31 17:22:43 2013 (r255102) @@ -31,6 +31,19 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 10 disable the most expensive debugging functionality run "ln -s 'abort:false,junk:false' /etc/malloc.conf".) +20130827: + Thomas Dickey (vendor author thereof) reports that dialog(1) since + 2011/10/18 has a bug in handling --hline. Testers and I noticed the + --hline is not ignored but displayed as a NULL string, regardless of + value. This will cause confusion in some bsdconfig dialogs where the + --hline is used to inform users which keybindings to use. This will + likewise affect any other persons relying on --hline. It also looks + rather strange seeing "[]" at the bottom of dialog(1) widgets when + passing --hline "anything". Thomas said he will have a look in a few + weeks. NOTE: The "[]" brackets appear with the left-edge where it + would normally appear given the width of text to display, but the + displayed text is not there (part of the bug). + 20130821: The PADLOCK_RNG and RDRAND_RNG kernel options are now devices. Thus "device padlock_rng" and "device rdrand_rng" should be Modified: projects/camlock/bin/ps/keyword.c ============================================================================== --- projects/camlock/bin/ps/keyword.c Sat Aug 31 16:56:59 2013 (r255101) +++ projects/camlock/bin/ps/keyword.c Sat Aug 31 17:22:43 2013 (r255102) @@ -87,6 +87,7 @@ static VAR var[] = { {"etimes", "ELAPSED", NULL, USER, elapseds, 0, CHAR, NULL, 0}, {"euid", "", "uid", 0, NULL, 0, CHAR, NULL, 0}, {"f", "F", NULL, 0, kvar, KOFF(ki_flag), INT, "x", 0}, + {"fib", "FIB", NULL, 0, kvar, KOFF(ki_fibnum), INT, "d", 0}, {"flags", "", "f", 0, NULL, 0, CHAR, NULL, 0}, {"gid", "GID", NULL, 0, kvar, KOFF(ki_groups), UINT, UIDFMT, 0}, {"group", "GROUP", NULL, LJUST, egroupname, 0, CHAR, NULL, 0}, Modified: projects/camlock/bin/ps/ps.1 ============================================================================== --- projects/camlock/bin/ps/ps.1 Sat Aug 31 16:56:59 2013 (r255101) +++ projects/camlock/bin/ps/ps.1 Sat Aug 31 17:22:43 2013 (r255102) @@ -512,6 +512,9 @@ elapsed running time, format minutes:seconds. .It Cm etimes elapsed running time, in decimal integer seconds +.It Cm fib +default FIB number, see +.Xr setfib 1 .It Cm flags the process flags, in hexadecimal (alias .Cm f ) Modified: projects/camlock/bin/sh/alias.c ============================================================================== --- projects/camlock/bin/sh/alias.c Sat Aug 31 16:56:59 2013 (r255101) +++ projects/camlock/bin/sh/alias.c Sat Aug 31 17:22:43 2013 (r255102) @@ -237,17 +237,19 @@ printaliases(void) } int -aliascmd(int argc, char **argv) +aliascmd(int argc __unused, char **argv __unused) { char *n, *v; int ret = 0; struct alias *ap; - if (argc == 1) { + nextopt(""); + + if (*argptr == NULL) { printaliases(); return (0); } - while ((n = *++argv) != NULL) { + while ((n = *argptr++) != NULL) { if ((v = strchr(n+1, '=')) == NULL) /* n+1: funny ksh stuff */ if ((ap = lookupalias(n, 0)) == NULL) { warning("%s: not found", n); Modified: projects/camlock/bin/sh/arith_yylex.c ============================================================================== --- projects/camlock/bin/sh/arith_yylex.c Sat Aug 31 16:56:59 2013 (r255101) +++ projects/camlock/bin/sh/arith_yylex.c Sat Aug 31 17:22:43 2013 (r255102) @@ -218,9 +218,13 @@ checkeqcur: value += ARITH_REM - '%'; goto checkeq; case '+': + if (buf[1] == '+') + return ARITH_BAD; value += ARITH_ADD - '+'; goto checkeq; case '-': + if (buf[1] == '-') + return ARITH_BAD; value += ARITH_SUB - '-'; goto checkeq; case '~': Modified: projects/camlock/bin/sh/exec.c ============================================================================== --- projects/camlock/bin/sh/exec.c Sat Aug 31 16:56:59 2013 (r255101) +++ projects/camlock/bin/sh/exec.c Sat Aug 31 17:22:43 2013 (r255102) @@ -762,5 +762,7 @@ typecmd_impl(int argc, char **argv, int int typecmd(int argc, char **argv) { + if (argc > 2 && strcmp(argv[1], "--") == 0) + argc--, argv++; return typecmd_impl(argc, argv, TYPECMD_TYPE, bltinlookup("PATH", 1)); } Modified: projects/camlock/bin/sh/parser.c ============================================================================== --- projects/camlock/bin/sh/parser.c Sat Aug 31 16:56:59 2013 (r255101) +++ projects/camlock/bin/sh/parser.c Sat Aug 31 17:22:43 2013 (r255102) @@ -96,7 +96,7 @@ static struct heredoc *heredoclist; /* l static int doprompt; /* if set, prompt the user */ static int needprompt; /* true if interactive and at start of line */ static int lasttoken; /* last token read */ -int tokpushback; /* last token pushed back */ +static int tokpushback; /* last token pushed back */ static char *wordtext; /* text of last word returned by readtoken */ static int checkkwd; static struct nodelist *backquotelist; @@ -108,12 +108,13 @@ static int funclinno; /* line # where t static struct parser_temp *parser_temp; -static union node *list(int, int); +static union node *list(int); static union node *andor(void); static union node *pipeline(void); static union node *command(void); static union node *simplecmd(union node **, union node *); static union node *makename(void); +static union node *makebinary(int type, union node *n1, union node *n2); static void parsefname(void); static void parseheredoc(void); static int peektoken(void); @@ -121,6 +122,7 @@ static int readtoken(void); static int xxreadtoken(void); static int readtoken1(int, const char *, const char *, int); static int noexpand(char *); +static void consumetoken(int); static void synexpect(int) __dead2; static void synerror(const char *) __dead2; static void setprompt(int); @@ -223,18 +225,18 @@ parsecmd(int interact) if (t == TNL) return NULL; tokpushback++; - return list(1, 1); + return list(1); } static union node * -list(int nlflag, int erflag) +list(int nlflag) { union node *ntop, *n1, *n2, *n3; int tok; checkkwd = CHKNL | CHKKWD | CHKALIAS; - if (!nlflag && !erflag && tokendlist[peektoken()]) + if (!nlflag && tokendlist[peektoken()]) return NULL; ntop = n1 = NULL; for (;;) { @@ -256,17 +258,11 @@ list(int nlflag, int erflag) if (ntop == NULL) ntop = n2; else if (n1 == NULL) { - n1 = (union node *)stalloc(sizeof (struct nbinary)); - n1->type = NSEMI; - n1->nbinary.ch1 = ntop; - n1->nbinary.ch2 = n2; + n1 = makebinary(NSEMI, ntop, n2); ntop = n1; } else { - n3 = (union node *)stalloc(sizeof (struct nbinary)); - n3->type = NSEMI; - n3->nbinary.ch1 = n1->nbinary.ch2; - n3->nbinary.ch2 = n2; + n3 = makebinary(NSEMI, n1->nbinary.ch2, n2); n1->nbinary.ch2 = n3; n1 = n3; } @@ -287,8 +283,7 @@ list(int nlflag, int erflag) tokpushback++; } checkkwd = CHKNL | CHKKWD | CHKALIAS; - if (!nlflag && (erflag ? peektoken() == TEOF : - tokendlist[peektoken()])) + if (!nlflag && tokendlist[peektoken()]) return ntop; break; case TEOF: @@ -298,7 +293,7 @@ list(int nlflag, int erflag) pungetc(); /* push back EOF on input */ return ntop; default: - if (nlflag || erflag) + if (nlflag) synexpect(-1); tokpushback++; return ntop; @@ -311,10 +306,10 @@ list(int nlflag, int erflag) static union node * andor(void) { - union node *n1, *n2, *n3; + union node *n; int t; - n1 = pipeline(); + n = pipeline(); for (;;) { if ((t = readtoken()) == TAND) { t = NAND; @@ -322,14 +317,9 @@ andor(void) t = NOR; } else { tokpushback++; - return n1; + return n; } - n2 = pipeline(); - n3 = (union node *)stalloc(sizeof (struct nbinary)); - n3->type = t; - n3->nbinary.ch1 = n1; - n3->nbinary.ch2 = n2; - n1 = n3; + n = makebinary(t, n, pipeline()); } } @@ -411,49 +401,39 @@ command(void) case TIF: n1 = (union node *)stalloc(sizeof (struct nif)); n1->type = NIF; - if ((n1->nif.test = list(0, 0)) == NULL) + if ((n1->nif.test = list(0)) == NULL) synexpect(-1); - if (readtoken() != TTHEN) - synexpect(TTHEN); - n1->nif.ifpart = list(0, 0); + consumetoken(TTHEN); + n1->nif.ifpart = list(0); n2 = n1; while (readtoken() == TELIF) { n2->nif.elsepart = (union node *)stalloc(sizeof (struct nif)); n2 = n2->nif.elsepart; n2->type = NIF; - if ((n2->nif.test = list(0, 0)) == NULL) + if ((n2->nif.test = list(0)) == NULL) synexpect(-1); - if (readtoken() != TTHEN) - synexpect(TTHEN); - n2->nif.ifpart = list(0, 0); + consumetoken(TTHEN); + n2->nif.ifpart = list(0); } if (lasttoken == TELSE) - n2->nif.elsepart = list(0, 0); + n2->nif.elsepart = list(0); else { n2->nif.elsepart = NULL; tokpushback++; } - if (readtoken() != TFI) - synexpect(TFI); + consumetoken(TFI); checkkwd = CHKKWD | CHKALIAS; break; case TWHILE: - case TUNTIL: { - int got; - n1 = (union node *)stalloc(sizeof (struct nbinary)); - n1->type = (lasttoken == TWHILE)? NWHILE : NUNTIL; - if ((n1->nbinary.ch1 = list(0, 0)) == NULL) + case TUNTIL: + t = lasttoken; + if ((n1 = list(0)) == NULL) synexpect(-1); - if ((got=readtoken()) != TDO) { -TRACE(("expecting DO got %s %s\n", tokname[got], got == TWORD ? wordtext : "")); - synexpect(TDO); - } - n1->nbinary.ch2 = list(0, 0); - if (readtoken() != TDONE) - synexpect(TDONE); + consumetoken(TDO); + n1 = makebinary((t == TWHILE)? NWHILE : NUNTIL, n1, list(0)); + consumetoken(TDONE); checkkwd = CHKKWD | CHKALIAS; break; - } case TFOR: if (readtoken() != TWORD || quoteflag || ! goodname(wordtext)) synerror("Bad for loop variable"); @@ -465,10 +445,7 @@ TRACE(("expecting DO got %s %s\n", tokna if (lasttoken == TWORD && ! quoteflag && equal(wordtext, "in")) { app = ≈ while (readtoken() == TWORD) { - n2 = (union node *)stalloc(sizeof (struct narg)); - n2->type = NARG; - n2->narg.text = wordtext; - n2->narg.backquote = backquotelist; + n2 = makename(); *app = n2; app = &n2->narg.next; } @@ -500,21 +477,15 @@ TRACE(("expecting DO got %s %s\n", tokna t = TEND; else synexpect(-1); - n1->nfor.body = list(0, 0); - if (readtoken() != t) - synexpect(t); + n1->nfor.body = list(0); + consumetoken(t); checkkwd = CHKKWD | CHKALIAS; break; case TCASE: n1 = (union node *)stalloc(sizeof (struct ncase)); n1->type = NCASE; - if (readtoken() != TWORD) - synexpect(TWORD); - n1->ncase.expr = n2 = (union node *)stalloc(sizeof (struct narg)); - n2->type = NARG; - n2->narg.text = wordtext; - n2->narg.backquote = backquotelist; - n2->narg.next = NULL; + consumetoken(TWORD); + n1->ncase.expr = makename(); while (readtoken() == TNL); if (lasttoken != TWORD || ! equal(wordtext, "in")) synerror("expecting \"in\""); @@ -527,10 +498,7 @@ TRACE(("expecting DO got %s %s\n", tokna if (lasttoken == TLP) readtoken(); for (;;) { - *app = ap = (union node *)stalloc(sizeof (struct narg)); - ap->type = NARG; - ap->narg.text = wordtext; - ap->narg.backquote = backquotelist; + *app = ap = makename(); checkkwd = CHKNL | CHKKWD; if (readtoken() != TPIPE) break; @@ -540,7 +508,7 @@ TRACE(("expecting DO got %s %s\n", tokna ap->narg.next = NULL; if (lasttoken != TRP) synexpect(TRP); - cp->nclist.body = list(0, 0); + cp->nclist.body = list(0); checkkwd = CHKNL | CHKKWD | CHKALIAS; if ((t = readtoken()) != TESAC) { @@ -560,20 +528,18 @@ TRACE(("expecting DO got %s %s\n", tokna case TLP: n1 = (union node *)stalloc(sizeof (struct nredir)); n1->type = NSUBSHELL; - n1->nredir.n = list(0, 0); + n1->nredir.n = list(0); n1->nredir.redirect = NULL; - if (readtoken() != TRP) - synexpect(TRP); + consumetoken(TRP); checkkwd = CHKKWD | CHKALIAS; is_subshell = 1; break; case TBEGIN: - n1 = list(0, 0); - if (readtoken() != TEND) - synexpect(TEND); + n1 = list(0); + consumetoken(TEND); checkkwd = CHKKWD | CHKALIAS; break; - /* Handle an empty command like other simple commands. */ + /* A simple command must have at least one redirection or word. */ case TBACKGND: case TSEMI: case TAND: @@ -581,16 +547,12 @@ TRACE(("expecting DO got %s %s\n", tokna case TPIPE: case TENDCASE: case TFALLTHRU: - /* - * An empty command before a ; doesn't make much sense, and - * should certainly be disallowed in the case of `if ;'. - */ + case TEOF: + case TNL: + case TRP: if (!redir) synexpect(-1); - case TNL: - case TEOF: case TWORD: - case TRP: tokpushback++; n1 = simplecmd(rpp, redir); return n1; @@ -648,10 +610,7 @@ simplecmd(union node **rpp, union node * for (;;) { checkkwd = savecheckkwd; if (readtoken() == TWORD) { - n = (union node *)stalloc(sizeof (struct narg)); - n->type = NARG; - n->narg.text = wordtext; - n->narg.backquote = backquotelist; + n = makename(); *app = n; app = &n->narg.next; if (savecheckkwd != 0 && !isassignment(wordtext)) @@ -663,8 +622,7 @@ simplecmd(union node **rpp, union node * } else if (lasttoken == TLP && app == &args->narg.next && rpp == orig_rpp) { /* We have a function */ - if (readtoken() != TRP) - synexpect(TRP); + consumetoken(TRP); funclinno = plinno; /* * - Require plain text. @@ -712,6 +670,18 @@ makename(void) return n; } +static union node * +makebinary(int type, union node *n1, union node *n2) +{ + union node *n; + + n = (union node *)stalloc(sizeof (struct nbinary)); + n->type = type; + n->nbinary.ch1 = n1; + n->nbinary.ch2 = n2; + return (n); +} + void fixredir(union node *n, const char *text, int err) { @@ -738,8 +708,7 @@ parsefname(void) { union node *n = redirnode; - if (readtoken() != TWORD) - synexpect(-1); + consumetoken(TWORD); if (n->type == NHERE) { struct heredoc *here = heredoc; struct heredoc *p; @@ -790,11 +759,7 @@ parseheredoc(void) } readtoken1(pgetc(), here->here->type == NHERE? SQSYNTAX : DQSYNTAX, here->eofmark, here->striptabs); - n = (union node *)stalloc(sizeof (struct narg)); - n->narg.type = NARG; - n->narg.next = NULL; - n->narg.text = wordtext; - n->narg.backquote = backquotelist; + n = makename(); here->here->nhere.doc = n; } } @@ -1094,14 +1059,14 @@ done: doprompt = 0; } - n = list(0, oldstyle); + n = list(0); - if (oldstyle) + if (oldstyle) { + if (peektoken() != TEOF) + synexpect(-1); doprompt = saveprompt; - else { - if (readtoken() != TRP) - synexpect(TRP); - } + } else + consumetoken(TRP); (*nlpp)->n = n; if (oldstyle) { @@ -1884,6 +1849,14 @@ isassignment(const char *p) } +static void +consumetoken(int token) +{ + if (readtoken() != token) + synexpect(token); +} + + /* * Called when an unexpected token is read during the parse. The argument * is the token that is expected, or -1 if more than one type of token can Modified: projects/camlock/bin/sh/parser.h ============================================================================== --- projects/camlock/bin/sh/parser.h Sat Aug 31 16:56:59 2013 (r255101) +++ projects/camlock/bin/sh/parser.h Sat Aug 31 17:22:43 2013 (r255102) @@ -68,11 +68,9 @@ /* * NEOF is returned by parsecmd when it encounters an end of file. It - * must be distinct from NULL, so we use the address of a variable that - * happens to be handy. + * must be distinct from NULL. */ -extern int tokpushback; -#define NEOF ((union node *)&tokpushback) +#define NEOF ((union node *)-1) extern int whichprompt; /* 1 == PS1, 2 == PS2 */ extern const char *const parsekwd[]; Modified: projects/camlock/cddl/contrib/opensolaris/tools/ctf/cvt/dwarf.c ============================================================================== --- projects/camlock/cddl/contrib/opensolaris/tools/ctf/cvt/dwarf.c Sat Aug 31 16:56:59 2013 (r255101) +++ projects/camlock/cddl/contrib/opensolaris/tools/ctf/cvt/dwarf.c Sat Aug 31 17:22:43 2013 (r255102) @@ -23,8 +23,6 @@ * Use is subject to license terms. */ -#pragma ident "%Z%%M% %I% %E% SMI" - /* * DWARF to tdata conversion * @@ -1796,6 +1794,59 @@ die_resolve(dwarf_t *dw) } while (dw->dw_nunres != 0); } +/* + * Any object containing a function or object symbol at any scope should also + * contain DWARF data. + */ +static boolean_t +should_have_dwarf(Elf *elf) +{ + Elf_Scn *scn = NULL; + Elf_Data *data = NULL; + GElf_Shdr shdr; + GElf_Sym sym; + uint32_t symdx = 0; + size_t nsyms = 0; + boolean_t found = B_FALSE; + + while ((scn = elf_nextscn(elf, scn)) != NULL) { + gelf_getshdr(scn, &shdr); + + if (shdr.sh_type == SHT_SYMTAB) { + found = B_TRUE; + break; + } + } + + if (!found) + terminate("cannot convert stripped objects\n"); + + data = elf_getdata(scn, NULL); + nsyms = shdr.sh_size / shdr.sh_entsize; + + for (symdx = 0; symdx < nsyms; symdx++) { + gelf_getsym(data, symdx, &sym); + + if ((GELF_ST_TYPE(sym.st_info) == STT_FUNC) || + (GELF_ST_TYPE(sym.st_info) == STT_TLS) || + (GELF_ST_TYPE(sym.st_info) == STT_OBJECT)) { + char *name; + + name = elf_strptr(elf, shdr.sh_link, sym.st_name); + + /* Studio emits these local symbols regardless */ + if ((strcmp(name, "Bbss.bss") != 0) && + (strcmp(name, "Ttbss.bss") != 0) && + (strcmp(name, "Ddata.data") != 0) && + (strcmp(name, "Ttdata.data") != 0) && + (strcmp(name, "Drodata.rodata") != 0)) + return (B_TRUE); + } + } + + return (B_FALSE); +} + /*ARGSUSED*/ int dw_read(tdata_t *td, Elf *elf, char *filename __unused) @@ -1820,8 +1871,12 @@ dw_read(tdata_t *td, Elf *elf, char *fil if ((rc = dwarf_elf_init(elf, DW_DLC_READ, &dw.dw_dw, &dw.dw_err)) == DW_DLV_NO_ENTRY) { - errno = ENOENT; - return (-1); + if (should_have_dwarf(elf)) { + errno = ENOENT; + return (-1); + } else { + return (0); + } } else if (rc != DW_DLV_OK) { if (dwarf_errno(&dw.dw_err) == DW_DLE_DEBUG_INFO_NULL) { /* @@ -1839,9 +1894,14 @@ dw_read(tdata_t *td, Elf *elf, char *fil &addrsz, &nxthdr, &dw.dw_err)) != DW_DLV_OK) terminate("rc = %d %s\n", rc, dwarf_errmsg(&dw.dw_err)); - if ((cu = die_sibling(&dw, NULL)) == NULL) + if ((cu = die_sibling(&dw, NULL)) == NULL || + (((child = die_child(&dw, cu)) == NULL) && + should_have_dwarf(elf))) { terminate("file does not contain dwarf type data " "(try compiling with -g)\n"); + } else if (child == NULL) { + return (0); + } dw.dw_maxoff = nxthdr - 1; Modified: projects/camlock/cddl/lib/libdtrace/Makefile ============================================================================== --- projects/camlock/cddl/lib/libdtrace/Makefile Sat Aug 31 16:56:59 2013 (r255101) +++ projects/camlock/cddl/lib/libdtrace/Makefile Sat Aug 31 17:22:43 2013 (r255102) @@ -48,8 +48,11 @@ SRCS= dt_aggregate.c \ DSRCS= errno.d \ io.d \ + ip.d \ psinfo.d \ signal.d \ + tcp.d \ + udp.d \ unistd.d WARNS?= 1 Copied: projects/camlock/cddl/lib/libdtrace/ip.d (from r255101, head/cddl/lib/libdtrace/ip.d) ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/camlock/cddl/lib/libdtrace/ip.d Sat Aug 31 17:22:43 2013 (r255102, copy of r255101, head/cddl/lib/libdtrace/ip.d) @@ -0,0 +1,285 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + * + * $FreeBSD$ + */ +/* + * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013 Mark Johnston + */ + +#pragma D depends_on provider ip + +/* + * pktinfo is where packet ID info can be made available for deeper + * analysis if packet IDs become supported by the kernel in the future. + * The pkt_addr member is currently always NULL. + */ +typedef struct pktinfo { + uintptr_t pkt_addr; +} pktinfo_t; + +/* + * csinfo is where connection state info is made available. + */ +typedef uint32_t zoneid_t; +typedef struct csinfo { + uintptr_t cs_addr; + uint64_t cs_cid; + pid_t cs_pid; + zoneid_t cs_zoneid; +} csinfo_t; + +/* + * ipinfo contains common IP info for both IPv4 and IPv6. + */ +typedef struct ipinfo { + uint8_t ip_ver; /* IP version (4, 6) */ + uint32_t ip_plength; /* payload length */ + string ip_saddr; /* source address */ + string ip_daddr; /* destination address */ +} ipinfo_t; + +/* + * ifinfo contains network interface info. + */ +typedef struct ifinfo { + string if_name; /* interface name */ + int8_t if_local; /* is delivered locally */ + /*netstackid_t if_ipstack;*/ /* ipstack ID */ + uintptr_t if_addr; /* pointer to raw ill_t */ +} ifinfo_t; + +typedef uint32_t ipaddr_t; +typedef struct { + uint8_t ipha_version_and_hdr_length; + uint8_t ipha_type_of_service; + uint16_t ipha_length; + uint16_t ipha_ident; + uint16_t ipha_fragment_offset_and_flags; + uint8_t ipha_ttl; + uint8_t ipha_protocol; + uint16_t ipha_hdr_checksum; + ipaddr_t ipha_src; + ipaddr_t ipha_dst; +} ipha_t; + +/* + * ipv4info is a translated version of the IPv4 header (with raw pointer). + * These values are NULL if the packet is not IPv4. + */ +typedef struct ipv4info { + uint8_t ipv4_ver; /* IP version (4) */ + uint8_t ipv4_ihl; /* header length, bytes */ + uint8_t ipv4_tos; /* type of service field */ + uint16_t ipv4_length; /* length (header + payload) */ + uint16_t ipv4_ident; /* identification */ + uint8_t ipv4_flags; /* IP flags */ + uint16_t ipv4_offset; /* fragment offset */ + uint8_t ipv4_ttl; /* time to live */ + uint8_t ipv4_protocol; /* next level protocol */ + string ipv4_protostr; /* next level protocol, as a string */ + uint16_t ipv4_checksum; /* header checksum */ + ipaddr_t ipv4_src; /* source address */ + ipaddr_t ipv4_dst; /* destination address */ + string ipv4_saddr; /* source address, string */ + string ipv4_daddr; /* destination address, string */ + ipha_t *ipv4_hdr; /* pointer to raw header */ +} ipv4info_t; + +/* + * ipv6info is a translated version of the IPv6 header (with raw pointer). + * These values are NULL if the packet is not IPv6. + */ +typedef struct in6_addr in6_addr_t; +typedef struct ip6_hdr ip6_t; +typedef struct ipv6info { + uint8_t ipv6_ver; /* IP version (6) */ + uint8_t ipv6_tclass; /* traffic class */ + uint32_t ipv6_flow; /* flow label */ + uint16_t ipv6_plen; /* payload length */ + uint8_t ipv6_nexthdr; /* next header protocol */ + string ipv6_nextstr; /* next header protocol, as a string */ + uint8_t ipv6_hlim; /* hop limit */ + in6_addr_t *ipv6_src; /* source address */ + in6_addr_t *ipv6_dst; /* destination address */ + string ipv6_saddr; /* source address, string */ + string ipv6_daddr; /* destination address, string */ + ip6_t *ipv6_hdr; /* pointer to raw header */ +} ipv6info_t; + +#pragma D binding "1.0" IPPROTO_IP +inline short IPPROTO_IP = 0; +#pragma D binding "1.0" IPPROTO_ICMP +inline short IPPROTO_ICMP = 1; +#pragma D binding "1.0" IPPROTO_IGMP +inline short IPPROTO_IGMP = 2; +#pragma D binding "1.0" IPPROTO_IPV4 +inline short IPPROTO_IPV4 = 4; +#pragma D binding "1.0" IPPROTO_TCP +inline short IPPROTO_TCP = 6; +#pragma D binding "1.0" IPPROTO_UDP +inline short IPPROTO_UDP = 17; +#pragma D binding "1.0" IPPROTO_IPV6 +inline short IPPROTO_IPV6 = 41; +#pragma D binding "1.0" IPPROTO_ROUTING +inline short IPPROTO_ROUTING = 43; +#pragma D binding "1.0" IPPROTO_FRAGMENT +inline short IPPROTO_FRAGMENT = 44; +#pragma D binding "1.0" IPPROTO_RSVP +inline short IPPROTO_RSVP = 46; +#pragma D binding "1.0" IPPROTO_GRE +inline short IPPROTO_GRE = 47; +#pragma D binding "1.0" IPPROTO_ESP +inline short IPPROTO_ESP = 50; +#pragma D binding "1.0" IPPROTO_AH +inline short IPPROTO_AH = 51; +#pragma D binding "1.0" IPPROTO_MOBILE +inline short IPPROTO_MOBILE = 55; +#pragma D binding "1.0" IPPROTO_ICMPV6 +inline short IPPROTO_ICMPV6 = 58; +#pragma D binding "1.0" IPPROTO_DSTOPTS +inline short IPPROTO_DSTOPTS = 60; +#pragma D binding "1.0" IPPROTO_ETHERIP +inline short IPPROTO_ETHERIP = 97; +#pragma D binding "1.0" IPPROTO_PIM +inline short IPPROTO_PIM = 103; +#pragma D binding "1.0" IPPROTO_IPCOMP +inline short IPPROTO_IPCOMP = 108; +#pragma D binding "1.0" IPPROTO_SCTP +inline short IPPROTO_SCTP = 132; +#pragma D binding "1.0" IPPROTO_RAW +inline short IPPROTO_RAW = 255; + +inline uint8_t INP_IPV4 = 0x01; +inline uint8_t INP_IPV6 = 0x02; + +#pragma D binding "1.0" protocols +inline string protocols[int proto] = + proto == IPPROTO_IP ? "IP" : + proto == IPPROTO_ICMP ? "ICMP" : + proto == IPPROTO_IGMP ? "IGMP" : + proto == IPPROTO_IPV4 ? "IPV4" : + proto == IPPROTO_TCP ? "TCP" : + proto == IPPROTO_UDP ? "UDP" : + proto == IPPROTO_IPV6 ? "IPV6" : + proto == IPPROTO_ROUTING ? "ROUTING" : + proto == IPPROTO_FRAGMENT ? "FRAGMENT" : + proto == IPPROTO_RSVP ? "RSVP" : + proto == IPPROTO_GRE ? "GRE" : + proto == IPPROTO_ESP ? "ESP" : + proto == IPPROTO_AH ? "AH" : + proto == IPPROTO_MOBILE ? "MOBILE" : + proto == IPPROTO_ICMPV6 ? "ICMPV6" : + proto == IPPROTO_DSTOPTS ? "DSTOPTS" : + proto == IPPROTO_ETHERIP ? "ETHERIP" : + proto == IPPROTO_PIM ? "PIM" : + proto == IPPROTO_IPCOMP ? "IPCOMP" : + proto == IPPROTO_SCTP ? "SCTP" : + proto == IPPROTO_RAW ? "RAW" : + ""; + +/* + * This field is always NULL according to the current definition of the ip + * probes. + */ +#pragma D binding "1.0" translator +translator pktinfo_t < void *p > { + pkt_addr = NULL; +}; + +#pragma D binding "1.0" translator +translator csinfo_t < void *p > { + cs_addr = NULL; + cs_cid = (uint64_t)p; + cs_pid = 0; + cs_zoneid = 0; +}; + +#pragma D binding "1.0" translator +translator csinfo_t < struct inpcb *p > { + cs_addr = NULL; + cs_cid = (uint64_t)p; + cs_pid = 0; /* XXX */ + cs_zoneid = 0; +}; + +#pragma D binding "1.0" translator +translator ipinfo_t < uint8_t *p > { + ip_ver = p == NULL ? 0 : ((struct ip *)p)->ip_v; + ip_plength = p == NULL ? 0 : + ((struct ip *)p)->ip_v == 4 ? + ntohs(((struct ip *)p)->ip_len) - (((struct ip *)p)->ip_hl << 2): + ntohs(((struct ip6_hdr *)p)->ip6_ctlun.ip6_un1.ip6_un1_plen); + ip_saddr = p == NULL ? 0 : + ((struct ip *)p)->ip_v == 4 ? + inet_ntoa(&((struct ip *)p)->ip_src.s_addr) : + inet_ntoa6(&((struct ip6_hdr *)p)->ip6_src); + ip_daddr = p == NULL ? 0 : + ((struct ip *)p)->ip_v == 4 ? + inet_ntoa(&((struct ip *)p)->ip_dst.s_addr) : + inet_ntoa6(&((struct ip6_hdr *)p)->ip6_dst); +}; + +#pragma D binding "1.0" IFF_LOOPBACK +inline int IFF_LOOPBACK = 0x8; + +#pragma D binding "1.0" translator +translator ifinfo_t < struct ifnet *p > { + if_name = p->if_xname; + if_local = (p->if_flags & IFF_LOOPBACK) == 0 ? 0 : 1; + if_addr = (uintptr_t)p; +}; + +#pragma D binding "1.0" translator +translator ipv4info_t < struct ip *p > { + ipv4_ver = p == NULL ? 0 : p->ip_v; + ipv4_ihl = p == NULL ? 0 : p->ip_hl; + ipv4_tos = p == NULL ? 0 : p->ip_tos; + ipv4_length = p == NULL ? 0 : ntohs(p->ip_len); + ipv4_ident = p == NULL ? 0 : ntohs(p->ip_id); + ipv4_flags = p == NULL ? 0 : (p->ip_off & 0xe000); + ipv4_offset = p == NULL ? 0 : p->ip_off; + ipv4_ttl = p == NULL ? 0 : p->ip_ttl; + ipv4_protocol = p == NULL ? 0 : p->ip_p; + ipv4_protostr = p == NULL ? "" : protocols[p->ip_p]; + ipv4_checksum = p == NULL ? 0 : ntohs(p->ip_sum); + ipv4_src = p == NULL ? 0 : (ipaddr_t)ntohl(p->ip_src.s_addr); + ipv4_dst = p == NULL ? 0 : (ipaddr_t)ntohl(p->ip_dst.s_addr); + ipv4_saddr = p == NULL ? 0 : inet_ntoa(&p->ip_src.s_addr); + ipv4_daddr = p == NULL ? 0 : inet_ntoa(&p->ip_dst.s_addr); + ipv4_hdr = (ipha_t *)p; +}; + +#pragma D binding "1.0" translator +translator ipv6info_t < struct ip6_hdr *p > { + ipv6_ver = p == NULL ? 0 : (ntohl(p->ip6_ctlun.ip6_un1.ip6_un1_flow) & 0xf0000000) >> 28; + ipv6_tclass = p == NULL ? 0 : (ntohl(p->ip6_ctlun.ip6_un1.ip6_un1_flow) & 0x0ff00000) >> 20; + ipv6_flow = p == NULL ? 0 : ntohl(p->ip6_ctlun.ip6_un1.ip6_un1_flow) & 0x000fffff; + ipv6_plen = p == NULL ? 0 : ntohs(p->ip6_ctlun.ip6_un1.ip6_un1_plen); + ipv6_nexthdr = p == NULL ? 0 : p->ip6_ctlun.ip6_un1.ip6_un1_nxt; + ipv6_nextstr = p == NULL ? "" : protocols[p->ip6_ctlun.ip6_un1.ip6_un1_nxt]; + ipv6_hlim = p == NULL ? 0 : p->ip6_ctlun.ip6_un1.ip6_un1_hlim; + ipv6_src = p == NULL ? 0 : (in6_addr_t *)&p->ip6_src; + ipv6_dst = p == NULL ? 0 : (in6_addr_t *)&p->ip6_dst; + ipv6_saddr = p == NULL ? 0 : inet_ntoa6(&p->ip6_src); + ipv6_daddr = p == NULL ? 0 : inet_ntoa6(&p->ip6_dst); + ipv6_hdr = (ip6_t *)p; +}; Copied: projects/camlock/cddl/lib/libdtrace/tcp.d (from r255101, head/cddl/lib/libdtrace/tcp.d) ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/camlock/cddl/lib/libdtrace/tcp.d Sat Aug 31 17:22:43 2013 (r255102, copy of r255101, head/cddl/lib/libdtrace/tcp.d) @@ -0,0 +1,203 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + * + * $FreeBSD$ + */ +/* + * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013 Mark Johnston + */ + +#pragma D depends_on library ip.d +#pragma D depends_on provider tcp + +/* *** DIFF OUTPUT TRUNCATED AT 1000 LINES ***