Date: Tue, 17 Nov 2015 16:16:19 +0000 (UTC) From: Nathan Whitehorn <nwhitehorn@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r290991 - in projects/powernv: arm/arm arm/freescale/imx arm/include arm/samsung/exynos arm/ti/am335x conf dev/ata/chipsets dev/hwpmc dev/isp dev/re dev/vmware/vmxnet3 dev/wpi fs/nfscli... Message-ID: <201511171616.tAHGGJP6073798@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: nwhitehorn Date: Tue Nov 17 16:16:18 2015 New Revision: 290991 URL: https://svnweb.freebsd.org/changeset/base/290991 Log: Bring up to date with HEAD. Added: projects/powernv/mips/atheros/qca953x_chip.c - copied unchanged from r290990, head/sys/mips/atheros/qca953x_chip.c projects/powernv/mips/atheros/qca953x_chip.h - copied unchanged from r290990, head/sys/mips/atheros/qca953x_chip.h projects/powernv/mips/atheros/qca953xreg.h - copied unchanged from r290990, head/sys/mips/atheros/qca953xreg.h Modified: projects/powernv/arm/arm/hdmi_if.m projects/powernv/arm/arm/pl310.c projects/powernv/arm/freescale/imx/imx6_ccm.c projects/powernv/arm/freescale/imx/imx6_ccmreg.h projects/powernv/arm/include/pcb.h projects/powernv/arm/include/pl310.h projects/powernv/arm/samsung/exynos/exynos5_ehci.c projects/powernv/arm/ti/am335x/am335x_lcd.c projects/powernv/arm/ti/am335x/tda19988.c projects/powernv/conf/kern.pre.mk projects/powernv/dev/ata/chipsets/ata-intel.c projects/powernv/dev/hwpmc/hwpmc_mod.c projects/powernv/dev/isp/isp.c projects/powernv/dev/isp/isp_freebsd.c projects/powernv/dev/isp/isp_freebsd.h projects/powernv/dev/isp/isp_library.c projects/powernv/dev/isp/ispmbox.h projects/powernv/dev/re/if_re.c projects/powernv/dev/vmware/vmxnet3/if_vmx.c projects/powernv/dev/wpi/if_wpi.c projects/powernv/fs/nfsclient/nfs_clvfsops.c projects/powernv/kern/kern_dump.c projects/powernv/kern/kern_jail.c projects/powernv/kern/kern_loginclass.c projects/powernv/kern/kern_racct.c projects/powernv/kern/kern_rctl.c projects/powernv/kern/kern_resource.c projects/powernv/mips/atheros/apb.c projects/powernv/mips/atheros/ar71xx_ehci.c projects/powernv/mips/atheros/ar71xx_gpio.c projects/powernv/mips/atheros/ar71xx_setup.c projects/powernv/mips/atheros/ar71xx_setup.h projects/powernv/mips/atheros/files.ar71xx projects/powernv/mips/atheros/if_arge.c projects/powernv/net/pfkeyv2.h projects/powernv/netinet6/ip6_forward.c projects/powernv/netinet6/ip6_output.c projects/powernv/netinet6/nd6.c projects/powernv/netinet6/nd6.h projects/powernv/netipsec/ipsec.h projects/powernv/netipsec/key.c projects/powernv/netipsec/xform_esp.c projects/powernv/netpfil/pf/pf.c projects/powernv/netsmb/smb_iod.c projects/powernv/opencrypto/xform.c projects/powernv/powerpc/aim/mmu_oea64.c projects/powernv/powerpc/aim/moea64_native.c projects/powernv/powerpc/ofw/ofw_machdep.c projects/powernv/powerpc/ofw/ofw_pci.c projects/powernv/powerpc/ofw/ofw_pcibus.c projects/powernv/powerpc/ofw/openpic_ofw.c projects/powernv/powerpc/powermac/cpcht.c projects/powernv/powerpc/powermac/kiic.c projects/powernv/powerpc/powermac/macgpio.c projects/powernv/powerpc/pseries/mmu_phyp.c projects/powernv/powerpc/pseries/phyp_console.c projects/powernv/powerpc/pseries/phyp_llan.c projects/powernv/powerpc/pseries/phyp_vscsi.c projects/powernv/powerpc/pseries/platform_chrp.c projects/powernv/powerpc/pseries/plpar_iommu.c projects/powernv/powerpc/pseries/rtas_pci.c projects/powernv/sparc64/include/dump.h projects/powernv/sparc64/sparc64/dump_machdep.c projects/powernv/sys/jail.h projects/powernv/sys/loginclass.h projects/powernv/sys/pmc.h projects/powernv/sys/resourcevar.h projects/powernv/vm/vm_page.h projects/powernv/vm/vm_pageout.c Directory Properties: projects/powernv/ (props changed) projects/powernv/conf/ (props changed) Modified: projects/powernv/arm/arm/hdmi_if.m ============================================================================== --- projects/powernv/arm/arm/hdmi_if.m Tue Nov 17 16:09:26 2015 (r290990) +++ projects/powernv/arm/arm/hdmi_if.m Tue Nov 17 16:16:18 2015 (r290991) @@ -35,8 +35,10 @@ INTERFACE hdmi; HEADER { #include <sys/eventhandler.h> - typedef void (*hdmi_event_hook)(void *, int); + typedef void (*hdmi_event_hook)(void *, device_t, int); EVENTHANDLER_DECLARE(hdmi_event, hdmi_event_hook); + + #define HDMI_EVENT_CONNECTED 0 } # Modified: projects/powernv/arm/arm/pl310.c ============================================================================== --- projects/powernv/arm/arm/pl310.c Tue Nov 17 16:09:26 2015 (r290990) +++ projects/powernv/arm/arm/pl310.c Tue Nov 17 16:16:18 2015 (r290991) @@ -90,7 +90,7 @@ static struct ofw_compat_data compat_dat {NULL, false} }; -void +static void pl310_print_config(struct pl310_softc *sc) { uint32_t aux, prefetch; Modified: projects/powernv/arm/freescale/imx/imx6_ccm.c ============================================================================== --- projects/powernv/arm/freescale/imx/imx6_ccm.c Tue Nov 17 16:09:26 2015 (r290990) +++ projects/powernv/arm/freescale/imx/imx6_ccm.c Tue Nov 17 16:16:18 2015 (r290991) @@ -88,14 +88,42 @@ WR4(struct ccm_softc *sc, bus_size_t off static void ccm_init_gates(struct ccm_softc *sc) { - /* Turns on... */ - WR4(sc, CCM_CCGR0, 0x0000003f); /* ahpbdma, aipstz 1 & 2 busses */ - WR4(sc, CCM_CCGR1, 0x00300c00); /* gpt, enet */ - WR4(sc, CCM_CCGR2, 0x0fffffc0); /* ipmux & ipsync (bridges), iomux, i2c */ - WR4(sc, CCM_CCGR3, 0x3ff00000); /* DDR memory controller */ - WR4(sc, CCM_CCGR4, 0x0000f300); /* pl301 bus crossbar */ - WR4(sc, CCM_CCGR5, 0x0ffc00c0); /* uarts, ssi, sdma */ - WR4(sc, CCM_CCGR6, 0x000003ff); /* usdhc 1-4, usboh3 */ + uint32_t reg; + + /* ahpbdma, aipstz 1 & 2 busses */ + reg = CCGR0_AIPS_TZ1 | CCGR0_AIPS_TZ2 | CCGR0_ABPHDMA; + WR4(sc, CCM_CCGR0, reg); + + /* gpt, enet */ + reg = CCGR1_ENET | CCGR1_GPT; + WR4(sc, CCM_CCGR1, reg); + + /* ipmux & ipsync (bridges), iomux, i2c */ + reg = CCGR2_I2C1 | CCGR2_I2C2 | CCGR2_I2C3 | CCGR2_IIM | + CCGR2_IOMUX_IPT | CCGR2_IPMUX1 | CCGR2_IPMUX2 | CCGR2_IPMUX3 | + CCGR2_IPSYNC_IP2APB_TZASC1 | CCGR2_IPSYNC_IP2APB_TZASC2 | + CCGR2_IPSYNC_VDOA; + WR4(sc, CCM_CCGR2, reg); + + /* DDR memory controller */ + reg = CCGR3_OCRAM | CCGR3_MMDC_CORE_IPG | + CCGR3_MMDC_CORE_ACLK_FAST | CCGR3_CG11 | CCGR3_CG13; + WR4(sc, CCM_CCGR3, reg); + + /* pl301 bus crossbar */ + reg = CCGR4_PL301_MX6QFAST1_S133 | + CCGR4_PL301_MX6QPER1_BCH | CCGR4_PL301_MX6QPER2_MAIN; + WR4(sc, CCM_CCGR4, reg); + + /* uarts, ssi, sdma */ + reg = CCGR5_SDMA | CCGR5_SSI1 | CCGR5_SSI2 | CCGR5_SSI3 | + CCGR5_UART | CCGR5_UART_SERIAL; + WR4(sc, CCM_CCGR5, reg); + + /* usdhc 1-4, usboh3 */ + reg = CCGR6_USBOH3 | CCGR6_USDHC1 | CCGR6_USDHC2 | + CCGR6_USDHC3 | CCGR6_USDHC4; + WR4(sc, CCM_CCGR6, reg); } static int Modified: projects/powernv/arm/freescale/imx/imx6_ccmreg.h ============================================================================== --- projects/powernv/arm/freescale/imx/imx6_ccmreg.h Tue Nov 17 16:09:26 2015 (r290990) +++ projects/powernv/arm/freescale/imx/imx6_ccmreg.h Tue Nov 17 16:16:18 2015 (r290991) @@ -58,12 +58,57 @@ #define CCM_CGPR 0x064 #define CCM_CGPR_INT_MEM_CLK_LPM (1 << 17) #define CCM_CCGR0 0x068 +#define CCGR0_AIPS_TZ1 (0x3 << 0) +#define CCGR0_AIPS_TZ2 (0x3 << 2) +#define CCGR0_ABPHDMA (0x3 << 4) #define CCM_CCGR1 0x06C +#define CCGR1_ENET (0x3 << 10) +#define CCGR1_GPT (0x3 << 20) #define CCM_CCGR2 0x070 +#define CCGR2_HDMI_TX (0x3 << 0) +#define CCGR2_HDMI_TX_ISFR (0x3 << 4) +#define CCGR2_I2C1 (0x3 << 6) +#define CCGR2_I2C2 (0x3 << 8) +#define CCGR2_I2C3 (0x3 << 10) +#define CCGR2_IIM (0x3 << 12) +#define CCGR2_IOMUX_IPT (0x3 << 14) +#define CCGR2_IPMUX1 (0x3 << 16) +#define CCGR2_IPMUX2 (0x3 << 18) +#define CCGR2_IPMUX3 (0x3 << 20) +#define CCGR2_IPSYNC_IP2APB_TZASC1 (0x3 << 22) +#define CCGR2_IPSYNC_IP2APB_TZASC2 (0x3 << 24) +#define CCGR2_IPSYNC_VDOA (0x3 << 26) #define CCM_CCGR3 0x074 +#define CCGR3_IPU1_IPU (0x3 << 0) +#define CCGR3_IPU1_DI0 (0x3 << 2) +#define CCGR3_IPU1_DI1 (0x3 << 4) +#define CCGR3_IPU2_IPU (0x3 << 6) +#define CCGR3_IPU2_DI0 (0x3 << 8) +#define CCGR3_IPU2_DI1 (0x3 << 10) +#define CCGR3_LDB_DI0 (0x3 << 12) +#define CCGR3_LDB_DI1 (0x3 << 14) +#define CCGR3_MMDC_CORE_ACLK_FAST (0x3 << 20) +#define CCGR3_CG11 (0x3 << 22) +#define CCGR3_MMDC_CORE_IPG (0x3 << 24) +#define CCGR3_CG13 (0x3 << 26) +#define CCGR3_OCRAM (0x3 << 28) #define CCM_CCGR4 0x078 +#define CCGR4_PL301_MX6QFAST1_S133 (0x3 << 8) +#define CCGR4_PL301_MX6QPER1_BCH (0x3 << 12) +#define CCGR4_PL301_MX6QPER2_MAIN (0x3 << 14) #define CCM_CCGR5 0x07C +#define CCGR5_SDMA (0x3 << 6) +#define CCGR5_SSI1 (0x3 << 18) +#define CCGR5_SSI2 (0x3 << 20) +#define CCGR5_SSI3 (0x3 << 22) +#define CCGR5_UART (0x3 << 24) +#define CCGR5_UART_SERIAL (0x3 << 26) #define CCM_CCGR6 0x080 +#define CCGR6_USBOH3 (0x3 << 0) +#define CCGR6_USDHC1 (0x3 << 2) +#define CCGR6_USDHC2 (0x3 << 4) +#define CCGR6_USDHC3 (0x3 << 6) +#define CCGR6_USDHC4 (0x3 << 8) #define CCM_CMEOR 0x088 #endif Modified: projects/powernv/arm/include/pcb.h ============================================================================== --- projects/powernv/arm/include/pcb.h Tue Nov 17 16:09:26 2015 (r290990) +++ projects/powernv/arm/include/pcb.h Tue Nov 17 16:16:18 2015 (r290991) @@ -52,14 +52,17 @@ struct pcb { #define PCB_OWNFPU 0x00000001 #define PCB_NOALIGNFLT 0x00000002 caddr_t pcb_onfault; /* On fault handler */ -#ifdef ARM_NEW_PMAP - uint32_t pcb_pagedir; /* TTB0 value */ -#else - vm_offset_t pcb_pagedir; /* PT hooks */ + vm_offset_t pcb_pagedir; /* TTB0 value */ + /* + * XXX: + * Variables pcb_pl1vec, pcb_l1vec, pcb_dacr are used solely + * by old PMAP. Keep them here for PCB binary compatibility + * between old and new PMAP. + */ uint32_t *pcb_pl1vec; /* PTR to vector_base L1 entry*/ uint32_t pcb_l1vec; /* Value to stuff on ctx sw */ u_int pcb_dacr; /* Domain Access Control Reg */ -#endif + struct vfp_state pcb_vfpstate; /* VP/NEON state */ u_int pcb_vfpcpu; /* VP/NEON last cpu */ } __aligned(8); /* Modified: projects/powernv/arm/include/pl310.h ============================================================================== --- projects/powernv/arm/include/pl310.h Tue Nov 17 16:09:26 2015 (r290990) +++ projects/powernv/arm/include/pl310.h Tue Nov 17 16:16:18 2015 (r290991) @@ -177,7 +177,6 @@ pl310_write4(struct pl310_softc *sc, bus bus_write_4(sc->sc_mem_res, off, val); } -void pl310_print_config(struct pl310_softc *sc); void pl310_set_ram_latency(struct pl310_softc *sc, uint32_t which_reg, uint32_t read, uint32_t write, uint32_t setup); Modified: projects/powernv/arm/samsung/exynos/exynos5_ehci.c ============================================================================== --- projects/powernv/arm/samsung/exynos/exynos5_ehci.c Tue Nov 17 16:09:26 2015 (r290990) +++ projects/powernv/arm/samsung/exynos/exynos5_ehci.c Tue Nov 17 16:16:18 2015 (r290991) @@ -122,7 +122,7 @@ static device_method_t ehci_methods[] = static driver_t ehci_driver = { "ehci", ehci_methods, - sizeof(ehci_softc_t) + sizeof(struct exynos_ehci_softc) }; static devclass_t ehci_devclass; Modified: projects/powernv/arm/ti/am335x/am335x_lcd.c ============================================================================== --- projects/powernv/arm/ti/am335x/am335x_lcd.c Tue Nov 17 16:09:26 2015 (r290990) +++ projects/powernv/arm/ti/am335x/am335x_lcd.c Tue Nov 17 16:16:18 2015 (r290991) @@ -800,7 +800,7 @@ done: } static void -am335x_lcd_hdmi_event(void *arg) +am335x_lcd_hdmi_event(void *arg, device_t hdmi, int event) { struct am335x_lcd_softc *sc; const struct videomode *videomode; @@ -1001,7 +1001,7 @@ am335x_lcd_attach(device_t dev) am335x_lcd_configure(sc); else sc->sc_hdmi_evh = EVENTHANDLER_REGISTER(hdmi_event, - am335x_lcd_hdmi_event, sc, 0); + am335x_lcd_hdmi_event, sc, EVENTHANDLER_PRI_ANY); return (0); } Modified: projects/powernv/arm/ti/am335x/tda19988.c ============================================================================== --- projects/powernv/arm/ti/am335x/tda19988.c Tue Nov 17 16:09:26 2015 (r290990) +++ projects/powernv/arm/ti/am335x/tda19988.c Tue Nov 17 16:16:18 2015 (r290991) @@ -635,7 +635,7 @@ tda19988_read_edid(struct tda19988_softc } } - EVENTHANDLER_INVOKE(hdmi_event, 0); + EVENTHANDLER_INVOKE(hdmi_event, sc->sc_dev, HDMI_EVENT_CONNECTED); done: if (sc->sc_version == TDA19988) tda19988_reg_set(sc, TDA_TX4, TX4_PD_RAM); Modified: projects/powernv/conf/kern.pre.mk ============================================================================== --- projects/powernv/conf/kern.pre.mk Tue Nov 17 16:09:26 2015 (r290990) +++ projects/powernv/conf/kern.pre.mk Tue Nov 17 16:16:18 2015 (r290991) @@ -157,15 +157,15 @@ DTRACE_CFLAGS+= -I$S/cddl/contrib/openso .endif DTRACE_CFLAGS+= -I$S/cddl/contrib/opensolaris/common/util -I$S -DDIS_MEM -DSMP DTRACE_ASM_CFLAGS= -x assembler-with-cpp -DLOCORE ${DTRACE_CFLAGS} -DTRACE_C= ${CC} -c ${DTRACE_CFLAGS} ${CDDL_CFLAGS} ${WERROR} ${PROF} ${.IMPSRC} -DTRACE_S= ${CC} -c ${DTRACE_ASM_CFLAGS} ${CDDL_CFLAGS} ${WERROR} ${.IMPSRC} +DTRACE_C= ${CC} -c ${DTRACE_CFLAGS} ${WERROR} ${PROF} ${.IMPSRC} +DTRACE_S= ${CC} -c ${DTRACE_ASM_CFLAGS} ${WERROR} ${.IMPSRC} # Special flags for managing the compat compiles for DTrace/FBT FBT_CFLAGS= -DBUILDING_DTRACE -nostdinc -I$S/cddl/dev/fbt/${MACHINE_CPUARCH} -I$S/cddl/dev/fbt -I$S/cddl/compat/opensolaris -I$S/cddl/contrib/opensolaris/uts/common -I$S ${CDDL_CFLAGS} .if ${MACHINE_CPUARCH} == "amd64" || ${MACHINE_CPUARCH} == "i386" FBT_CFLAGS+= -I$S/cddl/dev/fbt/x86 .endif -FBT_C= ${CC} -c ${FBT_CFLAGS} ${CDDL_CFLAGS} ${WERROR} ${PROF} ${.IMPSRC} +FBT_C= ${CC} -c ${FBT_CFLAGS} ${WERROR} ${PROF} ${.IMPSRC} .if ${MK_CTF} != "no" NORMAL_CTFCONVERT= ${CTFCONVERT} ${CTFFLAGS} ${.TARGET} Modified: projects/powernv/dev/ata/chipsets/ata-intel.c ============================================================================== --- projects/powernv/dev/ata/chipsets/ata-intel.c Tue Nov 17 16:09:26 2015 (r290990) +++ projects/powernv/dev/ata/chipsets/ata-intel.c Tue Nov 17 16:16:18 2015 (r290991) @@ -422,7 +422,7 @@ ata_intel_reset(device_t dev) mask |= (1 << smap[1]); pci_write_config(parent, 0x92, pci_read_config(parent, 0x92, 2) & ~mask, 2); - DELAY(10); + DELAY(100); pci_write_config(parent, 0x92, pci_read_config(parent, 0x92, 2) | mask, 2); Modified: projects/powernv/dev/hwpmc/hwpmc_mod.c ============================================================================== --- projects/powernv/dev/hwpmc/hwpmc_mod.c Tue Nov 17 16:09:26 2015 (r290990) +++ projects/powernv/dev/hwpmc/hwpmc_mod.c Tue Nov 17 16:16:18 2015 (r290991) @@ -1282,8 +1282,16 @@ pmc_process_csw_in(struct thread *td) */ if (PMC_TO_MODE(pm) == PMC_MODE_TS) { mtx_pool_lock_spin(pmc_mtxpool, pm); + + /* + * Use the saved value calculated after the most recent + * thread switch out to start this counter. Reset + * the saved count in case another thread from this + * process switches in before any threads switch out. + */ newvalue = PMC_PCPU_SAVED(cpu,ri) = pp->pp_pmcs[ri].pp_pmcval; + pp->pp_pmcs[ri].pp_pmcval = pm->pm_sc.pm_reloadcount; mtx_pool_unlock_spin(pmc_mtxpool, pm); } else { KASSERT(PMC_TO_MODE(pm) == PMC_MODE_TC, @@ -1431,31 +1439,43 @@ pmc_process_csw_out(struct thread *td) pcd->pcd_read_pmc(cpu, adjri, &newvalue); - tmp = newvalue - PMC_PCPU_SAVED(cpu,ri); - - PMCDBG3(CSW,SWO,1,"cpu=%d ri=%d tmp=%jd", cpu, ri, - tmp); - if (mode == PMC_MODE_TS) { + PMCDBG3(CSW,SWO,1,"cpu=%d ri=%d tmp=%jd (samp)", + cpu, ri, PMC_PCPU_SAVED(cpu,ri) - newvalue); /* * For sampling process-virtual PMCs, - * we expect the count to be - * decreasing as the 'value' - * programmed into the PMC is the - * number of events to be seen till - * the next sampling interrupt. + * newvalue is the number of events to be seen + * until the next sampling interrupt. + * We can just add the events left from this + * invocation to the counter, then adjust + * in case we overflow our range. + * + * (Recall that we reload the counter every + * time we use it.) */ - if (tmp < 0) - tmp += pm->pm_sc.pm_reloadcount; mtx_pool_lock_spin(pmc_mtxpool, pm); - pp->pp_pmcs[ri].pp_pmcval -= tmp; - if ((int64_t) pp->pp_pmcs[ri].pp_pmcval <= 0) - pp->pp_pmcs[ri].pp_pmcval += + + pp->pp_pmcs[ri].pp_pmcval += newvalue; + if (pp->pp_pmcs[ri].pp_pmcval > + pm->pm_sc.pm_reloadcount) + pp->pp_pmcs[ri].pp_pmcval -= pm->pm_sc.pm_reloadcount; + KASSERT(pp->pp_pmcs[ri].pp_pmcval > 0 && + pp->pp_pmcs[ri].pp_pmcval <= + pm->pm_sc.pm_reloadcount, + ("[pmc,%d] pp_pmcval outside of expected " + "range cpu=%d ri=%d pp_pmcval=%jx " + "pm_reloadcount=%jx", __LINE__, cpu, ri, + pp->pp_pmcs[ri].pp_pmcval, + pm->pm_sc.pm_reloadcount)); mtx_pool_unlock_spin(pmc_mtxpool, pm); } else { + tmp = newvalue - PMC_PCPU_SAVED(cpu,ri); + + PMCDBG3(CSW,SWO,1,"cpu=%d ri=%d tmp=%jd (count)", + cpu, ri, tmp); /* * For counting process-virtual PMCs, Modified: projects/powernv/dev/isp/isp.c ============================================================================== --- projects/powernv/dev/isp/isp.c Tue Nov 17 16:09:26 2015 (r290990) +++ projects/powernv/dev/isp/isp.c Tue Nov 17 16:16:18 2015 (r290991) @@ -2187,7 +2187,7 @@ isp_fibre_init_2400(ispsoftc_t *isp) size_t amt = 0; uint8_t *off; - vpinfo.vp_global_options = 0; + vpinfo.vp_global_options = ICB2400_VPGOPT_GEN_RIDA; if (ISP_CAP_VP0(isp)) { vpinfo.vp_global_options |= ICB2400_VPGOPT_VP0_DECOUPLE; vpinfo.vp_count = isp->isp_nchan; @@ -2207,7 +2207,8 @@ isp_fibre_init_2400(ispsoftc_t *isp) ISP_MEMZERO(&pi, sizeof (pi)); fcp2 = FCPARAM(isp, chan); if (fcp2->role != ISP_ROLE_NONE) { - pi.vp_port_options = ICB2400_VPOPT_ENABLED; + pi.vp_port_options = ICB2400_VPOPT_ENABLED | + ICB2400_VPOPT_ENA_SNSLOGIN; if (fcp2->role & ISP_ROLE_INITIATOR) pi.vp_port_options |= ICB2400_VPOPT_INI_ENABLE; if ((fcp2->role & ISP_ROLE_TARGET) == 0) @@ -2914,16 +2915,7 @@ isp_fclink_test(ispsoftc_t *isp, int cha } else { fcp->isp_fabric_params = 0; } - if (chan) { - fcp->isp_sns_hdl = NPH_RESERVED - chan; - r = isp_plogx(isp, chan, fcp->isp_sns_hdl, SNS_PORT_ID, PLOGX_FLG_CMD_PLOGI | PLOGX_FLG_COND_PLOGI | PLOGX_FLG_SKIP_PRLI, 0); - if (r) { - isp_prt(isp, ISP_LOGWARN, "%s: Chan %d cannot log into SNS", __func__, chan); - return (-1); - } - } else { - fcp->isp_sns_hdl = NPH_SNS_ID; - } + fcp->isp_sns_hdl = NPH_SNS_ID; r = isp_register_fc4_type_24xx(isp, chan); } else { fcp->isp_sns_hdl = SNS_ID; @@ -3167,7 +3159,7 @@ fail: * Don't scan "special" ids. */ if (ISP_CAP_2KLOGIN(isp)) { - if (handle >= NPH_RESERVED - isp->isp_nchan) + if (handle >= NPH_RESERVED) continue; } else { if (handle >= FL_ID && handle <= SNS_ID) @@ -4276,7 +4268,7 @@ isp_next_handle(ispsoftc_t *isp, uint16_ handle = *ohp; if (ISP_CAP_2KLOGIN(isp)) { minh = 0; - maxh = NPH_RESERVED - isp->isp_nchan; /* Reserve for SNS */ + maxh = NPH_RESERVED - 1; } else { minh = SNS_ID + 1; maxh = NPH_MAX - 1; @@ -6192,6 +6184,9 @@ isp_parse_async_fc(ispsoftc_t *isp, uint static int isp_handle_other_response(ispsoftc_t *isp, int type, isphdr_t *hp, uint32_t *optrp) { + isp_ridacq_t rid; + int chan, c; + switch (type) { case RQSTYPE_STATUS_CONT: isp_prt(isp, ISP_LOG_WARN1, "Ignored Continuation Response"); @@ -6199,6 +6194,23 @@ isp_handle_other_response(ispsoftc_t *is case RQSTYPE_MARKER: isp_prt(isp, ISP_LOG_WARN1, "Marker Response"); return (1); + case RQSTYPE_RPT_ID_ACQ: + isp_get_ridacq(isp, (isp_ridacq_t *)hp, &rid); + if (rid.ridacq_format == 0) { + for (chan = 0; chan < isp->isp_nchan; chan++) { + fcparam *fcp = FCPARAM(isp, chan); + if (fcp->role == ISP_ROLE_NONE) + continue; + c = (chan == 0) ? 127 : (chan - 1); + if (rid.ridacq_map[c / 16] & (1 << (c % 16))) + isp_async(isp, ISPASYNC_CHANGE_NOTIFY, + chan, ISPASYNC_CHANGE_OTHER); + } + } else { + isp_async(isp, ISPASYNC_CHANGE_NOTIFY, + rid.ridacq_vp_index, ISPASYNC_CHANGE_OTHER); + } + return (1); case RQSTYPE_ATIO: case RQSTYPE_CTIO: case RQSTYPE_ENABLE_LUN: @@ -6219,15 +6231,6 @@ isp_handle_other_response(ispsoftc_t *is } #endif /* FALLTHROUGH */ - case RQSTYPE_RPT_ID_ACQ: - if (IS_24XX(isp)) { - isp_ridacq_t rid; - isp_get_ridacq(isp, (isp_ridacq_t *)hp, &rid); - if (rid.ridacq_format == 0) { - } - return (1); - } - /* FALLTHROUGH */ case RQSTYPE_REQUEST: default: ISP_DELAY(100); Modified: projects/powernv/dev/isp/isp_freebsd.c ============================================================================== --- projects/powernv/dev/isp/isp_freebsd.c Tue Nov 17 16:09:26 2015 (r290990) +++ projects/powernv/dev/isp/isp_freebsd.c Tue Nov 17 16:16:18 2015 (r290991) @@ -4249,16 +4249,9 @@ isp_action(struct cam_sim *sim, union cc break; #endif case XPT_RESET_DEV: /* BDR the specified SCSI device */ - { - struct isp_fc *fc; - bus = cam_sim_bus(xpt_path_sim(ccb->ccb_h.path)); tgt = ccb->ccb_h.target_id; tgt |= (bus << 16); - if (IS_FC(isp)) - fc = ISP_FC_PC(isp, bus); - else - fc = NULL; error = isp_control(isp, ISPCTL_RESET_DEV, bus, tgt); if (error) { @@ -4269,14 +4262,13 @@ isp_action(struct cam_sim *sim, union cc * Reference Number, because the target will expect * that we re-start the CRN at 1 after a reset. */ - if (fc != NULL) - isp_fcp_reset_crn(fc, tgt, /*tgt_set*/ 1); + if (IS_FC(isp)) + isp_fcp_reset_crn(isp, bus, tgt, /*tgt_set*/ 1); ccb->ccb_h.status = CAM_REQ_CMP; } xpt_done(ccb); break; - } case XPT_ABORT: /* Abort the specified CCB */ { union ccb *accb = ccb->cab.abort_ccb; @@ -4854,7 +4846,7 @@ isp_async(ispsoftc_t *isp, ispasync_t cm isp_prt(isp, ISP_LOG_SANCFG|ISP_LOGDEBUG0, "Starting Loop Down Timer @ %lu", (unsigned long) time_uptime); } } - isp_fcp_reset_crn(fc, /*tgt*/0, /*tgt_set*/ 0); + isp_fcp_reset_crn(isp, bus, /*tgt*/0, /*tgt_set*/ 0); isp_prt(isp, ISP_LOGINFO, "Chan %d: %s", bus, msg); break; @@ -4887,7 +4879,7 @@ isp_async(ispsoftc_t *isp, ispasync_t cm if ((FCPARAM(isp, bus)->role & ISP_ROLE_INITIATOR) && (lp->prli_word3 & PRLI_WD3_TARGET_FUNCTION)) { lp->is_target = 1; - isp_fcp_reset_crn(fc, tgt, /*tgt_set*/ 1); + isp_fcp_reset_crn(isp, bus, tgt, /*tgt_set*/ 1); isp_make_here(isp, lp, bus, tgt); } if ((FCPARAM(isp, bus)->role & ISP_ROLE_TARGET) && @@ -4917,11 +4909,11 @@ changed: (lp->new_prli_word3 & PRLI_WD3_TARGET_FUNCTION))) { lp->is_target = !lp->is_target; if (lp->is_target) { - isp_fcp_reset_crn(fc, tgt, /*tgt_set*/ 1); + isp_fcp_reset_crn(isp, bus, tgt, /*tgt_set*/ 1); isp_make_here(isp, lp, bus, tgt); } else { isp_make_gone(isp, lp, bus, tgt); - isp_fcp_reset_crn(fc, tgt, /*tgt_set*/ 1); + isp_fcp_reset_crn(isp, bus, tgt, /*tgt_set*/ 1); } } if (lp->is_initiator != @@ -5490,23 +5482,23 @@ isp_common_dmateardown(ispsoftc_t *isp, * (needed for events like a LIP). */ void -isp_fcp_reset_crn(struct isp_fc *fc, uint32_t tgt, int tgt_set) +isp_fcp_reset_crn(ispsoftc_t *isp, int chan, uint32_t tgt, int tgt_set) { - int i; + struct isp_fc *fc = ISP_FC_PC(isp, chan); struct isp_nexus *nxp; + int i; if (tgt_set == 0) - isp_prt(fc->isp, ISP_LOG_SANCFG, "resetting CRN on all targets"); + isp_prt(isp, ISP_LOGDEBUG0, + "Chan %d resetting CRN on all targets", chan); else - isp_prt(fc->isp, ISP_LOG_SANCFG, "resetting CRN target %u", tgt); + isp_prt(isp, ISP_LOGDEBUG0, + "Chan %d resetting CRN on target %u", chan, tgt); for (i = 0; i < NEXUS_HASH_WIDTH; i++) { - nxp = fc->nexus_hash[i]; - while (nxp) { - if ((tgt_set != 0) && (tgt == nxp->tgt)) + for (nxp = fc->nexus_hash[i]; nxp != NULL; nxp = nxp->next) { + if (tgt_set == 0 || tgt == nxp->tgt) nxp->crnseed = 0; - - nxp = nxp->next; } } } @@ -5550,15 +5542,11 @@ isp_fcp_next_crn(ispsoftc_t *isp, uint8_ nxp->next = fc->nexus_hash[idx]; fc->nexus_hash[idx] = nxp; } - if (nxp) { - if (nxp->crnseed == 0) - nxp->crnseed = 1; - if (cmd) - PISP_PCMD(cmd)->crn = nxp->crnseed; - *crnp = nxp->crnseed++; - return (0); - } - return (-1); + if (nxp->crnseed == 0) + nxp->crnseed = 1; + PISP_PCMD(cmd)->crn = nxp->crnseed; + *crnp = nxp->crnseed++; + return (0); } /* Modified: projects/powernv/dev/isp/isp_freebsd.h ============================================================================== --- projects/powernv/dev/isp/isp_freebsd.h Tue Nov 17 16:09:26 2015 (r290990) +++ projects/powernv/dev/isp/isp_freebsd.h Tue Nov 17 16:16:18 2015 (r290991) @@ -745,7 +745,7 @@ int isp_fc_scratch_acquire(ispsoftc_t *, int isp_mstohz(int); void isp_platform_intr(void *); void isp_common_dmateardown(ispsoftc_t *, struct ccb_scsiio *, uint32_t); -void isp_fcp_reset_crn(struct isp_fc *, uint32_t, int); +void isp_fcp_reset_crn(ispsoftc_t *, int, uint32_t, int); int isp_fcp_next_crn(ispsoftc_t *, uint8_t *, XS_T *); /* Modified: projects/powernv/dev/isp/isp_library.c ============================================================================== --- projects/powernv/dev/isp/isp_library.c Tue Nov 17 16:09:26 2015 (r290990) +++ projects/powernv/dev/isp/isp_library.c Tue Nov 17 16:16:18 2015 (r290991) @@ -604,7 +604,8 @@ isp_fc_enable_vp(ispsoftc_t *isp, int ch vp->vp_mod_cnt = 1; vp->vp_mod_idx0 = chan; vp->vp_mod_cmd = VP_MODIFY_ENA; - vp->vp_mod_ports[0].options = ICB2400_VPOPT_ENABLED; + vp->vp_mod_ports[0].options = ICB2400_VPOPT_ENABLED | + ICB2400_VPOPT_ENA_SNSLOGIN; if (fcp->role & ISP_ROLE_INITIATOR) { vp->vp_mod_ports[0].options |= ICB2400_VPOPT_INI_ENABLE; } @@ -1733,6 +1734,10 @@ isp_get_ridacq(ispsoftc_t *isp, isp_rida int i; isp_get_hdr(isp, &src->ridacq_hdr, &dst->ridacq_hdr); ISP_IOXGET_32(isp, &src->ridacq_handle, dst->ridacq_handle); + ISP_IOXGET_8(isp, &src->ridacq_vp_acquired, dst->ridacq_vp_acquired); + ISP_IOXGET_8(isp, &src->ridacq_vp_setup, dst->ridacq_vp_setup); + ISP_IOXGET_8(isp, &src->ridacq_vp_index, dst->ridacq_vp_index); + ISP_IOXGET_8(isp, &src->ridacq_vp_status, dst->ridacq_vp_status); ISP_IOXGET_16(isp, &src->ridacq_vp_port_lo, dst->ridacq_vp_port_lo); ISP_IOXGET_8(isp, &src->ridacq_vp_port_hi, dst->ridacq_vp_port_hi); ISP_IOXGET_8(isp, &src->ridacq_format, dst->ridacq_format); @@ -1742,17 +1747,6 @@ isp_get_ridacq(ispsoftc_t *isp, isp_rida for (i = 0; i < sizeof (src->ridacq_reserved1) / sizeof (src->ridacq_reserved1[0]); i++) { ISP_IOXGET_16(isp, &src->ridacq_reserved1[i], dst->ridacq_reserved1[i]); } - if (dst->ridacq_format == 0) { - ISP_IOXGET_8(isp, &src->un.type0.ridacq_vp_acquired, dst->un.type0.ridacq_vp_acquired); - ISP_IOXGET_8(isp, &src->un.type0.ridacq_vp_setup, dst->un.type0.ridacq_vp_setup); - ISP_IOXGET_16(isp, &src->un.type0.ridacq_reserved0, dst->un.type0.ridacq_reserved0); - } else if (dst->ridacq_format == 1) { - ISP_IOXGET_16(isp, &src->un.type1.ridacq_vp_count, dst->un.type1.ridacq_vp_count); - ISP_IOXGET_8(isp, &src->un.type1.ridacq_vp_index, dst->un.type1.ridacq_vp_index); - ISP_IOXGET_8(isp, &src->un.type1.ridacq_vp_status, dst->un.type1.ridacq_vp_status); - } else { - ISP_MEMZERO(&dst->un, sizeof (dst->un)); - } } Modified: projects/powernv/dev/isp/ispmbox.h ============================================================================== --- projects/powernv/dev/isp/ispmbox.h Tue Nov 17 16:09:26 2015 (r290990) +++ projects/powernv/dev/isp/ispmbox.h Tue Nov 17 16:16:18 2015 (r290991) @@ -1485,18 +1485,10 @@ typedef struct { typedef struct { isphdr_t ridacq_hdr; uint32_t ridacq_handle; - union { - struct { - uint8_t ridacq_vp_acquired; - uint8_t ridacq_vp_setup; - uint16_t ridacq_reserved0; - } type0; /* type 0 */ - struct { - uint16_t ridacq_vp_count; - uint8_t ridacq_vp_index; - uint8_t ridacq_vp_status; - } type1; /* type 1 */ - } un; + uint8_t ridacq_vp_acquired; + uint8_t ridacq_vp_setup; + uint8_t ridacq_vp_index; + uint8_t ridacq_vp_status; uint16_t ridacq_vp_port_lo; uint8_t ridacq_vp_port_hi; uint8_t ridacq_format; /* 0 or 1 */ @@ -1506,8 +1498,11 @@ typedef struct { #define RIDACQ_STS_COMPLETE 0 #define RIDACQ_STS_UNACQUIRED 1 -#define RIDACQ_STS_CHANGED 20 - +#define RIDACQ_STS_CHANGED 2 +#define RIDACQ_STS_SNS_TIMEOUT 3 +#define RIDACQ_STS_SNS_REJECTED 4 +#define RIDACQ_STS_SCR_TIMEOUT 5 +#define RIDACQ_STS_SCR_REJECTED 6 /* * Simple Name Server Data Structures Modified: projects/powernv/dev/re/if_re.c ============================================================================== --- projects/powernv/dev/re/if_re.c Tue Nov 17 16:09:26 2015 (r290990) +++ projects/powernv/dev/re/if_re.c Tue Nov 17 16:16:18 2015 (r290991) @@ -1696,13 +1696,13 @@ re_attach(device_t dev) #ifdef DEV_NETMAP re_netmap_attach(sc); #endif /* DEV_NETMAP */ + #ifdef RE_DIAG /* * Perform hardware diagnostic on the original RTL8169. * Some 32-bit cards were incorrectly wired and would * malfunction if plugged into a 64-bit slot. */ - if (hwrev == RL_HWREV_8169) { error = re_diag(sc); if (error) { @@ -2939,6 +2939,7 @@ re_start_locked(struct ifnet *ifp) return; } #endif /* DEV_NETMAP */ + if ((ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) != IFF_DRV_RUNNING || (sc->rl_flags & RL_FLAG_LINK) == 0) return; @@ -3851,6 +3852,11 @@ re_setwol(struct rl_softc *sc) CSR_READ_1(sc, RL_GPIO) & ~0x01); } if ((ifp->if_capenable & IFCAP_WOL) != 0) { + if ((sc->rl_flags & RL_FLAG_8168G_PLUS) != 0) { + /* Disable RXDV gate. */ + CSR_WRITE_4(sc, RL_MISC, CSR_READ_4(sc, RL_MISC) & + ~0x00080000); + } re_set_rxmode(sc); if ((sc->rl_flags & RL_FLAG_WOL_MANLINK) != 0) re_set_linkspeed(sc); Modified: projects/powernv/dev/vmware/vmxnet3/if_vmx.c ============================================================================== --- projects/powernv/dev/vmware/vmxnet3/if_vmx.c Tue Nov 17 16:09:26 2015 (r290990) +++ projects/powernv/dev/vmware/vmxnet3/if_vmx.c Tue Nov 17 16:16:18 2015 (r290991) @@ -510,6 +510,13 @@ vmxnet3_check_version(struct vmxnet3_sof return (0); } +static int +trunc_powerof2(int val) +{ + + return (1U << (fls(val) - 1)); +} + static void vmxnet3_initial_config(struct vmxnet3_softc *sc) { @@ -520,14 +527,14 @@ vmxnet3_initial_config(struct vmxnet3_so nqueue = VMXNET3_DEF_TX_QUEUES; if (nqueue > mp_ncpus) nqueue = mp_ncpus; - sc->vmx_max_ntxqueues = nqueue; + sc->vmx_max_ntxqueues = trunc_powerof2(nqueue); nqueue = vmxnet3_tunable_int(sc, "rxnqueue", vmxnet3_default_rxnqueue); if (nqueue > VMXNET3_MAX_RX_QUEUES || nqueue < 1) nqueue = VMXNET3_DEF_RX_QUEUES; if (nqueue > mp_ncpus) nqueue = mp_ncpus; - sc->vmx_max_nrxqueues = nqueue; + sc->vmx_max_nrxqueues = trunc_powerof2(nqueue); if (vmxnet3_tunable_int(sc, "mq_disable", vmxnet3_mq_disable)) { sc->vmx_max_nrxqueues = 1; Modified: projects/powernv/dev/wpi/if_wpi.c ============================================================================== --- projects/powernv/dev/wpi/if_wpi.c Tue Nov 17 16:09:26 2015 (r290990) +++ projects/powernv/dev/wpi/if_wpi.c Tue Nov 17 16:16:18 2015 (r290991) @@ -3791,8 +3791,8 @@ wpi_set_pslevel(struct wpi_softc *sc, ui if (level != 0) /* not CAM */ cmd.flags |= htole16(WPI_PS_ALLOW_SLEEP); /* Retrieve PCIe Active State Power Management (ASPM). */ - reg = pci_read_config(sc->sc_dev, sc->sc_cap_off + 0x10, 1); - if (!(reg & 0x1)) /* L0s Entry disabled. */ + reg = pci_read_config(sc->sc_dev, sc->sc_cap_off + PCIER_LINK_CTL, 1); + if (!(reg & PCIEM_LINK_CTL_ASPMC_L0S)) /* L0s Entry disabled. */ cmd.flags |= htole16(WPI_PS_PCI_PMGT); cmd.rxtimeout = htole32(pmgt->rxtimeout * IEEE80211_DUR_TU); @@ -5126,9 +5126,9 @@ wpi_apm_init(struct wpi_softc *sc) WPI_SETBITS(sc, WPI_DBG_HPET_MEM, 0xffff0000); /* Retrieve PCIe Active State Power Management (ASPM). */ - reg = pci_read_config(sc->sc_dev, sc->sc_cap_off + 0x10, 1); + reg = pci_read_config(sc->sc_dev, sc->sc_cap_off + PCIER_LINK_CTL, 1); /* Workaround for HW instability in PCIe L0->L0s->L1 transition. */ - if (reg & 0x02) /* L1 Entry enabled. */ + if (reg & PCIEM_LINK_CTL_ASPMC_L1) /* L1 Entry enabled. */ WPI_SETBITS(sc, WPI_GIO, WPI_GIO_L0S_ENA); else WPI_CLRBITS(sc, WPI_GIO, WPI_GIO_L0S_ENA); Modified: projects/powernv/fs/nfsclient/nfs_clvfsops.c ============================================================================== --- projects/powernv/fs/nfsclient/nfs_clvfsops.c Tue Nov 17 16:09:26 2015 (r290990) +++ projects/powernv/fs/nfsclient/nfs_clvfsops.c Tue Nov 17 16:16:18 2015 (r290991) @@ -216,10 +216,12 @@ newnfs_iosize(struct nfsmount *nmp) * Calculate the size used for io buffers. Use the larger * of the two sizes to minimise nfs requests but make sure * that it is at least one VM page to avoid wasting buffer - * space. + * space. It must also be at least NFS_DIRBLKSIZ, since + * that is the buffer size used for directories. */ iosize = imax(nmp->nm_rsize, nmp->nm_wsize); iosize = imax(iosize, PAGE_SIZE); + iosize = imax(iosize, NFS_DIRBLKSIZ); nmp->nm_mountp->mnt_stat.f_iosize = iosize; return (iosize); } Modified: projects/powernv/kern/kern_dump.c ============================================================================== --- projects/powernv/kern/kern_dump.c Tue Nov 17 16:09:26 2015 (r290990) +++ projects/powernv/kern/kern_dump.c Tue Nov 17 16:16:18 2015 (r290991) @@ -66,10 +66,10 @@ static size_t fragsz; struct dump_pa dump_map[DUMPSYS_MD_PA_NPAIRS]; +#if !defined(__powerpc__) && !defined(__sparc__) void dumpsys_gen_pa_init(void) { -#if !defined(__sparc__) && !defined(__powerpc__) int n, idx; bzero(dump_map, sizeof(dump_map)); @@ -80,8 +80,8 @@ dumpsys_gen_pa_init(void) dump_map[n].pa_start = dump_avail[idx]; dump_map[n].pa_size = dump_avail[idx + 1] - dump_avail[idx]; } -#endif } +#endif struct dump_pa * dumpsys_gen_pa_next(struct dump_pa *mdp) @@ -99,20 +99,24 @@ dumpsys_gen_pa_next(struct dump_pa *mdp) void dumpsys_gen_wbinv_all(void) { + } void dumpsys_gen_unmap_chunk(vm_paddr_t pa __unused, size_t chunk __unused, void *va __unused) { + } +#if !defined(__sparc__) int dumpsys_gen_write_aux_headers(struct dumperinfo *di) { return (0); } +#endif int dumpsys_buf_write(struct dumperinfo *di, char *ptr, size_t sz) @@ -233,6 +237,7 @@ dumpsys_foreach_chunk(dumpsys_callback_t return (seqnr); } +#if !defined(__sparc__) static off_t fileofs; static int @@ -391,3 +396,4 @@ dumpsys_generic(struct dumperinfo *di) printf("\n** DUMP FAILED (ERROR %d) **\n", error); return (error); } +#endif Modified: projects/powernv/kern/kern_jail.c ============================================================================== --- projects/powernv/kern/kern_jail.c Tue Nov 17 16:09:26 2015 (r290990) +++ projects/powernv/kern/kern_jail.c Tue Nov 17 16:16:18 2015 (r290991) @@ -4480,15 +4480,20 @@ SYSCTL_JAIL_PARAM(_allow_mount, zfs, CTL #ifdef RACCT void prison_racct_foreach(void (*callback)(struct racct *racct, - void *arg2, void *arg3), void *arg2, void *arg3) + void *arg2, void *arg3), void (*pre)(void), void (*post)(void), + void *arg2, void *arg3) { struct prison_racct *prr; ASSERT_RACCT_ENABLED(); sx_slock(&allprison_lock); + if (pre != NULL) + (pre)(); LIST_FOREACH(prr, &allprison_racct, prr_next) (callback)(prr->prr_racct, arg2, arg3); + if (post != NULL) + (post)(); sx_sunlock(&allprison_lock); } Modified: projects/powernv/kern/kern_loginclass.c ============================================================================== --- projects/powernv/kern/kern_loginclass.c Tue Nov 17 16:09:26 2015 (r290990) +++ projects/powernv/kern/kern_loginclass.c Tue Nov 17 16:16:18 2015 (r290991) @@ -234,12 +234,17 @@ sys_setloginclass(struct thread *td, str void loginclass_racct_foreach(void (*callback)(struct racct *racct, - void *arg2, void *arg3), void *arg2, void *arg3) + void *arg2, void *arg3), void (*pre)(void), void (*post)(void), + void *arg2, void *arg3) { struct loginclass *lc; rw_rlock(&loginclasses_lock); + if (pre != NULL) + (pre)(); LIST_FOREACH(lc, &loginclasses, lc_next) (callback)(lc->lc_racct, arg2, arg3); + if (post != NULL) + (post)(); rw_runlock(&loginclasses_lock); } Modified: projects/powernv/kern/kern_racct.c ============================================================================== --- projects/powernv/kern/kern_racct.c Tue Nov 17 16:09:26 2015 (r290990) +++ projects/powernv/kern/kern_racct.c Tue Nov 17 16:16:18 2015 (r290991) @@ -1156,6 +1156,7 @@ racct_decay_resource(struct racct *racct int64_t r_old, r_new; ASSERT_RACCT_ENABLED(); + mtx_assert(&racct_lock, MA_OWNED); resource = *(int *)res; r_old = racct->r_resources[resource]; @@ -1164,9 +1165,21 @@ racct_decay_resource(struct racct *racct if (r_old <= 0) return; - mtx_lock(&racct_lock); r_new = r_old * RACCT_DECAY_FACTOR / FSCALE; racct->r_resources[resource] = r_new; +} + +static void +racct_decay_pre(void) +{ + + mtx_lock(&racct_lock); +} + +static void +racct_decay_post(void) +{ + mtx_unlock(&racct_lock); } @@ -1176,9 +1189,12 @@ racct_decay(int resource) ASSERT_RACCT_ENABLED(); - ui_racct_foreach(racct_decay_resource, &resource, NULL); - loginclass_racct_foreach(racct_decay_resource, &resource, NULL); - prison_racct_foreach(racct_decay_resource, &resource, NULL); + ui_racct_foreach(racct_decay_resource, racct_decay_pre, + racct_decay_post, &resource, NULL); + loginclass_racct_foreach(racct_decay_resource, racct_decay_pre, + racct_decay_post, &resource, NULL); + prison_racct_foreach(racct_decay_resource, racct_decay_pre, + racct_decay_post, &resource, NULL); } static void Modified: projects/powernv/kern/kern_rctl.c ============================================================================== --- projects/powernv/kern/kern_rctl.c Tue Nov 17 16:09:26 2015 (r290990) +++ projects/powernv/kern/kern_rctl.c Tue Nov 17 16:16:18 2015 (r290991) @@ -1150,16 +1150,29 @@ rctl_rule_add(struct rctl_rule *rule) } static void +rctl_rule_pre_callback(void) +{ + + rw_wlock(&rctl_lock); +} + +static void +rctl_rule_post_callback(void) +{ + + rw_wunlock(&rctl_lock); +} + +static void rctl_rule_remove_callback(struct racct *racct, void *arg2, void *arg3) { struct rctl_rule *filter = (struct rctl_rule *)arg2; int found = 0; ASSERT_RACCT_ENABLED(); + rw_assert(&rctl_lock, RA_WLOCKED); - rw_wlock(&rctl_lock); found += rctl_racct_remove_rules(racct, filter); - rw_wunlock(&rctl_lock); *((int *)arg3) += found; } @@ -1186,12 +1199,15 @@ rctl_rule_remove(struct rctl_rule *filte return (ESRCH); } - loginclass_racct_foreach(rctl_rule_remove_callback, filter, - (void *)&found); - ui_racct_foreach(rctl_rule_remove_callback, filter, - (void *)&found); - prison_racct_foreach(rctl_rule_remove_callback, filter, - (void *)&found); + loginclass_racct_foreach(rctl_rule_remove_callback, + rctl_rule_pre_callback, rctl_rule_post_callback, + filter, (void *)&found); + ui_racct_foreach(rctl_rule_remove_callback, + rctl_rule_pre_callback, rctl_rule_post_callback, + filter, (void *)&found); + prison_racct_foreach(rctl_rule_remove_callback, + rctl_rule_pre_callback, rctl_rule_post_callback, + filter, (void *)&found); sx_assert(&allproc_lock, SA_LOCKED); rw_wlock(&rctl_lock); @@ -1425,15 +1441,14 @@ rctl_get_rules_callback(struct racct *ra struct sbuf *sb = (struct sbuf *)arg3; ASSERT_RACCT_ENABLED(); + rw_assert(&rctl_lock, RA_LOCKED); - rw_rlock(&rctl_lock); LIST_FOREACH(link, &racct->r_rule_links, rrl_next) { if (!rctl_rule_matches(link->rrl_rule, filter)) continue; rctl_rule_to_sbuf(sb, link->rrl_rule); sbuf_printf(sb, ","); } - rw_runlock(&rctl_lock); } int @@ -1494,9 +1509,15 @@ sys_rctl_get_rules(struct thread *td, st rw_runlock(&rctl_lock); } - loginclass_racct_foreach(rctl_get_rules_callback, filter, sb); - ui_racct_foreach(rctl_get_rules_callback, filter, sb); - prison_racct_foreach(rctl_get_rules_callback, filter, sb); + loginclass_racct_foreach(rctl_get_rules_callback, + rctl_rule_pre_callback, rctl_rule_post_callback, + filter, sb); + ui_racct_foreach(rctl_get_rules_callback, + rctl_rule_pre_callback, rctl_rule_post_callback, + filter, sb); + prison_racct_foreach(rctl_get_rules_callback, + rctl_rule_pre_callback, rctl_rule_post_callback, *** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201511171616.tAHGGJP6073798>