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...
Dimitry Andric
dim at FreeBSD.org
Sat Mar 7 15:09:51 UTC 2020
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 at 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 ***
More information about the svn-src-projects
mailing list