Date: Tue, 7 Feb 2017 18:47:16 +0000 (UTC) From: Ngie Cooper <ngie@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r313399 - in projects/netbsd-tests-upstream-01-2017: contrib/byacc/test/yacc sys/arm/altera/socfpga sys/arm/conf sys/arm64/arm64 sys/arm64/include sys/boot/efi/libefi sys/kern sys/modul... Message-ID: <201702071847.v17IlGMO014131@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: ngie Date: Tue Feb 7 18:47:16 2017 New Revision: 313399 URL: https://svnweb.freebsd.org/changeset/base/313399 Log: MFhead@r313398 Added: projects/netbsd-tests-upstream-01-2017/sys/arm/altera/socfpga/socfpga_mp.h - copied unchanged from r313398, head/sys/arm/altera/socfpga/socfpga_mp.h Modified: projects/netbsd-tests-upstream-01-2017/contrib/byacc/test/yacc/expr.oxout.tab.c projects/netbsd-tests-upstream-01-2017/sys/arm/altera/socfpga/socfpga_common.c projects/netbsd-tests-upstream-01-2017/sys/arm/altera/socfpga/socfpga_machdep.c projects/netbsd-tests-upstream-01-2017/sys/arm/altera/socfpga/socfpga_mp.c projects/netbsd-tests-upstream-01-2017/sys/arm/conf/SOCKIT.common projects/netbsd-tests-upstream-01-2017/sys/arm64/arm64/exception.S projects/netbsd-tests-upstream-01-2017/sys/arm64/arm64/genassym.c projects/netbsd-tests-upstream-01-2017/sys/arm64/arm64/trap.c projects/netbsd-tests-upstream-01-2017/sys/arm64/include/frame.h projects/netbsd-tests-upstream-01-2017/sys/boot/efi/libefi/Makefile projects/netbsd-tests-upstream-01-2017/sys/kern/init_main.c projects/netbsd-tests-upstream-01-2017/sys/kern/kern_mutex.c projects/netbsd-tests-upstream-01-2017/sys/kern/kern_rwlock.c projects/netbsd-tests-upstream-01-2017/sys/kern/kern_sx.c projects/netbsd-tests-upstream-01-2017/sys/kern/kern_thread.c projects/netbsd-tests-upstream-01-2017/sys/kern/subr_lock.c projects/netbsd-tests-upstream-01-2017/sys/kern/subr_sfbuf.c projects/netbsd-tests-upstream-01-2017/sys/modules/dtb/allwinner/Makefile projects/netbsd-tests-upstream-01-2017/sys/sys/lock.h projects/netbsd-tests-upstream-01-2017/sys/sys/rwlock.h projects/netbsd-tests-upstream-01-2017/tests/sys/netinet/fibs_test.sh projects/netbsd-tests-upstream-01-2017/tests/sys/netinet/udp_dontroute.c projects/netbsd-tests-upstream-01-2017/usr.bin/sed/tests/sed2_test.sh Directory Properties: projects/netbsd-tests-upstream-01-2017/ (props changed) projects/netbsd-tests-upstream-01-2017/contrib/byacc/ (props changed) Modified: projects/netbsd-tests-upstream-01-2017/contrib/byacc/test/yacc/expr.oxout.tab.c ============================================================================== --- projects/netbsd-tests-upstream-01-2017/contrib/byacc/test/yacc/expr.oxout.tab.c Tue Feb 7 18:37:46 2017 (r313398) +++ projects/netbsd-tests-upstream-01-2017/contrib/byacc/test/yacc/expr.oxout.tab.c Tue Feb 7 18:47:16 2017 (r313399) @@ -178,7 +178,7 @@ extern int YYPARSE_DECL(); #define ID 257 #define CONST 258 #define YYERRCODE 256 -typedef short YYINT; +typedef int YYINT; static const YYINT expr.oxout_lhs[] = { -1, 2, 0, 1, 3, 3, 3, 3, 3, 3, 3, }; Modified: projects/netbsd-tests-upstream-01-2017/sys/arm/altera/socfpga/socfpga_common.c ============================================================================== --- projects/netbsd-tests-upstream-01-2017/sys/arm/altera/socfpga/socfpga_common.c Tue Feb 7 18:37:46 2017 (r313398) +++ projects/netbsd-tests-upstream-01-2017/sys/arm/altera/socfpga/socfpga_common.c Tue Feb 7 18:47:16 2017 (r313399) @@ -43,27 +43,3 @@ __FBSDID("$FreeBSD$"); #include <arm/altera/socfpga/socfpga_rstmgr.h> -void -cpu_reset(void) -{ - uint32_t paddr; - bus_addr_t vaddr; - phandle_t node; - - if (rstmgr_warmreset() == 0) - goto end; - - node = OF_finddevice("rstmgr"); - if (node == -1) - goto end; - - if ((OF_getencprop(node, "reg", &paddr, sizeof(paddr))) > 0) { - if (bus_space_map(fdtbus_bs_tag, paddr, 0x8, 0, &vaddr) == 0) { - bus_space_write_4(fdtbus_bs_tag, vaddr, - RSTMGR_CTRL, CTRL_SWWARMRSTREQ); - } - } - -end: - while (1); -} Modified: projects/netbsd-tests-upstream-01-2017/sys/arm/altera/socfpga/socfpga_machdep.c ============================================================================== --- projects/netbsd-tests-upstream-01-2017/sys/arm/altera/socfpga/socfpga_machdep.c Tue Feb 7 18:37:46 2017 (r313398) +++ projects/netbsd-tests-upstream-01-2017/sys/arm/altera/socfpga/socfpga_machdep.c Tue Feb 7 18:47:16 2017 (r313399) @@ -28,7 +28,6 @@ * SUCH DAMAGE. */ -#include "opt_ddb.h" #include "opt_platform.h" #include <sys/cdefs.h> @@ -41,38 +40,22 @@ __FBSDID("$FreeBSD$"); #include <vm/vm.h> +#include <dev/ofw/openfirm.h> + #include <machine/armreg.h> #include <machine/bus.h> +#include <machine/fdt.h> #include <machine/machdep.h> #include <machine/platform.h> +#include <machine/platformvar.h> -vm_offset_t -platform_lastaddr(void) -{ - - return (devmap_lastaddr()); -} - -void -platform_probe_and_attach(void) -{ - -} - -void -platform_gpio_init(void) -{ - -} - -void -platform_late_init(void) -{ +#include <arm/altera/socfpga/socfpga_mp.h> +#include <arm/altera/socfpga/socfpga_rstmgr.h> -} +#include "platform_if.h" -int -platform_devmap_init(void) +static int +socfpga_devmap_init(platform_t plat) { /* UART */ @@ -99,3 +82,42 @@ platform_devmap_init(void) return (0); } + +static void +socfpga_cpu_reset(platform_t plat) +{ + uint32_t paddr; + bus_addr_t vaddr; + phandle_t node; + + if (rstmgr_warmreset() == 0) + goto end; + + node = OF_finddevice("rstmgr"); + if (node == -1) + goto end; + + if ((OF_getencprop(node, "reg", &paddr, sizeof(paddr))) > 0) { + if (bus_space_map(fdtbus_bs_tag, paddr, 0x8, 0, &vaddr) == 0) { + bus_space_write_4(fdtbus_bs_tag, vaddr, + RSTMGR_CTRL, CTRL_SWWARMRSTREQ); + } + } + +end: + while (1); +} + +static platform_method_t socfpga_methods[] = { + PLATFORMMETHOD(platform_devmap_init, socfpga_devmap_init), + PLATFORMMETHOD(platform_cpu_reset, socfpga_cpu_reset), + +#ifdef SMP + PLATFORMMETHOD(platform_mp_setmaxid, socfpga_mp_setmaxid), + PLATFORMMETHOD(platform_mp_start_ap, socfpga_mp_start_ap), +#endif + + PLATFORMMETHOD_END, +}; + +FDT_PLATFORM_DEF(socfpga, "socfpga", 0, "altr,socfpga", 0); Modified: projects/netbsd-tests-upstream-01-2017/sys/arm/altera/socfpga/socfpga_mp.c ============================================================================== --- projects/netbsd-tests-upstream-01-2017/sys/arm/altera/socfpga/socfpga_mp.c Tue Feb 7 18:37:46 2017 (r313398) +++ projects/netbsd-tests-upstream-01-2017/sys/arm/altera/socfpga/socfpga_mp.c Tue Feb 7 18:47:16 2017 (r313399) @@ -28,6 +28,8 @@ * SUCH DAMAGE. */ +#include "opt_platform.h" + #include <sys/cdefs.h> __FBSDID("$FreeBSD$"); #include <sys/param.h> @@ -45,6 +47,9 @@ __FBSDID("$FreeBSD$"); #include <machine/smp.h> #include <machine/fdt.h> #include <machine/intr.h> +#include <machine/platformvar.h> + +#include <arm/altera/socfpga/socfpga_mp.h> #define SCU_PHYSBASE 0xFFFEC000 #define SCU_SIZE 0x100 @@ -85,7 +90,7 @@ socfpga_trampoline(void) } void -platform_mp_setmaxid(void) +socfpga_mp_setmaxid(platform_t plat) { int hwcpu, ncpu; @@ -105,7 +110,7 @@ platform_mp_setmaxid(void) } void -platform_mp_start_ap(void) +socfpga_mp_start_ap(platform_t plat) { bus_space_handle_t scu, rst, ram; int reg; Copied: projects/netbsd-tests-upstream-01-2017/sys/arm/altera/socfpga/socfpga_mp.h (from r313398, head/sys/arm/altera/socfpga/socfpga_mp.h) ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/netbsd-tests-upstream-01-2017/sys/arm/altera/socfpga/socfpga_mp.h Tue Feb 7 18:47:16 2017 (r313399, copy of r313398, head/sys/arm/altera/socfpga/socfpga_mp.h) @@ -0,0 +1,34 @@ +/*- + * Copyright (c) 2017 Andrew Turner <andrew@FreeBSD.org> + * 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 ``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 _SOCFPGA_MP_H_ +#define _SOCFPGA_MP_H_ + +void socfpga_mp_setmaxid(platform_t); +void socfpga_mp_start_ap(platform_t); + +#endif /* _SOCFPGA_MP_H_ */ Modified: projects/netbsd-tests-upstream-01-2017/sys/arm/conf/SOCKIT.common ============================================================================== --- projects/netbsd-tests-upstream-01-2017/sys/arm/conf/SOCKIT.common Tue Feb 7 18:37:46 2017 (r313398) +++ projects/netbsd-tests-upstream-01-2017/sys/arm/conf/SOCKIT.common Tue Feb 7 18:47:16 2017 (r313399) @@ -26,6 +26,8 @@ makeoptions MODULES_OVERRIDE="" makeoptions WERROR="-Werror" options SCHED_ULE # ULE scheduler +options PLATFORM # Platform based SoC +options PLATFORM_SMP options SMP # Enable multiple cores # NFS root from boopt/dhcp Modified: projects/netbsd-tests-upstream-01-2017/sys/arm64/arm64/exception.S ============================================================================== --- projects/netbsd-tests-upstream-01-2017/sys/arm64/arm64/exception.S Tue Feb 7 18:37:46 2017 (r313398) +++ projects/netbsd-tests-upstream-01-2017/sys/arm64/arm64/exception.S Tue Feb 7 18:47:16 2017 (r313399) @@ -56,10 +56,12 @@ __FBSDID("$FreeBSD$"); stp x0, x1, [sp, #(TF_X + 0 * 8)] mrs x10, elr_el1 mrs x11, spsr_el1 + mrs x12, esr_el1 .if \el == 0 mrs x18, sp_el0 .endif - stp x10, x11, [sp, #(TF_ELR)] + str x10, [sp, #(TF_ELR)] + stp w11, w12, [sp, #(TF_SPSR)] stp x18, lr, [sp, #(TF_SP)] mrs x18, tpidr_el1 add x29, sp, #(TF_SIZE) Modified: projects/netbsd-tests-upstream-01-2017/sys/arm64/arm64/genassym.c ============================================================================== --- projects/netbsd-tests-upstream-01-2017/sys/arm64/arm64/genassym.c Tue Feb 7 18:37:46 2017 (r313398) +++ projects/netbsd-tests-upstream-01-2017/sys/arm64/arm64/genassym.c Tue Feb 7 18:47:16 2017 (r313399) @@ -62,4 +62,5 @@ ASSYM(TD_LOCK, offsetof(struct thread, t ASSYM(TF_SIZE, sizeof(struct trapframe)); ASSYM(TF_SP, offsetof(struct trapframe, tf_sp)); ASSYM(TF_ELR, offsetof(struct trapframe, tf_elr)); +ASSYM(TF_SPSR, offsetof(struct trapframe, tf_spsr)); ASSYM(TF_X, offsetof(struct trapframe, tf_x)); Modified: projects/netbsd-tests-upstream-01-2017/sys/arm64/arm64/trap.c ============================================================================== --- projects/netbsd-tests-upstream-01-2017/sys/arm64/arm64/trap.c Tue Feb 7 18:37:46 2017 (r313398) +++ projects/netbsd-tests-upstream-01-2017/sys/arm64/arm64/trap.c Tue Feb 7 18:47:16 2017 (r313399) @@ -257,7 +257,7 @@ print_registers(struct trapframe *frame) printf(" sp: %16lx\n", frame->tf_sp); printf(" lr: %16lx\n", frame->tf_lr); printf(" elr: %16lx\n", frame->tf_elr); - printf("spsr: %16lx\n", frame->tf_spsr); + printf("spsr: %8x\n", frame->tf_spsr); } void @@ -267,7 +267,7 @@ do_el1h_sync(struct trapframe *frame) uint64_t esr, far; /* Read the esr register to get the exception details */ - esr = READ_SPECIALREG(esr_el1); + esr = frame->tf_esr; exception = ESR_ELx_EXCEPTION(esr); #ifdef KDTRACE_HOOKS @@ -352,7 +352,7 @@ do_el0_sync(struct trapframe *frame) td = curthread; td->td_frame = frame; - esr = READ_SPECIALREG(esr_el1); + esr = frame->tf_esr; exception = ESR_ELx_EXCEPTION(esr); switch (exception) { case EXCP_UNKNOWN: Modified: projects/netbsd-tests-upstream-01-2017/sys/arm64/include/frame.h ============================================================================== --- projects/netbsd-tests-upstream-01-2017/sys/arm64/include/frame.h Tue Feb 7 18:37:46 2017 (r313398) +++ projects/netbsd-tests-upstream-01-2017/sys/arm64/include/frame.h Tue Feb 7 18:47:16 2017 (r313399) @@ -45,7 +45,8 @@ struct trapframe { uint64_t tf_sp; uint64_t tf_lr; uint64_t tf_elr; - uint64_t tf_spsr; + uint32_t tf_spsr; + uint32_t tf_esr; uint64_t tf_x[30]; }; Modified: projects/netbsd-tests-upstream-01-2017/sys/boot/efi/libefi/Makefile ============================================================================== --- projects/netbsd-tests-upstream-01-2017/sys/boot/efi/libefi/Makefile Tue Feb 7 18:37:46 2017 (r313398) +++ projects/netbsd-tests-upstream-01-2017/sys/boot/efi/libefi/Makefile Tue Feb 7 18:47:16 2017 (r313399) @@ -26,6 +26,7 @@ SRCS+= time_event.c # of a short. There's no good cast to use here so just ignore the # warnings for now. CWARNFLAGS.efinet.c+= -Wno-format +CWARNFLAGS.efipart.c+= -Wno-format CWARNFLAGS.env.c+= -Wno-format .if ${MACHINE_CPUARCH} == "aarch64" Modified: projects/netbsd-tests-upstream-01-2017/sys/kern/init_main.c ============================================================================== --- projects/netbsd-tests-upstream-01-2017/sys/kern/init_main.c Tue Feb 7 18:37:46 2017 (r313398) +++ projects/netbsd-tests-upstream-01-2017/sys/kern/init_main.c Tue Feb 7 18:47:16 2017 (r313399) @@ -99,7 +99,7 @@ void mi_startup(void); /* Should be e static struct session session0; static struct pgrp pgrp0; struct proc proc0; -struct thread0_storage thread0_st __aligned(16); +struct thread0_storage thread0_st __aligned(32); struct vmspace vmspace0; struct proc *initproc; Modified: projects/netbsd-tests-upstream-01-2017/sys/kern/kern_mutex.c ============================================================================== --- projects/netbsd-tests-upstream-01-2017/sys/kern/kern_mutex.c Tue Feb 7 18:37:46 2017 (r313398) +++ projects/netbsd-tests-upstream-01-2017/sys/kern/kern_mutex.c Tue Feb 7 18:47:16 2017 (r313399) @@ -140,63 +140,27 @@ struct lock_class lock_class_mtx_spin = #ifdef ADAPTIVE_MUTEXES static SYSCTL_NODE(_debug, OID_AUTO, mtx, CTLFLAG_RD, NULL, "mtx debugging"); -static struct lock_delay_config __read_mostly mtx_delay = { - .initial = 1000, - .step = 500, - .min = 100, - .max = 5000, -}; +static struct lock_delay_config __read_mostly mtx_delay; -SYSCTL_INT(_debug_mtx, OID_AUTO, delay_initial, CTLFLAG_RW, &mtx_delay.initial, - 0, ""); -SYSCTL_INT(_debug_mtx, OID_AUTO, delay_step, CTLFLAG_RW, &mtx_delay.step, - 0, ""); -SYSCTL_INT(_debug_mtx, OID_AUTO, delay_min, CTLFLAG_RW, &mtx_delay.min, +SYSCTL_INT(_debug_mtx, OID_AUTO, delay_base, CTLFLAG_RW, &mtx_delay.base, 0, ""); SYSCTL_INT(_debug_mtx, OID_AUTO, delay_max, CTLFLAG_RW, &mtx_delay.max, 0, ""); -static void -mtx_delay_sysinit(void *dummy) -{ - - mtx_delay.initial = mp_ncpus * 25; - mtx_delay.step = (mp_ncpus * 25) / 2; - mtx_delay.min = mp_ncpus * 5; - mtx_delay.max = mp_ncpus * 25 * 10; -} -LOCK_DELAY_SYSINIT(mtx_delay_sysinit); +LOCK_DELAY_SYSINIT_DEFAULT(mtx_delay); #endif static SYSCTL_NODE(_debug, OID_AUTO, mtx_spin, CTLFLAG_RD, NULL, "mtx spin debugging"); -static struct lock_delay_config __read_mostly mtx_spin_delay = { - .initial = 1000, - .step = 500, - .min = 100, - .max = 5000, -}; - -SYSCTL_INT(_debug_mtx_spin, OID_AUTO, delay_initial, CTLFLAG_RW, - &mtx_spin_delay.initial, 0, ""); -SYSCTL_INT(_debug_mtx_spin, OID_AUTO, delay_step, CTLFLAG_RW, &mtx_spin_delay.step, - 0, ""); -SYSCTL_INT(_debug_mtx_spin, OID_AUTO, delay_min, CTLFLAG_RW, &mtx_spin_delay.min, - 0, ""); -SYSCTL_INT(_debug_mtx_spin, OID_AUTO, delay_max, CTLFLAG_RW, &mtx_spin_delay.max, - 0, ""); +static struct lock_delay_config __read_mostly mtx_spin_delay; -static void -mtx_spin_delay_sysinit(void *dummy) -{ +SYSCTL_INT(_debug_mtx_spin, OID_AUTO, delay_base, CTLFLAG_RW, + &mtx_spin_delay.base, 0, ""); +SYSCTL_INT(_debug_mtx_spin, OID_AUTO, delay_max, CTLFLAG_RW, + &mtx_spin_delay.max, 0, ""); - mtx_spin_delay.initial = mp_ncpus * 25; - mtx_spin_delay.step = (mp_ncpus * 25) / 2; - mtx_spin_delay.min = mp_ncpus * 5; - mtx_spin_delay.max = mp_ncpus * 25 * 10; -} -LOCK_DELAY_SYSINIT(mtx_spin_delay_sysinit); +LOCK_DELAY_SYSINIT_DEFAULT(mtx_spin_delay); /* * System-wide mutexes Modified: projects/netbsd-tests-upstream-01-2017/sys/kern/kern_rwlock.c ============================================================================== --- projects/netbsd-tests-upstream-01-2017/sys/kern/kern_rwlock.c Tue Feb 7 18:37:46 2017 (r313398) +++ projects/netbsd-tests-upstream-01-2017/sys/kern/kern_rwlock.c Tue Feb 7 18:47:16 2017 (r313399) @@ -100,32 +100,14 @@ static SYSCTL_NODE(_debug, OID_AUTO, rwl SYSCTL_INT(_debug_rwlock, OID_AUTO, retry, CTLFLAG_RW, &rowner_retries, 0, ""); SYSCTL_INT(_debug_rwlock, OID_AUTO, loops, CTLFLAG_RW, &rowner_loops, 0, ""); -static struct lock_delay_config __read_mostly rw_delay = { - .initial = 1000, - .step = 500, - .min = 100, - .max = 5000, -}; +static struct lock_delay_config __read_mostly rw_delay; -SYSCTL_INT(_debug_rwlock, OID_AUTO, delay_initial, CTLFLAG_RW, &rw_delay.initial, - 0, ""); -SYSCTL_INT(_debug_rwlock, OID_AUTO, delay_step, CTLFLAG_RW, &rw_delay.step, - 0, ""); -SYSCTL_INT(_debug_rwlock, OID_AUTO, delay_min, CTLFLAG_RW, &rw_delay.min, +SYSCTL_INT(_debug_rwlock, OID_AUTO, delay_base, CTLFLAG_RW, &rw_delay.base, 0, ""); SYSCTL_INT(_debug_rwlock, OID_AUTO, delay_max, CTLFLAG_RW, &rw_delay.max, 0, ""); -static void -rw_delay_sysinit(void *dummy) -{ - - rw_delay.initial = mp_ncpus * 25; - rw_delay.step = (mp_ncpus * 25) / 2; - rw_delay.min = mp_ncpus * 5; - rw_delay.max = mp_ncpus * 25 * 10; -} -LOCK_DELAY_SYSINIT(rw_delay_sysinit); +LOCK_DELAY_SYSINIT_DEFAULT(rw_delay); #endif /* @@ -330,6 +312,7 @@ __rw_try_wlock(volatile uintptr_t *c, co if (rw_wlocked(rw) && (rw->lock_object.lo_flags & LO_RECURSABLE) != 0) { rw->rw_recurse++; + atomic_set_ptr(&rw->rw_lock, RW_LOCK_WRITER_RECURSED); rval = 1; } else rval = atomic_cmpset_acq_ptr(&rw->rw_lock, RW_UNLOCKED, @@ -363,10 +346,8 @@ _rw_wunlock_cookie(volatile uintptr_t *c WITNESS_UNLOCK(&rw->lock_object, LOP_EXCLUSIVE, file, line); LOCK_LOG_LOCK("WUNLOCK", &rw->lock_object, 0, rw->rw_recurse, file, line); - if (rw->rw_recurse) - rw->rw_recurse--; - else - _rw_wunlock_hard(rw, (uintptr_t)curthread, file, line); + + _rw_wunlock_hard(rw, (uintptr_t)curthread, file, line); TD_LOCKS_DEC(curthread); } @@ -820,6 +801,7 @@ __rw_wlock_hard(volatile uintptr_t *c, u ("%s: recursing but non-recursive rw %s @ %s:%d\n", __func__, rw->lock_object.lo_name, file, line)); rw->rw_recurse++; + atomic_set_ptr(&rw->rw_lock, RW_LOCK_WRITER_RECURSED); if (LOCK_LOG_TEST(&rw->lock_object, 0)) CTR2(KTR_LOCK, "%s: %p recursing", __func__, rw); return; @@ -1012,12 +994,17 @@ __rw_wunlock_hard(volatile uintptr_t *c, return; rw = rwlock2rw(c); - MPASS(!rw_recursed(rw)); - LOCKSTAT_PROFILE_RELEASE_RWLOCK(rw__release, rw, - LOCKSTAT_WRITER); - if (_rw_write_unlock(rw, tid)) + if (!rw_recursed(rw)) { + LOCKSTAT_PROFILE_RELEASE_RWLOCK(rw__release, rw, + LOCKSTAT_WRITER); + if (_rw_write_unlock(rw, tid)) + return; + } else { + if (--(rw->rw_recurse) == 0) + atomic_clear_ptr(&rw->rw_lock, RW_LOCK_WRITER_RECURSED); return; + } KASSERT(rw->rw_lock & (RW_LOCK_READ_WAITERS | RW_LOCK_WRITE_WAITERS), ("%s: neither of the waiter flags are set", __func__)); Modified: projects/netbsd-tests-upstream-01-2017/sys/kern/kern_sx.c ============================================================================== --- projects/netbsd-tests-upstream-01-2017/sys/kern/kern_sx.c Tue Feb 7 18:37:46 2017 (r313398) +++ projects/netbsd-tests-upstream-01-2017/sys/kern/kern_sx.c Tue Feb 7 18:47:16 2017 (r313399) @@ -148,32 +148,14 @@ static SYSCTL_NODE(_debug, OID_AUTO, sx, SYSCTL_UINT(_debug_sx, OID_AUTO, retries, CTLFLAG_RW, &asx_retries, 0, ""); SYSCTL_UINT(_debug_sx, OID_AUTO, loops, CTLFLAG_RW, &asx_loops, 0, ""); -static struct lock_delay_config __read_mostly sx_delay = { - .initial = 1000, - .step = 500, - .min = 100, - .max = 5000, -}; +static struct lock_delay_config __read_mostly sx_delay; -SYSCTL_INT(_debug_sx, OID_AUTO, delay_initial, CTLFLAG_RW, &sx_delay.initial, - 0, ""); -SYSCTL_INT(_debug_sx, OID_AUTO, delay_step, CTLFLAG_RW, &sx_delay.step, - 0, ""); -SYSCTL_INT(_debug_sx, OID_AUTO, delay_min, CTLFLAG_RW, &sx_delay.min, +SYSCTL_INT(_debug_sx, OID_AUTO, delay_base, CTLFLAG_RW, &sx_delay.base, 0, ""); SYSCTL_INT(_debug_sx, OID_AUTO, delay_max, CTLFLAG_RW, &sx_delay.max, 0, ""); -static void -sx_delay_sysinit(void *dummy) -{ - - sx_delay.initial = mp_ncpus * 25; - sx_delay.step = (mp_ncpus * 25) / 2; - sx_delay.min = mp_ncpus * 5; - sx_delay.max = mp_ncpus * 25 * 10; -} -LOCK_DELAY_SYSINIT(sx_delay_sysinit); +LOCK_DELAY_SYSINIT_DEFAULT(sx_delay); #endif void Modified: projects/netbsd-tests-upstream-01-2017/sys/kern/kern_thread.c ============================================================================== --- projects/netbsd-tests-upstream-01-2017/sys/kern/kern_thread.c Tue Feb 7 18:37:46 2017 (r313398) +++ projects/netbsd-tests-upstream-01-2017/sys/kern/kern_thread.c Tue Feb 7 18:47:16 2017 (r313399) @@ -281,7 +281,7 @@ threadinit(void) thread_zone = uma_zcreate("THREAD", sched_sizeof_thread(), thread_ctor, thread_dtor, thread_init, thread_fini, - 16 - 1, UMA_ZONE_NOFREE); + 32 - 1, UMA_ZONE_NOFREE); tidhashtbl = hashinit(maxproc / 2, M_TIDHASH, &tidhash); rw_init(&tidhash_lock, "tidhash"); } Modified: projects/netbsd-tests-upstream-01-2017/sys/kern/subr_lock.c ============================================================================== --- projects/netbsd-tests-upstream-01-2017/sys/kern/subr_lock.c Tue Feb 7 18:37:46 2017 (r313398) +++ projects/netbsd-tests-upstream-01-2017/sys/kern/subr_lock.c Tue Feb 7 18:47:16 2017 (r313399) @@ -56,6 +56,9 @@ __FBSDID("$FreeBSD$"); #include <machine/cpufunc.h> +SDT_PROVIDER_DEFINE(lock); +SDT_PROBE_DEFINE1(lock, , , starvation, "u_int"); + CTASSERT(LOCK_CLASS_MAX == 15); struct lock_class *lock_classes[LOCK_CLASS_MAX + 1] = { @@ -103,32 +106,56 @@ lock_destroy(struct lock_object *lock) lock->lo_flags &= ~LO_INITIALIZED; } +static SYSCTL_NODE(_debug, OID_AUTO, lock, CTLFLAG_RD, NULL, "lock debugging"); +static SYSCTL_NODE(_debug_lock, OID_AUTO, delay, CTLFLAG_RD, NULL, + "lock delay"); + +static u_int __read_mostly starvation_limit = 131072; +SYSCTL_INT(_debug_lock_delay, OID_AUTO, starvation_limit, CTLFLAG_RW, + &starvation_limit, 0, ""); + +static u_int __read_mostly restrict_starvation = 0; +SYSCTL_INT(_debug_lock_delay, OID_AUTO, restrict_starvation, CTLFLAG_RW, + &restrict_starvation, 0, ""); + void lock_delay(struct lock_delay_arg *la) { - u_int i, delay, backoff, min, max; struct lock_delay_config *lc = la->config; + u_int i; - delay = la->delay; + la->delay <<= 1; + if (__predict_false(la->delay > lc->max)) + la->delay = lc->max; - if (delay == 0) - delay = lc->initial; - else { - delay += lc->step; - max = lc->max; - if (delay > max) - delay = max; - } - - backoff = cpu_ticks() % delay; - min = lc->min; - if (backoff < min) - backoff = min; - for (i = 0; i < backoff; i++) + for (i = la->delay; i > 0; i--) cpu_spinwait(); - la->delay = delay; - la->spin_cnt += backoff; + la->spin_cnt += la->delay; + if (__predict_false(la->spin_cnt > starvation_limit)) { + SDT_PROBE1(lock, , , starvation, la->delay); + if (restrict_starvation) + la->delay = lc->base; + } +} + +static u_int +lock_roundup_2(u_int val) +{ + u_int res; + + for (res = 1; res <= val; res <<= 1) + continue; + + return (res); +} + +void +lock_delay_default_init(struct lock_delay_config *lc) +{ + + lc->base = lock_roundup_2(mp_ncpus) / 4; + lc->max = lc->base * 1024; } #ifdef DDB @@ -655,7 +682,6 @@ out: critical_exit(); } -static SYSCTL_NODE(_debug, OID_AUTO, lock, CTLFLAG_RD, NULL, "lock debugging"); static SYSCTL_NODE(_debug_lock, OID_AUTO, prof, CTLFLAG_RD, NULL, "lock profiling"); SYSCTL_INT(_debug_lock_prof, OID_AUTO, skipspin, CTLFLAG_RW, Modified: projects/netbsd-tests-upstream-01-2017/sys/kern/subr_sfbuf.c ============================================================================== --- projects/netbsd-tests-upstream-01-2017/sys/kern/subr_sfbuf.c Tue Feb 7 18:37:46 2017 (r313398) +++ projects/netbsd-tests-upstream-01-2017/sys/kern/subr_sfbuf.c Tue Feb 7 18:47:16 2017 (r313399) @@ -33,6 +33,7 @@ __FBSDID("$FreeBSD$"); #include <sys/lock.h> #include <sys/malloc.h> #include <sys/mutex.h> +#include <sys/proc.h> #include <sys/sf_buf.h> #include <sys/smp.h> #include <sys/sysctl.h> Modified: projects/netbsd-tests-upstream-01-2017/sys/modules/dtb/allwinner/Makefile ============================================================================== --- projects/netbsd-tests-upstream-01-2017/sys/modules/dtb/allwinner/Makefile Tue Feb 7 18:37:46 2017 (r313398) +++ projects/netbsd-tests-upstream-01-2017/sys/modules/dtb/allwinner/Makefile Tue Feb 7 18:47:16 2017 (r313399) @@ -1,17 +1,26 @@ # $FreeBSD$ # All the dts files for allwinner systems we support. DTS= \ - bananapi.dts \ - bananapim2.dts \ - cubieboard.dts \ - cubieboard2.dts \ nanopi-neo.dts \ - olimex-a20-som-evb.dts \ - olinuxino-lime.dts \ orangepi-plus-2e.dts \ - pcduino3.dts \ sinovoip-bpi-m3.dts \ + sun4i-a10-cubieboard.dts \ + sun4i-a10-olinuxino-lime.dts \ + sun6i-a31s-sinovoip-bpi-m2.dts \ sun5i-a13-olinuxino.dts \ - sun5i-r8-chip.dts + sun5i-r8-chip.dts \ + sun7i-a20-bananapi.dts \ + sun7i-a20-cubieboard2.dts \ + sun7i-a20-olimex-som-evb.dts \ + sun7i-a20-pcduino3.dts + +LINKS= \ + ${DTBDIR}/sun4i-a10-cubieboard.dtb ${DTBDIR}/cubieboard.dtb \ + ${DTBDIR}/sun4i-a10-olinuxino-lime.dtb ${DTBDIR}/olinuxino-lime.dtb \ + ${DTBDIR}/sun6i-a31s-sinovoip-bpi-m2.dtb ${DTBDIR}/bananapim2.dtb \ + ${DTBDIR}/sun7i-a20-bananapi.dtb ${DTBDIR}/bananapi.dtb \ + ${DTBDIR}/sun7i-a20-cubieboard2.dtb ${DTBDIR}/cubieboard2.dtb \ + ${DTBDIR}/sun7i-a20-olimex-som-evb.dtb ${DTBDIR}/olimex-a20-som-evb.dtb \ + ${DTBDIR}/sun7i-a20-pcduino3.dtb ${DTBDIR}/pcduino3.dtb .include <bsd.dtb.mk> Modified: projects/netbsd-tests-upstream-01-2017/sys/sys/lock.h ============================================================================== --- projects/netbsd-tests-upstream-01-2017/sys/sys/lock.h Tue Feb 7 18:37:46 2017 (r313398) +++ projects/netbsd-tests-upstream-01-2017/sys/sys/lock.h Tue Feb 7 18:47:16 2017 (r313399) @@ -202,9 +202,7 @@ extern struct lock_class lock_class_lock extern struct lock_class *lock_classes[]; struct lock_delay_config { - u_int initial; - u_int step; - u_int min; + u_int base; u_int max; }; @@ -215,19 +213,25 @@ struct lock_delay_arg { }; static inline void -lock_delay_arg_init(struct lock_delay_arg *la, struct lock_delay_config *lc) { +lock_delay_arg_init(struct lock_delay_arg *la, struct lock_delay_config *lc) +{ la->config = lc; - la->delay = 0; + la->delay = lc->base; la->spin_cnt = 0; } #define LOCK_DELAY_SYSINIT(func) \ SYSINIT(func##_ld, SI_SUB_LOCK, SI_ORDER_ANY, func, NULL) +#define LOCK_DELAY_SYSINIT_DEFAULT(lc) \ + SYSINIT(lock_delay_##lc##_ld, SI_SUB_LOCK, SI_ORDER_ANY, \ + lock_delay_default_init, &lc) + void lock_init(struct lock_object *, struct lock_class *, const char *, const char *, int); void lock_destroy(struct lock_object *); void lock_delay(struct lock_delay_arg *); +void lock_delay_default_init(struct lock_delay_config *); void spinlock_enter(void); void spinlock_exit(void); void witness_init(struct lock_object *, const char *); Modified: projects/netbsd-tests-upstream-01-2017/sys/sys/rwlock.h ============================================================================== --- projects/netbsd-tests-upstream-01-2017/sys/sys/rwlock.h Tue Feb 7 18:37:46 2017 (r313398) +++ projects/netbsd-tests-upstream-01-2017/sys/sys/rwlock.h Tue Feb 7 18:47:16 2017 (r313399) @@ -58,9 +58,10 @@ #define RW_LOCK_READ_WAITERS 0x02 #define RW_LOCK_WRITE_WAITERS 0x04 #define RW_LOCK_WRITE_SPINNER 0x08 +#define RW_LOCK_WRITER_RECURSED 0x10 #define RW_LOCK_FLAGMASK \ (RW_LOCK_READ | RW_LOCK_READ_WAITERS | RW_LOCK_WRITE_WAITERS | \ - RW_LOCK_WRITE_SPINNER) + RW_LOCK_WRITE_SPINNER | RW_LOCK_WRITER_RECURSED) #define RW_LOCK_WAITERS (RW_LOCK_READ_WAITERS | RW_LOCK_WRITE_WAITERS) #define RW_OWNER(x) ((x) & ~RW_LOCK_FLAGMASK) @@ -111,13 +112,9 @@ #define __rw_wunlock(rw, tid, file, line) do { \ uintptr_t _tid = (uintptr_t)(tid); \ \ - if ((rw)->rw_recurse) \ - (rw)->rw_recurse--; \ - else { \ - if (__predict_false(LOCKSTAT_PROFILE_ENABLED(rw__release) ||\ - !_rw_write_unlock((rw), _tid))) \ - _rw_wunlock_hard((rw), _tid, (file), (line)); \ - } \ + if (__predict_false(LOCKSTAT_PROFILE_ENABLED(rw__release) || \ + !_rw_write_unlock((rw), _tid))) \ + _rw_wunlock_hard((rw), _tid, (file), (line)); \ } while (0) /* Modified: projects/netbsd-tests-upstream-01-2017/tests/sys/netinet/fibs_test.sh ============================================================================== --- projects/netbsd-tests-upstream-01-2017/tests/sys/netinet/fibs_test.sh Tue Feb 7 18:37:46 2017 (r313398) +++ projects/netbsd-tests-upstream-01-2017/tests/sys/netinet/fibs_test.sh Tue Feb 7 18:47:16 2017 (r313399) @@ -595,6 +595,61 @@ udp_dontroute_cleanup() cleanup_tap } +atf_test_case udp_dontroute6 cleanup +udp_dontroute6_head() +{ + atf_set "descr" "Source address selection for UDP IPv6 packets with SO_DONTROUTE on non-default FIBs works" + atf_set "require.user" "root" + atf_set "require.config" "fibs" +} + +udp_dontroute6_body() +{ + # Configure the TAP interface to use an RFC3849 nonrouteable address + # and a non-default fib + ADDR0="2001:db8::2" + ADDR1="2001:db8::3" + SUBNET="2001:db8::" + MASK="64" + # Use a different IP on the same subnet as the target + TARGET="2001:db8::100" + SRCDIR=`atf_get_srcdir` + + atf_expect_fail "PR196361 IPv6 network routes don't respect net.add_addr_allfibs=0" + + # Check system configuration + if [ 0 != `sysctl -n net.add_addr_allfibs` ]; then + atf_skip "This test requires net.add_addr_allfibs=0" + fi + get_fibs 2 + + # Configure the TAP interfaces. Use no_dad so the addresses will be + # ready right away and won't be marked as tentative until DAD + # completes. + setup_tap ${FIB0} inet6 ${ADDR0} ${MASK} no_dad + TARGET_TAP=${TAP} + setup_tap ${FIB1} inet6 ${ADDR1} ${MASK} no_dad + + # Send a UDP packet with SO_DONTROUTE. In the failure case, it will + # return ENETUNREACH, or send the packet to the wrong tap + atf_check -o ignore setfib ${FIB0} \ + ${SRCDIR}/udp_dontroute -6 ${TARGET} /dev/${TARGET_TAP} + cleanup_tap + + # Repeat, but this time target the other tap + setup_tap ${FIB0} inet6 ${ADDR0} ${MASK} no_dad + setup_tap ${FIB1} inet6 ${ADDR1} ${MASK} no_dad + TARGET_TAP=${TAP} + + atf_check -o ignore setfib ${FIB1} \ + ${SRCDIR}/udp_dontroute -6 ${TARGET} /dev/${TARGET_TAP} +} + +udp_dontroute6_cleanup() +{ + cleanup_tap +} + atf_init_test_cases() { @@ -609,6 +664,7 @@ atf_init_test_cases() atf_add_test_case subnet_route_with_multiple_fibs_on_same_subnet atf_add_test_case subnet_route_with_multiple_fibs_on_same_subnet_inet6 atf_add_test_case udp_dontroute + atf_add_test_case udp_dontroute6 } # Looks up one or more fibs from the configuration data and validates them. @@ -656,6 +712,7 @@ get_tap() # Protocol (inet or inet6) # IP address # Netmask in number of bits (eg 24 or 8) +# Extra flags # Return: the tap interface name as the env variable TAP setup_tap() { @@ -663,9 +720,10 @@ setup_tap() local PROTO=$2 local ADDR=$3 local MASK=$4 + local FLAGS=$5 get_tap - echo setfib ${FIB} ifconfig $TAP ${PROTO} ${ADDR}/${MASK} fib $FIB - setfib ${FIB} ifconfig $TAP ${PROTO} ${ADDR}/${MASK} fib $FIB + echo setfib ${FIB} ifconfig $TAP ${PROTO} ${ADDR}/${MASK} fib $FIB $FLAGS + setfib ${FIB} ifconfig $TAP ${PROTO} ${ADDR}/${MASK} fib $FIB $FLAGS } cleanup_tap() Modified: projects/netbsd-tests-upstream-01-2017/tests/sys/netinet/udp_dontroute.c ============================================================================== --- projects/netbsd-tests-upstream-01-2017/tests/sys/netinet/udp_dontroute.c Tue Feb 7 18:37:46 2017 (r313398) +++ projects/netbsd-tests-upstream-01-2017/tests/sys/netinet/udp_dontroute.c Tue Feb 7 18:47:16 2017 (r313399) @@ -41,6 +41,7 @@ #include <errno.h> #include <fcntl.h> #include <stdio.h> +#include <stdbool.h> #include <stdlib.h> #include <string.h> #include <unistd.h> @@ -52,7 +53,7 @@ int main(int argc, char **argv) { - struct sockaddr_in dst; + struct sockaddr_storage dst; int s, t; int opt; int ret; @@ -60,17 +61,33 @@ main(int argc, char **argv) const char* sendbuf = "Hello, World!"; const size_t buflen = 80; char recvbuf[buflen]; - - if (argc != 3) { - fprintf(stderr, "Usage: %s ip_address tapdev\n", argv[0]); + bool v6 = false; + const char *addr, *tapdev; + const uint16_t port = 46120; + + bzero(&dst, sizeof(dst)); + if (argc < 3 || argc > 4) { + fprintf(stderr, "Usage: %s [-6] ip_address tapdev\n", argv[0]); exit(2); } - t = open(argv[2], O_RDWR | O_NONBLOCK); + if (strcmp("-6", argv[1]) == 0) { + v6 = true; + addr = argv[2]; + tapdev = argv[3]; + } else { + addr = argv[1]; + tapdev = argv[2]; + } + + t = open(tapdev, O_RDWR | O_NONBLOCK); if (t < 0) err(EXIT_FAILURE, "open"); - s = socket(PF_INET, SOCK_DGRAM, 0); + if (v6) + s = socket(PF_INET6, SOCK_DGRAM, 0); + else + s = socket(PF_INET, SOCK_DGRAM, 0); if (s < 0) err(EXIT_FAILURE, "socket"); opt = 1; @@ -79,16 +96,26 @@ main(int argc, char **argv) if (ret == -1) err(EXIT_FAILURE, "setsockopt(SO_DONTROUTE)"); - dst.sin_len = sizeof(dst); - dst.sin_family = AF_INET; - dst.sin_port = htons(46120); - dst.sin_addr.s_addr = inet_addr(argv[1]); - if (dst.sin_addr.s_addr == htonl(INADDR_NONE)) { - fprintf(stderr, "Invalid address: %s\n", argv[1]); - exit(2); + if (v6) { + struct sockaddr_in6 *dst6 = ((struct sockaddr_in6*)&dst); + + dst.ss_len = sizeof(struct sockaddr_in6); + dst.ss_family = AF_INET6; + dst6->sin6_port = htons(port); + ret = inet_pton(AF_INET6, addr, &dst6->sin6_addr); + } else { + struct sockaddr_in *dst4 = ((struct sockaddr_in*)&dst); + + dst.ss_len = sizeof(struct sockaddr_in); + dst.ss_family = AF_INET; + dst4->sin_port = htons(port); + ret = inet_pton(AF_INET, addr, &dst4->sin_addr); } + if (ret != 1) + err(EXIT_FAILURE, "inet_pton returned %d", ret); + ret = sendto(s, sendbuf, strlen(sendbuf), 0, (struct sockaddr*)&dst, - dst.sin_len); + dst.ss_len); if (ret == -1) err(EXIT_FAILURE, "sendto"); Modified: projects/netbsd-tests-upstream-01-2017/usr.bin/sed/tests/sed2_test.sh ============================================================================== --- projects/netbsd-tests-upstream-01-2017/usr.bin/sed/tests/sed2_test.sh Tue Feb 7 18:37:46 2017 (r313398) +++ projects/netbsd-tests-upstream-01-2017/usr.bin/sed/tests/sed2_test.sh Tue Feb 7 18:47:16 2017 (r313399) @@ -47,8 +47,6 @@ inplace_symlink_src_head() } inplace_symlink_src_body() { - atf_expect_fail "Check for S_IFREG reverted in r312404" - echo foo > a atf_check ln -s a b atf_check -e not-empty -s not-exit:0 sed -i '' -e 's,foo,bar,g' b
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201702071847.v17IlGMO014131>