Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 7 Mar 2020 15:09:45 +0000 (UTC)
From:      Dimitry Andric <dim@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r358731 - in projects/clang1000-import: contrib/elftoolchain/readelf share/man/man9 share/mk sys/cam sys/cddl/contrib/opensolaris/uts/common/fs/zfs sys/conf sys/dev/cxgbe/tom sys/dev/ii...
Message-ID:  <202003071509.027F9jFv019006@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: dim
Date: Sat Mar  7 15:09:45 2020
New Revision: 358731
URL: https://svnweb.freebsd.org/changeset/base/358731

Log:
  Merge ^/head r358712 through r358730.

Added:
  projects/clang1000-import/sys/fs/mntfs/
     - copied from r358730, head/sys/fs/mntfs/
  projects/clang1000-import/sys/sys/smr_types.h
     - copied unchanged from r358730, head/sys/sys/smr_types.h
Modified:
  projects/clang1000-import/contrib/elftoolchain/readelf/readelf.c
  projects/clang1000-import/share/man/man9/counter.9
  projects/clang1000-import/share/mk/bsd.compat.mk
  projects/clang1000-import/sys/cam/cam_periph.c
  projects/clang1000-import/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu.c
  projects/clang1000-import/sys/conf/files
  projects/clang1000-import/sys/dev/cxgbe/tom/t4_tom.c
  projects/clang1000-import/sys/dev/cxgbe/tom/t4_tom.h
  projects/clang1000-import/sys/dev/iicbus/ad7417.c
  projects/clang1000-import/sys/dev/iicbus/ds1631.c
  projects/clang1000-import/sys/dev/iicbus/ds1775.c
  projects/clang1000-import/sys/dev/iicbus/max6690.c
  projects/clang1000-import/sys/kern/subr_counter.c
  projects/clang1000-import/sys/kern/subr_pcpu.c
  projects/clang1000-import/sys/kern/subr_smr.c
  projects/clang1000-import/sys/kern/vfs_cache.c
  projects/clang1000-import/sys/kern/vfs_subr.c
  projects/clang1000-import/sys/netinet/igmp.c
  projects/clang1000-import/sys/powerpc/powerpc/uma_machdep.c
  projects/clang1000-import/sys/sys/_smr.h
  projects/clang1000-import/sys/sys/bufobj.h
  projects/clang1000-import/sys/sys/counter.h
  projects/clang1000-import/sys/sys/kernel.h
  projects/clang1000-import/sys/sys/mount.h
  projects/clang1000-import/sys/sys/smr.h
  projects/clang1000-import/sys/ufs/ffs/ffs_alloc.c
  projects/clang1000-import/sys/ufs/ffs/ffs_vfsops.c
  projects/clang1000-import/sys/ufs/ufs/ufsmount.h
  projects/clang1000-import/sys/vm/swap_pager.c
  projects/clang1000-import/sys/vm/uma_core.c
  projects/clang1000-import/sys/vm/vm_object.c
  projects/clang1000-import/sys/vm/vm_page.c
  projects/clang1000-import/sys/vm/vm_radix.c
  projects/clang1000-import/sys/vm/vm_reserv.c
  projects/clang1000-import/usr.bin/netstat/inet.c
Directory Properties:
  projects/clang1000-import/   (props changed)
  projects/clang1000-import/contrib/elftoolchain/   (props changed)
  projects/clang1000-import/sys/cddl/contrib/opensolaris/   (props changed)

