PERFORCE change 72015 for review
Robert Watson
rwatson at FreeBSD.org
Sun Feb 27 17:11:29 GMT 2005
http://perforce.freebsd.org/chv.cgi?CH=72015
Change 72015 by rwatson at rwatson_paprika on 2005/02/27 17:10:41
Further integration of netperf_socket:
- cpufreq locking.
Affected files ...
.. //depot/projects/netperf_socket/sys/conf/files#60 integrate
.. //depot/projects/netperf_socket/sys/conf/options.arm#4 integrate
.. //depot/projects/netperf_socket/sys/dev/acpica/acpi_perf.c#2 integrate
.. //depot/projects/netperf_socket/sys/dev/cpufreq/ichss.c#2 integrate
.. //depot/projects/netperf_socket/sys/dev/fxp/if_fxp.c#17 integrate
.. //depot/projects/netperf_socket/sys/dev/zs/zs_sbus.c#5 delete
.. //depot/projects/netperf_socket/sys/i386/cpufreq/est.c#2 integrate
.. //depot/projects/netperf_socket/sys/i386/cpufreq/p4tcc.c#2 integrate
.. //depot/projects/netperf_socket/sys/kern/kern_cpu.c#2 integrate
.. //depot/projects/netperf_socket/sys/netinet/ip_carp.c#2 integrate
.. //depot/projects/netperf_socket/sys/pci/agp_ali.c#8 integrate
.. //depot/projects/netperf_socket/sys/sparc64/conf/GENERIC#18 integrate
.. //depot/projects/netperf_socket/sys/sparc64/conf/NOTES#11 integrate
.. //depot/projects/netperf_socket/sys/sys/param.h#34 integrate
Differences ...
==== //depot/projects/netperf_socket/sys/conf/files#60 (text+ko) ====
@@ -1,4 +1,4 @@
-# $FreeBSD: src/sys/conf/files,v 1.1000 2005/02/26 00:25:43 marius Exp $
+# $FreeBSD: src/sys/conf/files,v 1.1001 2005/02/27 15:23:57 marius Exp $
#
# The long compile-with and dependency lines are required because of
# limitations in config: backslash-newline doesn't work in strings, and
@@ -881,8 +881,6 @@
dev/xe/if_xe.c optional xe
dev/xe/if_xe_pccard.c optional xe pccard
dev/zs/zs.c optional zs
-dev/zs/zs_sbus.c optional zs fhc
-dev/zs/zs_sbus.c optional zs sbus
fs/deadfs/dead_vnops.c standard
fs/devfs/devfs_devs.c standard
fs/devfs/devfs_rule.c standard
==== //depot/projects/netperf_socket/sys/conf/options.arm#4 (text+ko) ====
@@ -1,6 +1,7 @@
-#$FreeBSD: src/sys/conf/options.arm,v 1.3 2004/11/10 22:08:27 cognet Exp $
+#$FreeBSD: src/sys/conf/options.arm,v 1.4 2005/02/26 22:41:07 cognet Exp $
ARM32_NEW_VM_LAYOUT opt_vm.h
ARM9_CACHE_WRITE_THROUGH opt_global.h
+ARM_CACHE_LOCK_ENABLE opt_global.h
ARMFPE opt_global.h
CPU_SA1100 opt_global.h
CPU_SA1110 opt_global.h
==== //depot/projects/netperf_socket/sys/dev/acpica/acpi_perf.c#2 (text+ko) ====
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_perf.c,v 1.12 2005/02/22 06:34:53 njl Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_perf.c,v 1.14 2005/02/27 02:43:02 njl Exp $");
#include "opt_acpi.h"
#include <sys/param.h>
@@ -152,6 +152,11 @@
return;
if (ACPI_FAILURE(AcpiEvaluateObject(handle, "_PSS", NULL, NULL)))
return;
+
+ /*
+ * Add a child to every CPU that has the right methods. In future
+ * versions of the ACPI spec, CPUs can have different settings.
+ */
if (BUS_ADD_CHILD(parent, 0, "acpi_perf", -1) == NULL)
device_printf(parent, "add acpi_perf child failed\n");
}
@@ -211,8 +216,9 @@
sc->px_curr_state = CPUFREQ_VAL_UNKNOWN;
if (acpi_perf_evaluate(dev) != 0)
return (ENXIO);
- cpufreq_register(dev);
AcpiOsQueueForExecution(OSD_PRIORITY_LO, acpi_px_startup, NULL);
+ if (!sc->info_only)
+ cpufreq_register(dev);
return (0);
}
==== //depot/projects/netperf_socket/sys/dev/cpufreq/ichss.c#2 (text+ko) ====
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/cpufreq/ichss.c,v 1.7 2005/02/22 06:31:45 njl Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/cpufreq/ichss.c,v 1.8 2005/02/27 02:43:02 njl Exp $");
#include <sys/param.h>
#include <sys/bus.h>
@@ -166,7 +166,11 @@
if (devclass_get_device(ichss_devclass, 0))
return (ENXIO);
- /* Add a child under the CPU parent. */
+ /*
+ * Add a child under the CPU parent. It appears that ICH SpeedStep
+ * only requires a single CPU to set the value (since the chipset
+ * is shared by all CPUs.) Thus, we only add a child to cpu 0.
+ */
parent = devclass_get_device(devclass_find("cpu"), 0);
KASSERT(parent != NULL, ("cpu parent is NULL"));
child = BUS_ADD_CHILD(parent, 0, "ichss", 0);
==== //depot/projects/netperf_socket/sys/dev/fxp/if_fxp.c#17 (text+ko) ====
@@ -28,7 +28,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/fxp/if_fxp.c,v 1.223 2005/02/15 17:47:57 ru Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/fxp/if_fxp.c,v 1.224 2005/02/27 15:12:50 mux Exp $");
/*
* Intel EtherExpress Pro/100B PCI Fast Ethernet driver
@@ -449,10 +449,19 @@
fxp_autosize_eeprom(sc);
/*
+ * Find out the chip revision; lump all 82557 revs together.
+ */
+ fxp_read_eeprom(sc, &data, 5, 1);
+ if ((data >> 8) == 1)
+ sc->revision = FXP_REV_82557;
+ else
+ sc->revision = pci_get_revid(dev);
+
+ /*
* Determine whether we must use the 503 serial interface.
*/
fxp_read_eeprom(sc, &data, 6, 1);
- if (sc->revision <= FXP_REV_82557 && (data & FXP_PHY_DEVICE_MASK) != 0
+ if (sc->revision == FXP_REV_82557 && (data & FXP_PHY_DEVICE_MASK) != 0
&& (data & FXP_PHY_SERIAL_ONLY))
sc->flags |= FXP_FLAG_SERIAL_MEDIA;
@@ -490,15 +499,6 @@
sc->rnr = 0;
/*
- * Find out the chip revision; lump all 82557 revs together.
- */
- fxp_read_eeprom(sc, &data, 5, 1);
- if ((data >> 8) == 1)
- sc->revision = FXP_REV_82557;
- else
- sc->revision = pci_get_revid(dev);
-
- /*
* Enable workarounds for certain chip revision deficiencies.
*
* Systems based on the ICH2/ICH2-M chip from Intel, and possibly
==== //depot/projects/netperf_socket/sys/i386/cpufreq/est.c#2 (text+ko) ====
@@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/i386/cpufreq/est.c,v 1.3 2005/02/24 20:20:11 njl Exp $");
+__FBSDID("$FreeBSD: src/sys/i386/cpufreq/est.c,v 1.4 2005/02/27 02:43:02 njl Exp $");
#include <sys/param.h>
#include <sys/bus.h>
@@ -582,6 +582,10 @@
if ((p[2] & 0x80) == 0)
return;
+ /*
+ * We add a child for each CPU since settings must be performed
+ * on each CPU in the SMP case.
+ */
if (BUS_ADD_CHILD(parent, 0, "est", -1) == NULL)
device_printf(parent, "add est child failed\n");
}
==== //depot/projects/netperf_socket/sys/i386/cpufreq/p4tcc.c#2 (text+ko) ====
@@ -37,7 +37,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/i386/cpufreq/p4tcc.c,v 1.9 2005/02/23 16:42:56 njl Exp $");
+__FBSDID("$FreeBSD: src/sys/i386/cpufreq/p4tcc.c,v 1.10 2005/02/27 02:43:02 njl Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -102,6 +102,17 @@
if ((cpu_feature & (CPUID_ACPI | CPUID_TM)) != (CPUID_ACPI | CPUID_TM))
return;
+
+ /* Make sure we're not being doubly invoked. */
+ if (device_find_child(parent, "p4tcc", -1) != NULL)
+ return;
+
+ /*
+ * We attach a p4tcc child for every CPU since settings need to
+ * be performed on every CPU in the SMP case. See section 13.15.3
+ * of the IA32 Intel Architecture Software Developer's Manual,
+ * Volume 3, for more info.
+ */
if (BUS_ADD_CHILD(parent, 0, "p4tcc", -1) == NULL)
device_printf(parent, "add p4tcc child failed\n");
}
==== //depot/projects/netperf_socket/sys/kern/kern_cpu.c#2 (text+ko) ====
@@ -25,13 +25,14 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/kern_cpu.c,v 1.10 2005/02/24 20:21:41 njl Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/kern_cpu.c,v 1.12 2005/02/27 01:34:08 njl Exp $");
#include <sys/param.h>
#include <sys/bus.h>
#include <sys/cpu.h>
#include <sys/eventhandler.h>
#include <sys/kernel.h>
+#include <sys/lock.h>
#include <sys/malloc.h>
#include <sys/module.h>
#include <sys/proc.h>
@@ -40,6 +41,7 @@
#include <sys/sysctl.h>
#include <sys/systm.h>
#include <sys/sbuf.h>
+#include <sys/sx.h>
#include <sys/timetc.h>
#include "cpufreq_if.h"
@@ -56,6 +58,7 @@
#define CF_MAX_LEVELS 64
struct cpufreq_softc {
+ struct sx lock;
struct cf_level curr_level;
int curr_priority;
struct cf_level saved_level;
@@ -75,6 +78,11 @@
TAILQ_HEAD(cf_setting_lst, cf_setting_array);
+#define CF_MTX_INIT(x) sx_init((x), "cpufreq lock")
+#define CF_MTX_LOCK(x) sx_xlock((x))
+#define CF_MTX_UNLOCK(x) sx_xunlock((x))
+#define CF_MTX_ASSERT(x) sx_assert((x), SX_XLOCKED)
+
static int cpufreq_attach(device_t dev);
static int cpufreq_detach(device_t dev);
static void cpufreq_evaluate(void *arg);
@@ -109,7 +117,13 @@
static devclass_t cpufreq_dc;
DRIVER_MODULE(cpufreq, cpu, cpufreq_driver, cpufreq_dc, 0, 0);
-static eventhandler_tag cf_ev_tag;
+static eventhandler_tag cf_ev_tag;
+
+static int cf_lowest_freq;
+TUNABLE_INT("debug.cpufreq.lowest", &cf_lowest_freq);
+SYSCTL_NODE(_debug, OID_AUTO, cpufreq, CTLFLAG_RD, NULL, "cpufreq debugging");
+SYSCTL_INT(_debug_cpufreq, OID_AUTO, lowest, CTLFLAG_RW, &cf_lowest_freq, 1,
+ "Don't provide levels below this frequency.");
static int
cpufreq_attach(device_t dev)
@@ -123,6 +137,7 @@
sc->dev = dev;
sysctl_ctx_init(&sc->sysctl_ctx);
TAILQ_INIT(&sc->all_levels);
+ CF_MTX_INIT(&sc->lock);
sc->curr_level.total_set.freq = CPUFREQ_VAL_UNKNOWN;
sc->saved_level.total_set.freq = CPUFREQ_VAL_UNKNOWN;
sc->max_mhz = CPUFREQ_VAL_UNKNOWN;
@@ -182,6 +197,8 @@
int cpu_id, error, i;
sc = device_get_softc(dev);
+ error = 0;
+ set = NULL;
/*
* Check that the TSC isn't being used as a timecounter.
@@ -197,18 +214,29 @@
* If they did specify one, but the requested level has a lower
* priority, don't allow the new level right now.
*/
+ CF_MTX_LOCK(&sc->lock);
if (level == NULL) {
if (sc->saved_level.total_set.freq != CPUFREQ_VAL_UNKNOWN) {
level = &sc->saved_level;
priority = sc->saved_priority;
- } else
- return (ENXIO);
- } else if (priority < sc->curr_priority)
- return (EPERM);
+ } else {
+ error = ENXIO;
+ goto out;
+ }
+ } else if (priority < sc->curr_priority) {
+ error = EPERM;
+ goto out;
+ }
+
+ /* Reject levels that are below our specified threshold. */
+ if (level->total_set.freq <= cf_lowest_freq) {
+ error = EINVAL;
+ goto out;
+ }
/* If already at this level, just return. */
if (CPUFREQ_CMP(sc->curr_level.total_set.freq, level->total_set.freq))
- return (0);
+ goto out;
/* First, set the absolute frequency via its driver. */
set = &level->abs_set;
@@ -287,7 +315,8 @@
error = 0;
out:
- if (error)
+ CF_MTX_UNLOCK(&sc->lock);
+ if (error && set)
device_printf(set->dev, "set freq failed, err %d\n", error);
return (error);
}
@@ -304,12 +333,15 @@
uint64_t rate;
sc = device_get_softc(dev);
- curr_set = &sc->curr_level.total_set;
+ error = 0;
levels = NULL;
/* If we already know the current frequency, we're done. */
+ CF_MTX_LOCK(&sc->lock);
+ curr_set = &sc->curr_level.total_set;
if (curr_set->freq != CPUFREQ_VAL_UNKNOWN)
goto out;
+ CF_MTX_UNLOCK(&sc->lock);
/*
* We need to figure out the current level. Loop through every
@@ -324,11 +356,24 @@
if (error) {
if (error == E2BIG)
printf("cpufreq: need to increase CF_MAX_LEVELS\n");
- goto out;
+ free(levels, M_TEMP);
+ return (error);
}
error = device_get_children(device_get_parent(dev), &devs, &numdevs);
- if (error)
- goto out;
+ if (error) {
+ free(levels, M_TEMP);
+ return (error);
+ }
+
+ /*
+ * Reacquire the lock and search for the given level.
+ *
+ * XXX Note: this is not quite right since we really need to go
+ * through each level and compare both absolute and relative
+ * settings for each driver in the system before making a match.
+ * The estimation code below catches this case though.
+ */
+ CF_MTX_LOCK(&sc->lock);
for (i = 0; i < numdevs && curr_set->freq == CPUFREQ_VAL_UNKNOWN; i++) {
if (!device_is_attached(devs[i]))
continue;
@@ -365,10 +410,13 @@
}
out:
+ if (error == 0)
+ *level = sc->curr_level;
+
+ CF_MTX_UNLOCK(&sc->lock);
if (levels)
free(levels, M_TEMP);
- *level = sc->curr_level;
- return (0);
+ return (error);
}
static int
@@ -399,6 +447,7 @@
}
/* Get settings from all cpufreq drivers. */
+ CF_MTX_LOCK(&sc->lock);
for (i = 0; i < numdevs; i++) {
/* Skip devices that aren't ready. */
if (!device_is_attached(devs[i]))
@@ -474,6 +523,12 @@
/* Finally, output the list of levels. */
i = 0;
TAILQ_FOREACH(lev, &sc->all_levels, link) {
+ /* Skip levels that have a frequency that is too low. */
+ if (lev->total_set.freq <= cf_lowest_freq) {
+ sc->all_count--;
+ continue;
+ }
+
levels[i] = *lev;
i++;
}
@@ -486,11 +541,13 @@
TAILQ_REMOVE(&sc->all_levels, lev, link);
free(lev, M_TEMP);
}
+ sc->all_count = 0;
+
+ CF_MTX_UNLOCK(&sc->lock);
while ((set_arr = TAILQ_FIRST(&rel_sets)) != NULL) {
TAILQ_REMOVE(&rel_sets, set_arr, link);
free(set_arr, M_TEMP);
}
- sc->all_count = 0;
free(devs, M_TEMP);
free(sets, M_TEMP);
return (error);
@@ -508,6 +565,8 @@
struct cf_level *level, *search;
int i;
+ CF_MTX_ASSERT(&sc->lock);
+
list = &sc->all_levels;
for (i = 0; i < count; i++) {
level = malloc(sizeof(*level), M_TEMP, M_NOWAIT | M_ZERO);
@@ -543,6 +602,8 @@
struct cf_setting *set;
int i;
+ CF_MTX_ASSERT(&sc->lock);
+
TAILQ_FOREACH(search, &sc->all_levels, link) {
/* Skip this level if we've already modified it. */
for (i = 0; i < search->rel_count; i++) {
@@ -592,6 +653,8 @@
struct cf_setting *fill_set, *itr_set;
int i;
+ CF_MTX_ASSERT(&sc->lock);
+
/*
* Create a new level, copy it from the old one, and update the
* total frequency and power by the percentage specified in the
==== //depot/projects/netperf_socket/sys/netinet/ip_carp.c#2 (text+ko) ====
@@ -1,4 +1,4 @@
-/* $FreeBSD: src/sys/netinet/ip_carp.c,v 1.10 2005/02/26 13:55:07 glebius Exp $ */
+/* $FreeBSD: src/sys/netinet/ip_carp.c,v 1.11 2005/02/27 11:32:26 mlaier Exp $ */
/*
* Copyright (c) 2002 Michael Shalayeff. All rights reserved.
@@ -1118,7 +1118,7 @@
}
#ifdef INET6
-static struct ifaddr *
+struct ifaddr *
carp_iamatch6(void *v, struct in6_addr *taddr)
{
struct carp_if *cif = v;
@@ -1142,7 +1142,7 @@
return (NULL);
}
-static void *
+void *
carp_macmatch6(void *v, struct mbuf *m, const struct in6_addr *taddr)
{
struct m_tag *mtag;
==== //depot/projects/netperf_socket/sys/pci/agp_ali.c#8 (text+ko) ====
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/pci/agp_ali.c,v 1.16 2005/02/24 21:32:55 imp Exp $");
+__FBSDID("$FreeBSD: src/sys/pci/agp_ali.c,v 1.17 2005/02/27 13:05:34 cognet Exp $");
#include "opt_bus.h"
@@ -65,6 +65,8 @@
return NULL;
switch (pci_get_devid(dev)) {
+ case 0x167110b9:
+ return ("Ali M1671 host to AGP bridge");
case 0x154110b9:
return ("Ali M1541 host to AGP bridge");
case 0x162110b9:
==== //depot/projects/netperf_socket/sys/sparc64/conf/GENERIC#18 (text+ko) ====
@@ -18,7 +18,7 @@
#
# For hardware specific information check HARDWARE.TXT
#
-# $FreeBSD: src/sys/sparc64/conf/GENERIC,v 1.88 2005/01/30 09:27:49 marcel Exp $
+# $FreeBSD: src/sys/sparc64/conf/GENERIC,v 1.89 2005/02/27 15:23:58 marius Exp $
machine sparc64
cpu SUN4U
@@ -136,7 +136,6 @@
# Serial (COM) ports
#device sab # Siemens SAB82532 based serial ports
-#device zs # Zilog 8530 based serial ports
device uart # Multi-uart driver
device puc # Multi-channel uarts
==== //depot/projects/netperf_socket/sys/sparc64/conf/NOTES#11 (text+ko) ====
@@ -1,4 +1,4 @@
-# $FreeBSD: src/sys/sparc64/conf/NOTES,v 1.15 2005/01/14 13:16:13 ru Exp $
+# $FreeBSD: src/sys/sparc64/conf/NOTES,v 1.16 2005/02/27 15:23:58 marius Exp $
#
# This file contains machine dependent kernel configuration notes. For
# machine independent notes, look in /sys/conf/NOTES.
@@ -56,7 +56,6 @@
option OFWCONS_POLL_HZ=4 # 20 or more works best on Ultra2
device sab # Siemens SAB82532 based serial ports
-device zs # Zilog 8530 based serial ports
#####################################################################
==== //depot/projects/netperf_socket/sys/sys/param.h#34 (text+ko) ====
@@ -32,7 +32,7 @@
* SUCH DAMAGE.
*
* @(#)param.h 8.3 (Berkeley) 4/4/95
- * $FreeBSD: src/sys/sys/param.h,v 1.227 2005/02/25 19:46:41 brooks Exp $
+ * $FreeBSD: src/sys/sys/param.h,v 1.228 2005/02/26 21:47:54 ru Exp $
*/
#ifndef _SYS_PARAM_H_
@@ -57,7 +57,7 @@
* is created, otherwise 1.
*/
#undef __FreeBSD_version
-#define __FreeBSD_version 600015 /* Master, propagated to newvers */
+#define __FreeBSD_version 600016 /* Master, propagated to newvers */
#ifndef LOCORE
#include <sys/types.h>
More information about the p4-projects
mailing list