Modified: projects/clang1000-import/contrib/elftoolchain/readelf/readelf.c
==============================================================================
--- projects/clang1000-import/contrib/elftoolchain/readelf/readelf.c	Sat Mar  7 08:41:10 2020	(r358730)
+++ projects/clang1000-import/contrib/elftoolchain/readelf/readelf.c	Sat Mar  7 15:09:45 2020	(r358731)
@@ -3742,6 +3742,12 @@ dump_notes_data(struct readelf *re, const char *name, 
 		case NT_GNU_PROPERTY_TYPE_0:
 			dump_gnu_property_type_0(re, buf, sz);
 			return;
+		case NT_GNU_BUILD_ID:
+			printf("   Build ID: ");
+			for (i = 0; i < sz; i++)
+				printf("%02x", (unsigned char)buf[i]);
+			printf("\n");
+			return;
 		}
 	} else if (strcmp(name, "Xen") == 0) {
 		switch (type) {

Modified: projects/clang1000-import/share/man/man9/counter.9
==============================================================================
--- projects/clang1000-import/share/man/man9/counter.9	Sat Mar  7 08:41:10 2020	(r358730)
+++ projects/clang1000-import/share/man/man9/counter.9	Sat Mar  7 15:09:45 2020	(r358731)
@@ -25,7 +25,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd March 22, 2017
+.Dd March 6, 2020
 .Dt COUNTER 9
 .Os
 .Sh NAME
@@ -53,6 +53,8 @@
 .Fn counter_u64_zero "counter_u64_t c"
 .Ft int64_t
 .Fn counter_ratecheck "struct counter_rate *cr" "int64_t limit"
+.Fn COUNTER_U64_SYSINIT "counter_u64_t c"
+.Fn COUNTER_U64_DEFINE_EARLY "counter_u64_t c"
 .In sys/sysctl.h
 .Fn SYSCTL_COUNTER_U64 parent nbr name access ptr descr
 .Fn SYSCTL_ADD_COUNTER_U64 ctx parent nbr name access ptr descr
@@ -142,6 +144,20 @@ If the limit was reached on previous second, but was j
 then
 .Fn counter_ratecheck
 returns number of events since previous reset.
+.It Fn COUNTER_U64_SYSINIT c
+Define a
+.Xr SYSINIT 9
+initializer for the global counter
+.Fa c .
+.It Fn COUNTER_U64_DEFINE_EARLY c
+Define and initialize a global counter
+.Fa c .
+It is always safe to increment
+.Fa c ,
+though updates prior to the
+.Dv SI_SUB_COUNTER
+.Xr SYSINIT 9
+event are lost.
 .It Fn SYSCTL_COUNTER_U64 parent nbr name access ptr descr
 Declare a static
 .Xr sysctl 9
@@ -245,6 +261,7 @@ SYSCTL_COUNTER_U64_ARRAY(_debug, OID_AUTO, counter_arr
 .Xr malloc 9 ,
 .Xr ratecheck 9 ,
 .Xr sysctl 9 ,
+.Xr SYSINIT 9 ,
 .Xr uma 9
 .Sh HISTORY
 The

Modified: projects/clang1000-import/share/mk/bsd.compat.mk
==============================================================================
--- projects/clang1000-import/share/mk/bsd.compat.mk	Sat Mar  7 08:41:10 2020	(r358730)
+++ projects/clang1000-import/share/mk/bsd.compat.mk	Sat Mar  7 15:09:45 2020	(r358731)
@@ -4,8 +4,8 @@
 __<${_this:T}>__:
 
 .if defined(_LIBCOMPAT)
-COMPAT_ARCH=	${TARGET_ARCH}
-COMPAT_CPUTYPE=	${TARGET_CPUTYPE}
+COMPAT_ARCH?=	${TARGET_ARCH}
+COMPAT_CPUTYPE?= ${CPUTYPE_${_LIBCOMPAT}}
 .if (defined(WANT_COMPILER_TYPE) && ${WANT_COMPILER_TYPE} == gcc) || \
     (defined(X_COMPILER_TYPE) && ${X_COMPILER_TYPE} == gcc)
 COMPAT_COMPILER_TYPE=	gcc

Modified: projects/clang1000-import/sys/cam/cam_periph.c
==============================================================================
--- projects/clang1000-import/sys/cam/cam_periph.c	Sat Mar  7 08:41:10 2020	(r358730)
+++ projects/clang1000-import/sys/cam/cam_periph.c	Sat Mar  7 15:09:45 2020	(r358731)
@@ -649,7 +649,7 @@ cam_periph_invalidate(struct cam_periph *periph)
 
 	cam_periph_assert(periph, MA_OWNED);
 	/*
-	 * We only call this routine the first time a peripheral is
+	 * We only tear down the device the first time a peripheral is
 	 * invalidated.
 	 */
 	if ((periph->flags & CAM_PERIPH_INVALID) != 0)

Modified: projects/clang1000-import/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu.c
==============================================================================
--- projects/clang1000-import/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu.c	Sat Mar  7 08:41:10 2020	(r358730)
+++ projects/clang1000-import/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu.c	Sat Mar  7 15:09:45 2020	(r358731)
@@ -1752,7 +1752,7 @@ dmu_read_pages(objset_t *os, uint64_t object, vm_page_
 			break;
 		}
 		ASSERT(m->dirty == 0);
-		ASSERT(!pmap_page_is_mapped(m));
+		ASSERT(!pmap_page_is_write_mapped(m));
 
 		ASSERT(db->db_size > PAGE_SIZE);
 		bufoff = IDX_TO_OFF(m->pindex) % db->db_size;
@@ -1867,7 +1867,7 @@ dmu_read_pages(objset_t *os, uint64_t object, vm_page_
 			break;
 		}
 		ASSERT(m->dirty == 0);
-		ASSERT(!pmap_page_is_mapped(m));
+		ASSERT(!pmap_page_is_write_mapped(m));
 
 		ASSERT(db->db_size > PAGE_SIZE);
 		bufoff = IDX_TO_OFF(m->pindex) % db->db_size;

Modified: projects/clang1000-import/sys/conf/files
==============================================================================
--- projects/clang1000-import/sys/conf/files	Sat Mar  7 08:41:10 2020	(r358730)
+++ projects/clang1000-import/sys/conf/files	Sat Mar  7 15:09:45 2020	(r358731)
@@ -3479,6 +3479,7 @@ fs/fuse/fuse_main.c		optional fusefs
 fs/fuse/fuse_node.c		optional fusefs
 fs/fuse/fuse_vfsops.c		optional fusefs
 fs/fuse/fuse_vnops.c		optional fusefs
+fs/mntfs/mntfs_vnops.c		standard
 fs/msdosfs/msdosfs_conv.c	optional msdosfs
 fs/msdosfs/msdosfs_denode.c	optional msdosfs
 fs/msdosfs/msdosfs_fat.c	optional msdosfs

Modified: projects/clang1000-import/sys/dev/cxgbe/tom/t4_tom.c
==============================================================================
--- projects/clang1000-import/sys/dev/cxgbe/tom/t4_tom.c	Sat Mar  7 08:41:10 2020	(r358730)
+++ projects/clang1000-import/sys/dev/cxgbe/tom/t4_tom.c	Sat Mar  7 15:09:45 2020	(r358731)
@@ -187,6 +187,8 @@ init_toepcb(struct vi_info *vi, struct toepcb *toep)
 	if (ulp_mode(toep) == ULP_MODE_TCPDDP)
 		ddp_init_toep(toep);
 
+	toep->flags |= TPF_INITIALIZED;
+
 	return (0);
 }
 
@@ -210,9 +212,11 @@ free_toepcb(struct toepcb *toep)
 	KASSERT(!(toep->flags & TPF_CPL_PENDING),
 	    ("%s: CPL pending", __func__));
 
-	if (ulp_mode(toep) == ULP_MODE_TCPDDP)
-		ddp_uninit_toep(toep);
-	tls_uninit_toep(toep);
+	if (toep->flags & TPF_INITIALIZED) {
+		if (ulp_mode(toep) == ULP_MODE_TCPDDP)
+			ddp_uninit_toep(toep);
+		tls_uninit_toep(toep);
+	}
 	free(toep, M_CXGBE);
 }
 

Modified: projects/clang1000-import/sys/dev/cxgbe/tom/t4_tom.h
==============================================================================
--- projects/clang1000-import/sys/dev/cxgbe/tom/t4_tom.h	Sat Mar  7 08:41:10 2020	(r358730)
+++ projects/clang1000-import/sys/dev/cxgbe/tom/t4_tom.h	Sat Mar  7 15:09:45 2020	(r358731)
@@ -73,6 +73,7 @@ enum {
 	TPF_SYNQE_EXPANDED = (1 << 9),	/* toepcb ready, tid context updated */
 	TPF_FORCE_CREDITS  = (1 << 10), /* always send credits */
 	TPF_KTLS           = (1 << 11), /* send TLS records from KTLS */
+	TPF_INITIALIZED    = (1 << 12), /* init_toepcb has been called */
 };
 
 enum {

Modified: projects/clang1000-import/sys/dev/iicbus/ad7417.c
==============================================================================
--- projects/clang1000-import/sys/dev/iicbus/ad7417.c	Sat Mar  7 08:41:10 2020	(r358730)
+++ projects/clang1000-import/sys/dev/iicbus/ad7417.c	Sat Mar  7 15:09:45 2020	(r358731)
@@ -2,7 +2,6 @@
  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
  *
  * Copyright (c) 2010 Andreas Tobler
- * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -143,7 +142,7 @@ ad7417_write(device_t dev, uint32_t addr, uint8_t reg,
 
 	for (;;)
 	{
-		if (iicbus_transfer(dev, msg, 1) == 0)
+		if (iicbus_transfer(dev, msg, nitems(msg)) == 0)
 			return (0);
 
 		if (++try > 5) {
@@ -167,7 +166,7 @@ ad7417_read_1(device_t dev, uint32_t addr, uint8_t reg
 
 	for (;;)
 	{
-		err = iicbus_transfer(dev, msg, 2);
+		err = iicbus_transfer(dev, msg, nitems(msg));
 		if (err != 0)
 			goto retry;
 
@@ -195,7 +194,7 @@ ad7417_read_2(device_t dev, uint32_t addr, uint8_t reg
 
 	for (;;)
 	{
-		err = iicbus_transfer(dev, msg, 2);
+		err = iicbus_transfer(dev, msg, nitems(msg));
 		if (err != 0)
 			goto retry;
 
@@ -230,7 +229,7 @@ ad7417_write_read(device_t dev, uint32_t addr, struct 
 
 	for (;;)
 	{
-		err = iicbus_transfer(dev, msg, 3);
+		err = iicbus_transfer(dev, msg, nitems(msg));
 		if (err != 0)
 			goto retry;
 
@@ -258,18 +257,18 @@ ad7417_init_adc(device_t dev, uint32_t addr)
 	/* Clear Config2 */
 	buf = 0;
 
-	err = ad7417_write(dev, addr, AD7417_CONFIG2, &buf, 1);
+	err = ad7417_write(dev, addr, AD7417_CONFIG2, &buf, sizeof(buf));
 
 	 /* Read & cache Config1 */
 	buf = 0;
-	err = ad7417_write(dev, addr, AD7417_CONFIG, &buf, 1);
+	err = ad7417_write(dev, addr, AD7417_CONFIG, &buf, sizeof(buf));
 	err = ad7417_read_1(dev, addr, AD7417_CONFIG, &buf);
 	adc741x_config = (uint8_t)buf;
 
 	/* Disable shutdown mode */
 	adc741x_config &= 0xfe;
 	buf = adc741x_config;
-	err = ad7417_write(dev, addr, AD7417_CONFIG, &buf, 1);
+	err = ad7417_write(dev, addr, AD7417_CONFIG, &buf, sizeof(buf));
 	if (err < 0)
 		return (-1);
 
@@ -310,7 +309,7 @@ ad7417_probe(device_t dev)
 static int
 ad7417_fill_sensor_prop(device_t dev)
 {
-	phandle_t child;
+	phandle_t child, node;
 	struct ad7417_softc *sc;
 	u_int id[10];
 	char location[96];
@@ -359,13 +358,27 @@ ad7417_fill_sensor_prop(device_t dev)
 	for (j = 0; j < i; j++)
 		sc->sc_sensors[j].therm.zone = id[j];
 
+	/* Some PowerMac's have the real location of the sensors on
+	   child nodes of the hwsensor-location node. Check for and
+	   fix the name if needed.
+	   This is needed to apply the below HACK with the diode.
+	*/
+	j = 0;
+	for (node = OF_child(child); node != 0; node = OF_peer(node)) {
+	    
+	    OF_getprop(node, "location", location, sizeof(location));
+	    strcpy(sc->sc_sensors[i].therm.name, location);
+	    j++; 
+	}
+
 	/* Finish setting up sensor properties */
 	for (j = 0; j < i; j++) {
 		sc->sc_sensors[j].dev = dev;
 	
 		/* HACK: Apple wired a random diode to the ADC line */
-		if (strstr(sc->sc_sensors[j].therm.name, "DIODE TEMP")
-		    != NULL) {
+		if ((strstr(sc->sc_sensors[j].therm.name, "DIODE TEMP")
+		    != NULL)
+		    || (strstr(sc->sc_sensors[j].therm.name, "AD1") != NULL)) {
 			sc->sc_sensors[j].type = ADC7417_TEMP_SENSOR;
 			sc->sc_sensors[j].therm.read =
 			    (int (*)(struct pmac_therm *))(ad7417_diode_read);
@@ -444,10 +457,10 @@ ad7417_attach(device_t dev)
 		}
 		/* I use i to pass the sensor id. */
 		SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
-		    unit, CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_NEEDGIANT, dev,
-		    i, ad7417_sensor_sysctl,
-		    sc->sc_sensors[i].type == ADC7417_TEMP_SENSOR ? "IK" : "I",
-		    desc);
+				unit, CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_MPSAFE,
+				dev, i, ad7417_sensor_sysctl,
+				sc->sc_sensors[i].type == ADC7417_TEMP_SENSOR ?
+				"IK" : "I", desc);
 	}
 	/* Dump sensor location, ID & type. */
 	if (bootverbose) {

Modified: projects/clang1000-import/sys/dev/iicbus/ds1631.c
==============================================================================
--- projects/clang1000-import/sys/dev/iicbus/ds1631.c	Sat Mar  7 08:41:10 2020	(r358730)
+++ projects/clang1000-import/sys/dev/iicbus/ds1631.c	Sat Mar  7 15:09:45 2020	(r358731)
@@ -2,7 +2,6 @@
  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
  *
  * Copyright (c) 2012 Andreas Tobler
- * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -135,7 +134,7 @@ ds1631_write(device_t dev, uint32_t addr, uint8_t reg,
 
 	for (;;)
 	{
-		if (iicbus_transfer(dev, msg, 1) == 0)
+		if (iicbus_transfer(dev, msg, nitems(msg)) == 0)
 			return (0);
 		if (++try > 5) {
 			device_printf(dev, "iicbus write failed\n");
@@ -158,7 +157,7 @@ ds1631_read_1(device_t dev, uint32_t addr, uint8_t reg
 
 	for (;;)
 	{
-		err = iicbus_transfer(dev, msg, 2);
+		err = iicbus_transfer(dev, msg, nitems(msg));
 		if (err != 0)
 			goto retry;
 
@@ -186,7 +185,7 @@ ds1631_read_2(device_t dev, uint32_t addr, uint8_t reg
 
 	for (;;)
 	{
-		err = iicbus_transfer(dev, msg, 2);
+		err = iicbus_transfer(dev, msg, nitems(msg));
 		if (err != 0)
 			goto retry;
 
@@ -275,7 +274,7 @@ ds1631_init(device_t dev, uint32_t addr)
 	 */
 	conf = DS1631_CONTROL_10BIT;
 
-	err = ds1631_write(dev, addr, DS1631_CONTROL, &conf, 1);
+	err = ds1631_write(dev, addr, DS1631_CONTROL, &conf, sizeof(conf));
 	if (err < 0) {
 		device_printf(dev, "ds1631 write config failed: %x\n", err);
 		return (-1);

Modified: projects/clang1000-import/sys/dev/iicbus/ds1775.c
==============================================================================
--- projects/clang1000-import/sys/dev/iicbus/ds1775.c	Sat Mar  7 08:41:10 2020	(r358730)
+++ projects/clang1000-import/sys/dev/iicbus/ds1775.c	Sat Mar  7 15:09:45 2020	(r358731)
@@ -2,7 +2,6 @@
  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
  *
  * Copyright (c) 2010 Andreas Tobler
- * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -104,7 +103,7 @@ ds1775_read_2(device_t dev, uint32_t addr, uint8_t reg
 
 	for (;;)
 	{
-		err = iicbus_transfer(dev, msg, 2);
+		err = iicbus_transfer(dev, msg, nitems(msg));
 		if (err != 0)
 			goto retry;
 

Modified: projects/clang1000-import/sys/dev/iicbus/max6690.c
==============================================================================
--- projects/clang1000-import/sys/dev/iicbus/max6690.c	Sat Mar  7 08:41:10 2020	(r358730)
+++ projects/clang1000-import/sys/dev/iicbus/max6690.c	Sat Mar  7 15:09:45 2020	(r358731)
@@ -2,7 +2,6 @@
  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
  *
  * Copyright (c) 2010 Andreas Tobler
- * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -124,7 +123,7 @@ max6690_read(device_t dev, uint32_t addr, uint8_t reg,
 
 	for (;;)
 	{
-		err = iicbus_transfer(dev, msg, 4);
+		err = iicbus_transfer(dev, msg, nitems(msg));
 		if (err != 0)
 			goto retry;
 		if (busy[0] & 0x80)
@@ -302,8 +301,9 @@ max6690_start(void *xdev)
 		    "Sensor Information");
 		/* I use i to pass the sensor id. */
 		SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(oid), OID_AUTO, "temp",
-		    CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_NEEDGIANT, dev, i % 2,
-		    max6690_sensor_sysctl, "IK", sysctl_desc);
+				CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_MPSAFE,
+				dev, i % 2,
+				max6690_sensor_sysctl, "IK", sysctl_desc);
 
 	}
 	/* Dump sensor location & ID. */

Modified: projects/clang1000-import/sys/kern/subr_counter.c
==============================================================================
--- projects/clang1000-import/sys/kern/subr_counter.c	Sat Mar  7 08:41:10 2020	(r358730)
+++ projects/clang1000-import/sys/kern/subr_counter.c	Sat Mar  7 15:09:45 2020	(r358731)
@@ -172,3 +172,21 @@ counter_ratecheck(struct counter_rate *cr, int64_t lim
 
 	return (val);
 }
+
+void
+counter_u64_sysinit(void *arg)
+{
+	counter_u64_t *cp;
+
+	cp = arg;
+	*cp = counter_u64_alloc(M_WAITOK);
+}
+
+void
+counter_u64_sysuninit(void *arg)
+{
+	counter_u64_t *cp;
+
+	cp = arg;
+	counter_u64_free(*cp);
+}

Modified: projects/clang1000-import/sys/kern/subr_pcpu.c
==============================================================================
--- projects/clang1000-import/sys/kern/subr_pcpu.c	Sat Mar  7 08:41:10 2020	(r358730)
+++ projects/clang1000-import/sys/kern/subr_pcpu.c	Sat Mar  7 15:09:45 2020	(r358731)
@@ -148,7 +148,7 @@ pcpu_zones_startup(void)
 	pcpu_zone_64 = uma_zcreate("64 pcpu", sizeof(uint64_t),
 	    NULL, NULL, NULL, NULL, UMA_ALIGN_PTR, UMA_ZONE_PCPU);
 }
-SYSINIT(pcpu_zones, SI_SUB_VM, SI_ORDER_ANY, pcpu_zones_startup, NULL);
+SYSINIT(pcpu_zones, SI_SUB_COUNTER, SI_ORDER_FIRST, pcpu_zones_startup, NULL);
 
 /*
  * First-fit extent based allocator for allocating space in the per-cpu

Modified: projects/clang1000-import/sys/kern/subr_smr.c
==============================================================================
--- projects/clang1000-import/sys/kern/subr_smr.c	Sat Mar  7 08:41:10 2020	(r358730)
+++ projects/clang1000-import/sys/kern/subr_smr.c	Sat Mar  7 15:09:45 2020	(r358731)
@@ -198,15 +198,15 @@ static uma_zone_t smr_zone;
 
 static SYSCTL_NODE(_debug, OID_AUTO, smr, CTLFLAG_RW | CTLFLAG_MPSAFE, NULL,
     "SMR Stats");
-static counter_u64_t advance = EARLY_COUNTER;
+static COUNTER_U64_DEFINE_EARLY(advance);
 SYSCTL_COUNTER_U64(_debug_smr, OID_AUTO, advance, CTLFLAG_RW, &advance, "");
-static counter_u64_t advance_wait = EARLY_COUNTER;
+static COUNTER_U64_DEFINE_EARLY(advance_wait);
 SYSCTL_COUNTER_U64(_debug_smr, OID_AUTO, advance_wait, CTLFLAG_RW, &advance_wait, "");
-static counter_u64_t poll = EARLY_COUNTER;
+static COUNTER_U64_DEFINE_EARLY(poll);
 SYSCTL_COUNTER_U64(_debug_smr, OID_AUTO, poll, CTLFLAG_RW, &poll, "");
-static counter_u64_t poll_scan = EARLY_COUNTER;
+static COUNTER_U64_DEFINE_EARLY(poll_scan);
 SYSCTL_COUNTER_U64(_debug_smr, OID_AUTO, poll_scan, CTLFLAG_RW, &poll_scan, "");
-static counter_u64_t poll_fail = EARLY_COUNTER;
+static COUNTER_U64_DEFINE_EARLY(poll_fail);
 SYSCTL_COUNTER_U64(_debug_smr, OID_AUTO, poll_fail, CTLFLAG_RW, &poll_fail, "");
 
 /*
@@ -631,15 +631,3 @@ smr_init(void)
 	smr_zone = uma_zcreate("SMR CPU", sizeof(struct smr),
 	    NULL, NULL, NULL, NULL, (CACHE_LINE_SIZE * 2) - 1, UMA_ZONE_PCPU);
 }
-
-static void
-smr_init_counters(void *unused)
-{
-
-	advance = counter_u64_alloc(M_WAITOK);
-	advance_wait = counter_u64_alloc(M_WAITOK);
-	poll = counter_u64_alloc(M_WAITOK);
-	poll_scan = counter_u64_alloc(M_WAITOK);
-	poll_fail = counter_u64_alloc(M_WAITOK);
-}
-SYSINIT(smr_counters, SI_SUB_CPU, SI_ORDER_ANY, smr_init_counters, NULL);

Modified: projects/clang1000-import/sys/kern/vfs_cache.c
==============================================================================
--- projects/clang1000-import/sys/kern/vfs_cache.c	Sat Mar  7 08:41:10 2020	(r358730)
+++ projects/clang1000-import/sys/kern/vfs_cache.c	Sat Mar  7 15:09:45 2020	(r358731)
@@ -345,11 +345,12 @@ SYSCTL_INT(_debug_sizeof, OID_AUTO, namecache, CTLFLAG
  */
 static SYSCTL_NODE(_vfs, OID_AUTO, cache, CTLFLAG_RW | CTLFLAG_MPSAFE, 0,
     "Name cache statistics");
-#define STATNODE_ULONG(name, descr)	\
+#define STATNODE_ULONG(name, descr)					\
 	SYSCTL_ULONG(_vfs_cache, OID_AUTO, name, CTLFLAG_RD, &name, 0, descr);
-#define STATNODE_COUNTER(name, descr)	\
-	static counter_u64_t __read_mostly name; \
-	SYSCTL_COUNTER_U64(_vfs_cache, OID_AUTO, name, CTLFLAG_RD, &name, descr);
+#define STATNODE_COUNTER(name, descr)					\
+	static COUNTER_U64_DEFINE_EARLY(name);				\
+	SYSCTL_COUNTER_U64(_vfs_cache, OID_AUTO, name, CTLFLAG_RD, &name, \
+	    descr);
 STATNODE_ULONG(numneg, "Number of negative cache entries");
 STATNODE_ULONG(numcache, "Number of cache entries");
 STATNODE_COUNTER(numcachehv, "Number of namecache entries with vnodes held");
@@ -1936,26 +1937,6 @@ nchinit(void *dummy __unused)
 	TAILQ_INIT(&ncneg_hot.nl_list);
 
 	mtx_init(&ncneg_shrink_lock, "ncnegs", NULL, MTX_DEF);
-
-	numcachehv = counter_u64_alloc(M_WAITOK);
-	numcalls = counter_u64_alloc(M_WAITOK);
-	dothits = counter_u64_alloc(M_WAITOK);
-	dotdothits = counter_u64_alloc(M_WAITOK);
-	numchecks = counter_u64_alloc(M_WAITOK);
-	nummiss = counter_u64_alloc(M_WAITOK);
-	nummisszap = counter_u64_alloc(M_WAITOK);
-	numposzaps = counter_u64_alloc(M_WAITOK);
-	numposhits = counter_u64_alloc(M_WAITOK);
-	numnegzaps = counter_u64_alloc(M_WAITOK);
-	numneghits = counter_u64_alloc(M_WAITOK);
-	numfullpathcalls = counter_u64_alloc(M_WAITOK);
-	numfullpathfail1 = counter_u64_alloc(M_WAITOK);
-	numfullpathfail2 = counter_u64_alloc(M_WAITOK);
-	numfullpathfail4 = counter_u64_alloc(M_WAITOK);
-	numfullpathfound = counter_u64_alloc(M_WAITOK);
-	zap_and_exit_bucket_relock_success = counter_u64_alloc(M_WAITOK);
-	numneg_evicted = counter_u64_alloc(M_WAITOK);
-	shrinking_skipped = counter_u64_alloc(M_WAITOK);
 }
 SYSINIT(vfs, SI_SUB_VFS, SI_ORDER_SECOND, nchinit, NULL);
 

Modified: projects/clang1000-import/sys/kern/vfs_subr.c
==============================================================================
--- projects/clang1000-import/sys/kern/vfs_subr.c	Sat Mar  7 08:41:10 2020	(r358730)
+++ projects/clang1000-import/sys/kern/vfs_subr.c	Sat Mar  7 15:09:45 2020	(r358731)
@@ -2289,6 +2289,8 @@ buf_vlist_add(struct buf *bp, struct bufobj *bo, b_xfl
 	int error;
 
 	ASSERT_BO_WLOCKED(bo);
+	KASSERT((bo->bo_flag & BO_NOBUFS) == 0,
+	    ("buf_vlist_add: bo %p does not allow bufs", bo));
 	KASSERT((xflags & BX_VNDIRTY) == 0 || (bo->bo_flag & BO_DEAD) == 0,
 	    ("dead bo %p", bo));
 	KASSERT((bp->b_xflags & (BX_VNDIRTY|BX_VNCLEAN)) == 0,

Modified: projects/clang1000-import/sys/netinet/igmp.c
==============================================================================
--- projects/clang1000-import/sys/netinet/igmp.c	Sat Mar  7 08:41:10 2020	(r358730)
+++ projects/clang1000-import/sys/netinet/igmp.c	Sat Mar  7 15:09:45 2020	(r358731)
@@ -145,6 +145,7 @@ static void	igmp_v3_suppress_group_record(struct in_mu
 static int	sysctl_igmp_default_version(SYSCTL_HANDLER_ARGS);
 static int	sysctl_igmp_gsr(SYSCTL_HANDLER_ARGS);
 static int	sysctl_igmp_ifinfo(SYSCTL_HANDLER_ARGS);
+static int	sysctl_igmp_stat(SYSCTL_HANDLER_ARGS);
 
 static const struct netisr_handler igmp_nh = {
 	.nh_name = "igmp",
@@ -260,8 +261,9 @@ VNET_DEFINE_STATIC(int, igmp_default_version) = IGMP_V
 /*
  * Virtualized sysctls.
  */
-SYSCTL_STRUCT(_net_inet_igmp, IGMPCTL_STATS, stats, CTLFLAG_VNET | CTLFLAG_RW,
-    &VNET_NAME(igmpstat), igmpstat, "");
+SYSCTL_PROC(_net_inet_igmp, IGMPCTL_STATS, stats,
+    CTLFLAG_VNET | CTLTYPE_STRUCT | CTLFLAG_RW | CTLFLAG_MPSAFE,
+    &VNET_NAME(igmpstat), 0, sysctl_igmp_stat, "S,igmpstat", "");
 SYSCTL_INT(_net_inet_igmp, OID_AUTO, recvifkludge, CTLFLAG_VNET | CTLFLAG_RW,
     &VNET_NAME(igmp_recvifkludge), 0,
     "Rewrite IGMPv1/v2 reports from 0.0.0.0 to contain subnet address");
@@ -333,6 +335,59 @@ igmp_restore_context(struct mbuf *m)
 #endif
 #endif
 	return (m->m_pkthdr.flowid);
+}
+
+/*
+ * IGMP statistics.
+ */
+static int
+sysctl_igmp_stat(SYSCTL_HANDLER_ARGS)
+{
+	struct igmpstat igps0;
+	int error;
+	char *p;
+
+	error = sysctl_wire_old_buffer(req, sizeof(V_igmpstat));
+	if (error)
+		return (error);
+
+	if (req->oldptr != NULL) {
+		if (req->oldlen < sizeof(V_igmpstat))
+			error = ENOMEM;
+		else 
+			error = SYSCTL_OUT(req, &V_igmpstat,
+			    sizeof(V_igmpstat));
+	} else
+		req->validlen = sizeof(V_igmpstat);
+	if (error)
+		goto out;
+	if (req->newptr != NULL) {
+		if (req->newlen < sizeof(V_igmpstat))
+			error = ENOMEM;
+		else
+			error = SYSCTL_IN(req, &igps0,
+			    sizeof(igps0));
+		if (error)
+			goto out;
+		/*
+		 * igps0 must be "all zero".
+		 */
+		p = (char *)&igps0;
+		while (*p == '\0' && p < (char *)&igps0 + sizeof(igps0))
+			p++;
+		if (p != (char *)&igps0 + sizeof(igps0)) {
+			error = EINVAL;
+			goto out;
+		}
+		/*
+		 * Avoid overwrite of the version and length field.
+		 */
+		igps0.igps_version = V_igmpstat.igps_version;
+		igps0.igps_len = V_igmpstat.igps_len;
+		bcopy(&igps0, &V_igmpstat, sizeof(V_igmpstat));
+	}
+out:
+	return (error);
 }
 
 /*

Modified: projects/clang1000-import/sys/powerpc/powerpc/uma_machdep.c
==============================================================================
--- projects/clang1000-import/sys/powerpc/powerpc/uma_machdep.c	Sat Mar  7 08:41:10 2020	(r358730)
+++ projects/clang1000-import/sys/powerpc/powerpc/uma_machdep.c	Sat Mar  7 15:09:45 2020	(r358731)
@@ -66,11 +66,6 @@ uma_small_alloc(uma_zone_t zone, vm_size_t bytes, int 
 		return (NULL);
 
 	pa = VM_PAGE_TO_PHYS(m);
-
-	/* On book-e sizeof(void *) < sizeof(vm_paddr_t) */
-	if ((vm_offset_t)pa != pa)
-		return (NULL);
-
 #ifdef __powerpc64__
 	if ((wait & M_NODUMP) == 0)
 		dump_add_page(pa);

Modified: projects/clang1000-import/sys/sys/_smr.h
==============================================================================
--- projects/clang1000-import/sys/sys/_smr.h	Sat Mar  7 08:41:10 2020	(r358730)
+++ projects/clang1000-import/sys/sys/_smr.h	Sat Mar  7 15:09:45 2020	(r358731)
@@ -35,4 +35,16 @@ typedef uint32_t	smr_seq_t;
 typedef int32_t		smr_delta_t;
 typedef struct smr 	*smr_t;
 
+#define	SMR_ENTERED(smr)						\
+    (curthread->td_critnest != 0 && zpcpu_get((smr))->c_seq != SMR_SEQ_INVALID)
+
+#define	SMR_ASSERT_ENTERED(smr)						\
+    KASSERT(SMR_ENTERED(smr), ("Not in smr section"))
+
+#define	SMR_ASSERT_NOT_ENTERED(smr)					\
+    KASSERT(!SMR_ENTERED(smr), ("In smr section."));
+
+#define SMR_ASSERT(ex, fn)						\
+    KASSERT((ex), (fn ": Assertion " #ex " failed at %s:%d", __FILE__, __LINE__))
+
 #endif	/* __SYS_SMR_H_ */

Modified: projects/clang1000-import/sys/sys/bufobj.h
==============================================================================
--- projects/clang1000-import/sys/sys/bufobj.h	Sat Mar  7 08:41:10 2020	(r358730)
+++ projects/clang1000-import/sys/sys/bufobj.h	Sat Mar  7 15:09:45 2020	(r358731)
@@ -117,6 +117,7 @@ struct bufobj {
 #define	BO_ONWORKLST	(1 << 0)	/* On syncer work-list */
 #define	BO_WWAIT	(1 << 1)	/* Wait for output to complete */
 #define	BO_DEAD		(1 << 2)	/* Dead; only with INVARIANTS */
+#define	BO_NOBUFS	(1 << 3)	/* No bufs allowed */
 
 #define	BO_LOCKPTR(bo)		(&(bo)->bo_lock)
 #define	BO_LOCK(bo)		rw_wlock(BO_LOCKPTR((bo)))

Modified: projects/clang1000-import/sys/sys/counter.h
==============================================================================
--- projects/clang1000-import/sys/sys/counter.h	Sat Mar  7 08:41:10 2020	(r358730)
+++ projects/clang1000-import/sys/sys/counter.h	Sat Mar  7 15:09:45 2020	(r358731)
@@ -74,5 +74,18 @@ struct counter_rate {
 
 int64_t	counter_ratecheck(struct counter_rate *, int64_t);
 
+#define	COUNTER_U64_SYSINIT(c)					\
+	SYSINIT(c##_counter_sysinit, SI_SUB_COUNTER,		\
+	    SI_ORDER_ANY, counter_u64_sysinit, &c);		\
+	SYSUNINIT(c##_counter_sysuninit, SI_SUB_COUNTER,	\
+	    SI_ORDER_ANY, counter_u64_sysuninit, &c)
+
+#define	COUNTER_U64_DEFINE_EARLY(c)				\
+	counter_u64_t __read_mostly c = EARLY_COUNTER;		\
+	COUNTER_U64_SYSINIT(c)
+
+void counter_u64_sysinit(void *);
+void counter_u64_sysuninit(void *);
+
 #endif	/* _KERNEL */
 #endif	/* ! __SYS_COUNTER_H__ */

Modified: projects/clang1000-import/sys/sys/kernel.h
==============================================================================
--- projects/clang1000-import/sys/sys/kernel.h	Sat Mar  7 08:41:10 2020	(r358730)
+++ projects/clang1000-import/sys/sys/kernel.h	Sat Mar  7 15:09:45 2020	(r358731)
@@ -91,7 +91,8 @@ enum sysinit_sub_id {
 	SI_SUB_DONE		= 0x0000001,	/* processed*/
 	SI_SUB_TUNABLES		= 0x0700000,	/* establish tunable values */
 	SI_SUB_COPYRIGHT	= 0x0800001,	/* first use of console*/
-	SI_SUB_VM		= 0x1000000,	/* virtual memory system init*/
+	SI_SUB_VM		= 0x1000000,	/* virtual memory system init */
+	SI_SUB_COUNTER		= 0x1100000,	/* counter(9) is initialized */
 	SI_SUB_KMEM		= 0x1800000,	/* kernel memory*/
 	SI_SUB_HYPERVISOR	= 0x1A40000,	/*
 						 * Hypervisor detection and

Modified: projects/clang1000-import/sys/sys/mount.h
==============================================================================
--- projects/clang1000-import/sys/sys/mount.h	Sat Mar  7 08:41:10 2020	(r358730)
+++ projects/clang1000-import/sys/sys/mount.h	Sat Mar  7 15:09:45 2020	(r358731)
@@ -940,6 +940,8 @@ extern	struct sx vfsconf_sx;
 #define	vfsconf_unlock()	sx_xunlock(&vfsconf_sx)
 #define	vfsconf_slock()		sx_slock(&vfsconf_sx)
 #define	vfsconf_sunlock()	sx_sunlock(&vfsconf_sx)
+struct vnode *mntfs_allocvp(struct mount *, struct vnode *);
+void   mntfs_freevp(struct vnode *);
 
 /*
  * Declarations for these vfs default operations are located in

Modified: projects/clang1000-import/sys/sys/smr.h
==============================================================================
--- projects/clang1000-import/sys/sys/smr.h	Sat Mar  7 08:41:10 2020	(r358730)
+++ projects/clang1000-import/sys/sys/smr.h	Sat Mar  7 15:09:45 2020	(r358731)
@@ -35,7 +35,8 @@
 
 /*
  * Safe memory reclamation.  See subr_smr.c for a description of the
- * algorithm.
+ * algorithm, and smr_types.h for macros to define and access SMR-protected
+ * data structures.
  *
  * Readers synchronize with smr_enter()/exit() and writers may either
  * free directly to a SMR UMA zone or use smr_synchronize or wait.
@@ -81,112 +82,6 @@ struct smr {
 
 #define	SMR_LAZY	0x0001		/* Higher latency write, fast read. */
 #define	SMR_DEFERRED	0x0002		/* Aggregate updates to wr_seq. */
-
-#define	SMR_ENTERED(smr)						\
-    (curthread->td_critnest != 0 && zpcpu_get((smr))->c_seq != SMR_SEQ_INVALID)
-
-#define	SMR_ASSERT_ENTERED(smr)						\
-    KASSERT(SMR_ENTERED(smr), ("Not in smr section"))
-
-#define	SMR_ASSERT_NOT_ENTERED(smr)					\
-    KASSERT(!SMR_ENTERED(smr), ("In smr section."));
-
-#define SMR_ASSERT(ex, fn)						\
-    KASSERT((ex), (fn ": Assertion " #ex " failed at %s:%d", __FILE__, __LINE__))
-
-/*
- * SMR Accessors are meant to provide safe access to SMR protected
- * pointers and prevent misuse and accidental access.
- *
- * Accessors are grouped by type:
- * entered	- Use while in a read section (between smr_enter/smr_exit())
- * serialized 	- Use while holding a lock that serializes writers.   Updates
- *		  are synchronized with readers via included barriers.
- * unserialized	- Use after the memory is out of scope and not visible to
- *		  readers.
- *
- * All acceses include a parameter for an assert to verify the required
- * synchronization.  For example, a writer might use:
- *
- * smr_serialized_store(pointer, value, mtx_owned(&writelock));
- *
- * These are only enabled in INVARIANTS kernels.
- */
-
-/* Type restricting pointer access to force smr accessors. */
-#define	SMR_TYPE_DECLARE(smrtype, type)					\
-typedef struct {							\
-	type	__ptr;		/* Do not access directly */		\
-} smrtype
-
-/*
- * Read from an SMR protected pointer while in a read section.
- */
-#define	smr_entered_load(p, smr) ({					\
-	SMR_ASSERT(SMR_ENTERED((smr)), "smr_entered_load");		\
-	(__typeof((p)->__ptr))atomic_load_acq_ptr((uintptr_t *)&(p)->__ptr); \
-})
-
-/*
- * Read from an SMR protected pointer while serialized by an
- * external mechanism.  'ex' should contain an assert that the
- * external mechanism is held.  i.e. mtx_owned()
- */
-#define	smr_serialized_load(p, ex) ({					\
-	SMR_ASSERT(ex, "smr_serialized_load");				\
-	(__typeof((p)->__ptr))atomic_load_ptr(&(p)->__ptr);		\
-})
-
-/*
- * Store 'v' to an SMR protected pointer while serialized by an
- * external mechanism.  'ex' should contain an assert that the
- * external mechanism is held.  i.e. mtx_owned()
- *
- * Writers that are serialized with mutual exclusion or on a single
- * thread should use smr_serialized_store() rather than swap.
- */
-#define	smr_serialized_store(p, v, ex) do {				\
-	SMR_ASSERT(ex, "smr_serialized_store");				\
-	__typeof((p)->__ptr) _v = (v);					\
-	atomic_store_rel_ptr((uintptr_t *)&(p)->__ptr, (uintptr_t)_v);	\
-} while (0)
-
-/*
- * swap 'v' with an SMR protected pointer and return the old value
- * while serialized by an external mechanism.  'ex' should contain
- * an assert that the external mechanism is provided.  i.e. mtx_owned()
- *
- * Swap permits multiple writers to update a pointer concurrently.
- */
-#define	smr_serialized_swap(p, v, ex) ({				\
-	SMR_ASSERT(ex, "smr_serialized_swap");				\
-	__typeof((p)->__ptr) _v = (v);					\
-	/* Release barrier guarantees contents are visible to reader */ \
-	atomic_thread_fence_rel();					\
-	(__typeof((p)->__ptr))atomic_swap_ptr(				\
-	    (uintptr_t *)&(p)->__ptr, (uintptr_t)_v);			\
-})
-
-/*
- * Read from an SMR protected pointer when no serialization is required
- * such as in the destructor callback or when the caller guarantees other
- * synchronization.
- */
-#define	smr_unserialized_load(p, ex) ({					\
-	SMR_ASSERT(ex, "smr_unserialized_load");			\
-	(__typeof((p)->__ptr))atomic_load_ptr(&(p)->__ptr);		\
-})
-
-/*
- * Store to an SMR protected pointer when no serialiation is required
- * such as in the destructor callback or when the caller guarantees other
- * synchronization.
- */
-#define	smr_unserialized_store(p, v, ex) do {				\
-	SMR_ASSERT(ex, "smr_unserialized_store");			\
-	__typeof((p)->__ptr) _v = (v);					\
-	atomic_store_ptr((uintptr_t *)&(p)->__ptr, (uintptr_t)_v);	\
-} while (0)
 
 /*
  * Return the current write sequence number.  This is not the same as the

Copied: projects/clang1000-import/sys/sys/smr_types.h (from r358730, head/sys/sys/smr_types.h)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ projects/clang1000-import/sys/sys/smr_types.h	Sat Mar  7 15:09:45 2020	(r358731, copy of r358730, head/sys/sys/smr_types.h)
@@ -0,0 +1,138 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2019, 2020 Jeffrey Roberson <jeff@FreeBSD.org>
+ *
+ * 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 unmodified, 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 _SYS_SMR_TYPES_H_
+#define	_SYS_SMR_TYPES_H_
+
+#include <sys/_smr.h>
+
+/*
+ * SMR Accessors are meant to provide safe access to SMR protected
+ * pointers and prevent misuse and accidental access.
+ *
+ * Accessors are grouped by type:
+ * entered	- Use while in a read section (between smr_enter/smr_exit())
+ * serialized 	- Use while holding a lock that serializes writers.   Updates
+ *		  are synchronized with readers via included barriers.
+ * unserialized	- Use after the memory is out of scope and not visible to
+ *		  readers.
+ *
+ * All acceses include a parameter for an assert to verify the required
+ * synchronization.  For example, a writer might use:
+ *
+ * smr_serialized_store(pointer, value, mtx_owned(&writelock));
+ *
+ * These are only enabled in INVARIANTS kernels.
+ */
+
+/* Type restricting pointer access to force smr accessors. */
+#define	SMR_POINTER(type)						\
+struct {								\
+	type	__ptr;		/* Do not access directly */		\
+}
+
+/*
+ * Read from an SMR protected pointer while in a read section.
+ */
+#define	smr_entered_load(p, smr) ({					\
+	SMR_ASSERT(SMR_ENTERED((smr)), "smr_entered_load");		\
+	(__typeof((p)->__ptr))atomic_load_acq_ptr((uintptr_t *)&(p)->__ptr); \
+})
+
+/*
+ * Read from an SMR protected pointer while serialized by an
+ * external mechanism.  'ex' should contain an assert that the
+ * external mechanism is held.  i.e. mtx_owned()
+ */
+#define	smr_serialized_load(p, ex) ({					\
+	SMR_ASSERT(ex, "smr_serialized_load");				\
+	(__typeof((p)->__ptr))atomic_load_ptr(&(p)->__ptr);		\
+})
+
+/*
+ * Store 'v' to an SMR protected pointer while serialized by an
+ * external mechanism.  'ex' should contain an assert that the
+ * external mechanism is held.  i.e. mtx_owned()
+ *
+ * Writers that are serialized with mutual exclusion or on a single
+ * thread should use smr_serialized_store() rather than swap.
+ */
+#define	smr_serialized_store(p, v, ex) do {				\
+	SMR_ASSERT(ex, "smr_serialized_store");				\
+	__typeof((p)->__ptr) _v = (v);					\
+	atomic_store_rel_ptr((uintptr_t *)&(p)->__ptr, (uintptr_t)_v);	\
+} while (0)
+
+/*
+ * swap 'v' with an SMR protected pointer and return the old value
+ * while serialized by an external mechanism.  'ex' should contain
+ * an assert that the external mechanism is provided.  i.e. mtx_owned()
+ *
+ * Swap permits multiple writers to update a pointer concurrently.
+ */
+#define	smr_serialized_swap(p, v, ex) ({				\
+	SMR_ASSERT(ex, "smr_serialized_swap");				\
+	__typeof((p)->__ptr) _v = (v);					\
+	/* Release barrier guarantees contents are visible to reader */ \
+	atomic_thread_fence_rel();					\
+	(__typeof((p)->__ptr))atomic_swap_ptr(				\
+	    (uintptr_t *)&(p)->__ptr, (uintptr_t)_v);			\
+})
+
+/*
+ * Read from an SMR protected pointer when no serialization is required
+ * such as in the destructor callback or when the caller guarantees other
+ * synchronization.
+ */
+#define	smr_unserialized_load(p, ex) ({					\
+	SMR_ASSERT(ex, "smr_unserialized_load");			\
+	(__typeof((p)->__ptr))atomic_load_ptr(&(p)->__ptr);		\
+})
+
+/*
+ * Store to an SMR protected pointer when no serialiation is required
+ * such as in the destructor callback or when the caller guarantees other
+ * synchronization.
+ */
+#define	smr_unserialized_store(p, v, ex) do {				\
+	SMR_ASSERT(ex, "smr_unserialized_store");			\
+	__typeof((p)->__ptr) _v = (v);					\
+	atomic_store_ptr((uintptr_t *)&(p)->__ptr, (uintptr_t)_v);	\
+} while (0)
+
+#ifndef _KERNEL
+
+/*
+ * Load an SMR protected pointer when accessing kernel data structures through
+ * libkvm.
+ */
+#define	smr_kvm_load(p) ((p)->__ptr)
+
+#endif /* !_KERNEL */
+#endif /* !_SYS_SMR_TYPES_H_ */

Modified: projects/clang1000-import/sys/ufs/ffs/ffs_alloc.c
==============================================================================
--- projects/clang1000-import/sys/ufs/ffs/ffs_alloc.c	Sat Mar  7 08:41:10 2020	(r358730)
+++ projects/clang1000-import/sys/ufs/ffs/ffs_alloc.c	Sat Mar  7 15:09:45 2020	(r358731)
@@ -3594,6 +3594,7 @@ buffered_write(fp, uio, active_cred, flags, td)
 	struct inode *ip;
 	struct buf *bp;
 	struct fs *fs;
+	struct ufsmount *ump;
 	struct filedesc *fdp;
 	int error;
 	daddr_t lbn;
@@ -3622,10 +3623,12 @@ buffered_write(fp, uio, active_cred, flags, td)
 		return (EINVAL);
 	}
 	ip = VTOI(vp);
-	if (ITODEVVP(ip) != devvp) {
+	ump = ip->i_ump;
+	if (ump->um_odevvp != devvp) {
 		vput(vp);
 		return (EINVAL);
 	}
+	devvp = ump->um_devvp;
 	fs = ITOFS(ip);
 	vput(vp);
 	foffset_lock_uio(fp, uio, flags);

Modified: projects/clang1000-import/sys/ufs/ffs/ffs_vfsops.c
==============================================================================
--- projects/clang1000-import/sys/ufs/ffs/ffs_vfsops.c	Sat Mar  7 08:41:10 2020	(r358730)
+++ projects/clang1000-import/sys/ufs/ffs/ffs_vfsops.c	Sat Mar  7 15:09:45 2020	(r358731)
@@ -151,7 +151,7 @@ static const char *ffs_opts[] = { "acls", "async", "no
 static int
 ffs_mount(struct mount *mp)
 {
-	struct vnode *devvp;
+	struct vnode *devvp, *odevvp;
 	struct thread *td;
 	struct ufsmount *ump = NULL;
 	struct fs *fs;
@@ -246,6 +246,7 @@ ffs_mount(struct mount *mp)
 	if (mp->mnt_flag & MNT_UPDATE) {
 		ump = VFSTOUFS(mp);
 		fs = ump->um_fs;
+		odevvp = ump->um_odevvp;
 		devvp = ump->um_devvp;
 		if (fsckpid == -1 && ump->um_fsckpid > 0) {
 			if ((error = ffs_flushfiles(mp, WRITECLOSE, td)) != 0 ||
@@ -337,16 +338,15 @@ ffs_mount(struct mount *mp)
 			 * If upgrade to read-write by non-root, then verify
 			 * that user has necessary permissions on the device.
 			 */
-			vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY);
-			error = VOP_ACCESS(devvp, VREAD | VWRITE,
+			vn_lock(odevvp, LK_EXCLUSIVE | LK_RETRY);
+			error = VOP_ACCESS(odevvp, VREAD | VWRITE,
 			    td->td_ucred, td);
 			if (error)
 				error = priv_check(td, PRIV_VFS_MOUNT_PERM);
+			VOP_UNLOCK(odevvp);
 			if (error) {
-				VOP_UNLOCK(devvp);
 				return (error);
 			}
-			VOP_UNLOCK(devvp);
 			fs->fs_flags &= ~FS_UNCLEAN;
 			if (fs->fs_clean == 0) {

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202003071509.027F9jFv019006>