PERFORCE change 146141 for review
Ed Schouten
ed at FreeBSD.org
Mon Jul 28 18:14:49 UTC 2008
http://perforce.freebsd.org/chv.cgi?CH=146141
Change 146141 by ed at ed_dull on 2008/07/28 18:14:18
IFC, before I create another diff.
Affected files ...
.. //depot/projects/mpsafetty/contrib/cvs/doc/HACKING.DOCS#2 integrate
.. //depot/projects/mpsafetty/lib/libc/gen/posix_spawn.3#2 integrate
.. //depot/projects/mpsafetty/lib/libc/gen/posix_spawn_file_actions_addopen.3#2 integrate
.. //depot/projects/mpsafetty/sys/dev/wi/if_wi.c#3 integrate
.. //depot/projects/mpsafetty/sys/dev/wi/if_wivar.h#2 integrate
.. //depot/projects/mpsafetty/sys/kern/sched_4bsd.c#2 integrate
.. //depot/projects/mpsafetty/sys/modules/et/Makefile#2 integrate
.. //depot/projects/mpsafetty/usr.bin/ldd/ldd.c#3 integrate
.. //depot/projects/mpsafetty/usr.sbin/config/config.y#2 integrate
.. //depot/projects/mpsafetty/usr.sbin/config/lang.l#2 integrate
Differences ...
==== //depot/projects/mpsafetty/contrib/cvs/doc/HACKING.DOCS#2 (text+ko) ====
@@ -12,11 +12,7 @@
@emph{ ... } emphasis - warnings, stress, etc. This will be
bracketed by underline characters in info files
(_ ... _) and in italics in PDF & probably in
- postscript & HTML.
- at strong{ ... } Similar to @emph{}, but the effect is to
- bracket with asterisks in info files (* ... *)
- and in bold in PDF & probably in postscript &
- HTML.
+ postscript & HTML.
@noindent Suppresses indentation of the following
paragraph. This can ocassionally be useful
after examples and the like.
@@ -26,7 +22,7 @@
Preformatted text should be marked as such (use @example... there may be other
ways) since many of the final output formats can use relational fonts otherwise
-and marking it as formatted should restrict it to a fixed width font. Keep
+and marking it as formatted should restrict it to a fixed wiidth font. Keep
this sort of text to 80 characters or less per line since larger may not be
properly viewable for some info users.
@@ -37,10 +33,5 @@
Use lots of index markers. Scan the index for the current style. Try to reuse
an existing entry if the meaning is similar.
-`makeinfo' 3.11 or greater is required for output generation since earlier
-versions do not support the @ifnottex & @ifnothtml commands. There may be
-other commands used in `cvs.texinfo' that are unsupported by earlier versions
-of `makeinfo' by the time you read this.
-
For more on using texinfo docs, see the `info texinfo' documentation or
http://www.gnu.org/manual/texinfo/texinfo.html .
==== //depot/projects/mpsafetty/lib/libc/gen/posix_spawn.3#2 (text+ko) ====
@@ -32,7 +32,7 @@
.\" the referee document. The original Standard can be obtained online at
.\" http://www.opengroup.org/unix/online.html.
.\"
-.\" $FreeBSD: src/lib/libc/gen/posix_spawn.3,v 1.1 2008/07/28 02:22:19 davidxu Exp $
+.\" $FreeBSD: src/lib/libc/gen/posix_spawn.3,v 1.2 2008/07/28 09:36:56 ed Exp $
.\"
.Dd Mar 24, 2008
.Dt POSIX_SPAWN 3
@@ -452,4 +452,4 @@
functions first appeared in
.Fx 8.0 .
.Sh AUTHORS
-.An Ed Schouten Aq Ed Schouten ed at FreeBSD.org
+.An Ed Schouten Aq ed at FreeBSD.org
==== //depot/projects/mpsafetty/lib/libc/gen/posix_spawn_file_actions_addopen.3#2 (text+ko) ====
@@ -32,7 +32,7 @@
.\" the referee document. The original Standard can be obtained online at
.\" http://www.opengroup.org/unix/online.html.
.\"
-.\" $FreeBSD: src/lib/libc/gen/posix_spawn_file_actions_addopen.3,v 1.1 2008/07/28 02:22:19 davidxu Exp $
+.\" $FreeBSD: src/lib/libc/gen/posix_spawn_file_actions_addopen.3,v 1.2 2008/07/28 09:36:56 ed Exp $
.\"
.Dd Mar 24, 2008
.Dt POSIX_SPAWN_FILE_ACTIONS_ADDOPEN 3
@@ -179,4 +179,4 @@
functions first appeared in
.Fx 8.0 .
.Sh AUTHORS
-.An Ed Schouten Aq Ed Schouten ed at FreeBSD.org
+.An Ed Schouten Aq ed at FreeBSD.org
==== //depot/projects/mpsafetty/sys/dev/wi/if_wi.c#3 (text+ko) ====
@@ -60,7 +60,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/wi/if_wi.c,v 1.219 2008/07/26 17:04:30 imp Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/wi/if_wi.c,v 1.220 2008/07/28 17:00:37 imp Exp $");
#define WI_HERMES_STATS_WAR /* Work around stats counter bug. */
@@ -225,6 +225,8 @@
{ 0, NULL, 0 },
};
+static char *wi_firmware_names[] = { "none", "Hermes", "Intersil", "Symbol" };
+
devclass_t wi_devclass;
int
@@ -237,6 +239,8 @@
u_int16_t val;
u_int8_t ratebuf[2 + IEEE80211_RATE_SIZE];
struct ieee80211_rateset *rs;
+ struct sysctl_ctx_list *sctx;
+ struct sysctl_oid *soid;
static const u_int8_t empty_macaddr[IEEE80211_ADDR_LEN] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
@@ -278,6 +282,25 @@
return EOPNOTSUPP;
}
+ /* Export info about the device via sysctl */
+ sctx = device_get_sysctl_ctx(dev);
+ soid = device_get_sysctl_tree(dev);
+ SYSCTL_ADD_STRING(sctx, SYSCTL_CHILDREN(soid), OID_AUTO,
+ "firmware_type", CTLFLAG_RD,
+ wi_firmware_names[sc->sc_firmware_type], 0,
+ "Firmware type string");
+ SYSCTL_ADD_INT(sctx, SYSCTL_CHILDREN(soid), OID_AUTO, "sta_version",
+ CTLFLAG_RD, &sc->sc_sta_firmware_ver, 0,
+ "Station Firmware version");
+ if (sc->sc_firmware_type == WI_INTERSIL)
+ SYSCTL_ADD_INT(sctx, SYSCTL_CHILDREN(soid), OID_AUTO,
+ "pri_version", CTLFLAG_RD, &sc->sc_pri_firmware_ver, 0,
+ "Primary Firmware version");
+ SYSCTL_ADD_XINT(sctx, SYSCTL_CHILDREN(soid), OID_AUTO, "nic_id",
+ CTLFLAG_RD, &sc->sc_nic_id, 0, "NIC id");
+ SYSCTL_ADD_STRING(sctx, SYSCTL_CHILDREN(soid), OID_AUTO, "nic_name",
+ CTLFLAG_RD, sc->sc_nic_name, 0, "NIC name");
+
mtx_init(&sc->sc_mtx, device_get_nameunit(dev), MTX_NETWORK_LOCK,
MTX_DEF | MTX_RECURSE);
callout_init_mtx(&sc->sc_watchdog, &sc->sc_mtx, 0);
@@ -1633,25 +1656,26 @@
memset(ver, 0, sizeof(ver));
len = sizeof(ver);
wi_read_rid(sc, WI_RID_CARD_ID, ver, &len);
- device_printf(sc->sc_dev, "using ");
sc->sc_firmware_type = WI_NOTYPE;
+ sc->sc_nic_id = le16toh(ver[0]);
for (id = wi_card_ident; id->card_name != NULL; id++) {
- if (le16toh(ver[0]) == id->card_id) {
- printf("%s", id->card_name);
+ if (sc->sc_nic_id == id->card_id) {
+ sc->sc_nic_name = id->card_name;
sc->sc_firmware_type = id->firm_type;
break;
}
}
if (sc->sc_firmware_type == WI_NOTYPE) {
- if (le16toh(ver[0]) & 0x8000) {
- printf("Unknown PRISM2 chip");
+ if (sc->sc_nic_id & 0x8000) {
sc->sc_firmware_type = WI_INTERSIL;
+ sc->sc_nic_name = "Unknown Prism chip";
} else {
- printf("Unknown Lucent chip");
sc->sc_firmware_type = WI_LUCENT;
+ sc->sc_nic_name = "Unknown Lucent chip";
}
}
+ device_printf(sc->sc_dev, "using %s\n", sc->sc_nic_name);
/* get primary firmware version (Only Prism chips) */
if (sc->sc_firmware_type != WI_LUCENT) {
@@ -1684,19 +1708,19 @@
(p[6] - '0') * 10 + (p[7] - '0');
}
}
- printf("\n");
- device_printf(sc->sc_dev, "%s Firmware: ",
- sc->sc_firmware_type == WI_LUCENT ? "Lucent" :
- (sc->sc_firmware_type == WI_SYMBOL ? "Symbol" : "Intersil"));
- if (sc->sc_firmware_type != WI_LUCENT) /* XXX */
- printf("Primary (%u.%u.%u), ",
- sc->sc_pri_firmware_ver / 10000,
- (sc->sc_pri_firmware_ver % 10000) / 100,
- sc->sc_pri_firmware_ver % 100);
- printf("Station (%u.%u.%u)\n",
- sc->sc_sta_firmware_ver / 10000,
- (sc->sc_sta_firmware_ver % 10000) / 100,
- sc->sc_sta_firmware_ver % 100);
+ if (bootverbose) {
+ device_printf(sc->sc_dev, "%s Firmware: ",
+ wi_firmware_names[sc->sc_firmware_type]);
+ if (sc->sc_firmware_type != WI_LUCENT) /* XXX */
+ printf("Primary (%u.%u.%u), ",
+ sc->sc_pri_firmware_ver / 10000,
+ (sc->sc_pri_firmware_ver % 10000) / 100,
+ sc->sc_pri_firmware_ver % 100);
+ printf("Station (%u.%u.%u)\n",
+ sc->sc_sta_firmware_ver / 10000,
+ (sc->sc_sta_firmware_ver % 10000) / 100,
+ sc->sc_sta_firmware_ver % 100);
+ }
}
static int
==== //depot/projects/mpsafetty/sys/dev/wi/if_wivar.h#2 (text+ko) ====
@@ -31,7 +31,7 @@
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*
- * $FreeBSD: src/sys/dev/wi/if_wivar.h,v 1.32 2008/04/20 20:35:38 sam Exp $
+ * $FreeBSD: src/sys/dev/wi/if_wivar.h,v 1.33 2008/07/28 17:00:37 imp Exp $
*/
/*
@@ -87,6 +87,8 @@
#define WI_SYMBOL 3
int sc_pri_firmware_ver; /* Primary firmware */
int sc_sta_firmware_ver; /* Station firmware */
+ unsigned int sc_nic_id; /* Type of NIC */
+ char * sc_nic_name;
int wi_bus_type; /* Bus attachment type */
struct resource * local;
==== //depot/projects/mpsafetty/sys/kern/sched_4bsd.c#2 (text+ko) ====
@@ -33,7 +33,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/sched_4bsd.c,v 1.126 2008/05/25 01:44:58 jb Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/sched_4bsd.c,v 1.128 2008/07/28 17:25:24 jhb Exp $");
#include "opt_hwpmc_hooks.h"
#include "opt_sched.h"
@@ -91,6 +91,7 @@
fixpt_t ts_pctcpu; /* (j) %cpu during p_swtime. */
int ts_cpticks; /* (j) Ticks of cpu time. */
int ts_slptime; /* (j) Seconds !RUNNING. */
+ int ts_flags;
struct runq *ts_runq; /* runq the thread is currently on */
};
@@ -98,9 +99,15 @@
#define TDF_DIDRUN TDF_SCHED0 /* thread actually ran. */
#define TDF_BOUND TDF_SCHED1 /* Bound to one CPU. */
+/* flags kept in ts_flags */
+#define TSF_AFFINITY 0x0001 /* Has a non-"full" CPU set. */
+
#define SKE_RUNQ_PCPU(ts) \
((ts)->ts_runq != 0 && (ts)->ts_runq != &runq)
+#define THREAD_CAN_SCHED(td, cpu) \
+ CPU_ISSET((cpu), &(td)->td_cpuset->cs_mask)
+
static struct td_sched td_sched0;
struct mtx sched_lock;
@@ -118,7 +125,9 @@
static void resetpriority(struct thread *td);
static void resetpriority_thread(struct thread *td);
#ifdef SMP
-static int forward_wakeup(int cpunum);
+static int sched_pickcpu(struct thread *td);
+static int forward_wakeup(int cpunum);
+static void kick_other_cpu(int pri, int cpuid);
#endif
static struct kproc_desc sched_kp = {
@@ -140,6 +149,7 @@
* Per-CPU run queues
*/
static struct runq runq_pcpu[MAXCPU];
+long runq_length[MAXCPU];
#endif
static void
@@ -269,9 +279,7 @@
#ifdef PREEMPTION
struct thread *ctd;
int cpri, pri;
-#endif
-#ifdef PREEMPTION
/*
* The new thread should not preempt the current thread if any of the
* following conditions are true:
@@ -442,7 +450,7 @@
sx_slock(&allproc_lock);
FOREACH_PROC_IN_SYSTEM(p) {
PROC_LOCK(p);
- FOREACH_THREAD_IN_PROC(p, td) {
+ FOREACH_THREAD_IN_PROC(p, td) {
awake = 0;
thread_lock(td);
ts = td->td_sched;
@@ -489,11 +497,10 @@
#endif
ts->ts_cpticks = 0;
}
- /*
+ /*
* If there are ANY running threads in this process,
* then don't count it as sleeping.
-XXX this is broken
-
+ * XXX: this is broken.
*/
if (awake) {
if (ts->ts_slptime > 1) {
@@ -519,9 +526,9 @@
resetpriority(td);
resetpriority_thread(td);
thread_unlock(td);
- } /* end of thread loop */
+ }
PROC_UNLOCK(p);
- } /* end of process loop */
+ }
sx_sunlock(&allproc_lock);
}
@@ -616,6 +623,7 @@
}
/* External interfaces start here */
+
/*
* Very early in the boot some setup of scheduler-specific
* parts of proc0 and of some scheduler resources needs to be done.
@@ -644,7 +652,7 @@
#endif
}
-int
+int
sched_rr_interval(void)
{
if (sched_quantum == 0)
@@ -691,7 +699,7 @@
}
/*
- * charge childs scheduling cpu usage to parent.
+ * Charge child's scheduling CPU usage to parent.
*/
void
sched_exit(struct proc *p, struct thread *td)
@@ -734,6 +742,7 @@
childtd->td_cpuset = cpuset_ref(td->td_cpuset);
ts = childtd->td_sched;
bzero(ts, sizeof(*ts));
+ ts->ts_flags |= (td->td_sched->ts_flags & TSF_AFFINITY);
}
void
@@ -765,7 +774,7 @@
sched_priority(struct thread *td, u_char prio)
{
CTR6(KTR_SCHED, "sched_prio: %p(%s) prio %d newprio %d by %p(%s)",
- td, td->td_name, td->td_priority, prio, curthread,
+ td, td->td_name, td->td_priority, prio, curthread,
curthread->td_name);
THREAD_LOCK_ASSERT(td, MA_OWNED);
@@ -904,7 +913,8 @@
p = td->td_proc;
THREAD_LOCK_ASSERT(td, MA_OWNED);
- /*
+
+ /*
* Switch to the sched lock to fix things up and pick
* a new thread.
*/
@@ -916,13 +926,14 @@
if ((p->p_flag & P_NOLOAD) == 0)
sched_load_rem();
- if (newtd)
+ if (newtd)
newtd->td_flags |= (td->td_flags & TDF_NEEDRESCHED);
td->td_lastcpu = td->td_oncpu;
td->td_flags &= ~TDF_NEEDRESCHED;
td->td_owepreempt = 0;
td->td_oncpu = NOCPU;
+
/*
* At the last moment, if this thread is still marked RUNNING,
* then put it back on the run queue as it has not been suspended
@@ -943,12 +954,12 @@
}
}
if (newtd) {
- /*
+ /*
* The thread we are about to run needs to be counted
* as if it had been added to the run queue and selected.
* It came from:
* * A preemption
- * * An upcall
+ * * An upcall
* * A followon
*/
KASSERT((newtd->td_inhibitors == 0),
@@ -985,13 +996,14 @@
/*
* Where am I? What year is it?
* We are in the same thread that went to sleep above,
- * but any amount of time may have passed. All out context
+ * but any amount of time may have passed. All our context
* will still be available as will local variables.
* PCPU values however may have changed as we may have
* changed CPU so don't trust cached values of them.
* New threads will go to fork_exit() instead of here
* so if you change things here you may need to change
* things there too.
+ *
* If the thread above was exiting it will never wake
* up again here, so either it has saved everything it
* needed to, or the thread_wait() or wait() will
@@ -1030,14 +1042,11 @@
}
#ifdef SMP
-/* enable HTT_2 if you have a 2-way HTT cpu.*/
static int
-forward_wakeup(int cpunum)
+forward_wakeup(int cpunum)
{
- cpumask_t map, me, dontuse;
- cpumask_t map2;
struct pcpu *pc;
- cpumask_t id, map3;
+ cpumask_t dontuse, id, map, map2, map3, me;
mtx_assert(&sched_lock, MA_OWNED);
@@ -1051,14 +1060,13 @@
forward_wakeups_requested++;
-/*
- * check the idle mask we received against what we calculated before
- * in the old version.
- */
+ /*
+ * Check the idle mask we received against what we calculated
+ * before in the old version.
+ */
me = PCPU_GET(cpumask);
- /*
- * don't bother if we should be doing it ourself..
- */
+
+ /* Don't bother if we should be doing it ourself. */
if ((me & idle_cpus_mask) && (cpunum == NOCPU || me == (1 << cpunum)))
return (0);
@@ -1067,7 +1075,7 @@
if (forward_wakeup_use_loop) {
SLIST_FOREACH(pc, &cpuhead, pc_allcpu) {
id = pc->pc_cpumask;
- if ( (id & dontuse) == 0 &&
+ if ((id & dontuse) == 0 &&
pc->pc_curthread == pc->pc_idlethread) {
map3 |= id;
}
@@ -1078,18 +1086,19 @@
map = 0;
map = idle_cpus_mask & ~dontuse;
- /* If they are both on, compare and use loop if different */
+ /* If they are both on, compare and use loop if different. */
if (forward_wakeup_use_loop) {
if (map != map3) {
- printf("map (%02X) != map3 (%02X)\n",
- map, map3);
+ printf("map (%02X) != map3 (%02X)\n", map,
+ map3);
map = map3;
}
}
} else {
map = map3;
}
- /* If we only allow a specific CPU, then mask off all the others */
+
+ /* If we only allow a specific CPU, then mask off all the others. */
if (cpunum != NOCPU) {
KASSERT((cpunum <= mp_maxcpus),("forward_wakeup: bad cpunum."));
map &= (1 << cpunum);
@@ -1102,7 +1111,7 @@
}
}
- /* set only one bit */
+ /* Set only one bit. */
if (forward_wakeup_use_single) {
map = map & ((~map) + 1);
}
@@ -1116,23 +1125,21 @@
printf("forward_wakeup: Idle processor not found\n");
return (0);
}
-#endif
-#ifdef SMP
-static void kick_other_cpu(int pri,int cpuid);
-
static void
-kick_other_cpu(int pri,int cpuid)
-{
- struct pcpu * pcpu = pcpu_find(cpuid);
- int cpri = pcpu->pc_curthread->td_priority;
+kick_other_cpu(int pri, int cpuid)
+{
+ struct pcpu *pcpu;
+ int cpri;
+ pcpu = pcpu_find(cpuid);
if (idle_cpus_mask & pcpu->pc_cpumask) {
forward_wakeups_delivered++;
ipi_selected(pcpu->pc_cpumask, IPI_AST);
return;
}
+ cpri = pcpu->pc_curthread->td_priority;
if (pri >= cpri)
return;
@@ -1147,11 +1154,37 @@
#endif /* defined(IPI_PREEMPTION) && defined(PREEMPTION) */
pcpu->pc_curthread->td_flags |= TDF_NEEDRESCHED;
- ipi_selected( pcpu->pc_cpumask , IPI_AST);
+ ipi_selected(pcpu->pc_cpumask, IPI_AST);
return;
}
#endif /* SMP */
+#ifdef SMP
+static int
+sched_pickcpu(struct thread *td)
+{
+ int best, cpu;
+
+ mtx_assert(&sched_lock, MA_OWNED);
+
+ best = NOCPU;
+ for (cpu = 0; cpu <= mp_maxid; cpu++) {
+ if (CPU_ABSENT(cpu))
+ continue;
+ if (!THREAD_CAN_SCHED(td, cpu))
+ continue;
+
+ if (best == NOCPU)
+ best = cpu;
+ else if (runq_length[cpu] < runq_length[best])
+ best = cpu;
+ }
+ KASSERT(best != NOCPU, ("no valid CPUs"));
+
+ return (best);
+}
+#endif
+
void
sched_add(struct thread *td, int flags)
#ifdef SMP
@@ -1172,6 +1205,7 @@
CTR5(KTR_SCHED, "sched_add: %p(%s) prio %d by %p(%s)",
td, td->td_name, td->td_priority, curthread,
curthread->td_name);
+
/*
* Now that the thread is moving to the run-queue, set the lock
* to the scheduler's lock.
@@ -1187,28 +1221,39 @@
ts->ts_runq = &runq_pcpu[cpu];
single_cpu = 1;
CTR3(KTR_RUNQ,
- "sched_add: Put td_sched:%p(td:%p) on cpu%d runq", ts, td, cpu);
- } else if ((td)->td_flags & TDF_BOUND) {
- /* Find CPU from bound runq */
- KASSERT(SKE_RUNQ_PCPU(ts),("sched_add: bound td_sched not on cpu runq"));
+ "sched_add: Put td_sched:%p(td:%p) on cpu%d runq", ts, td,
+ cpu);
+ } else if (td->td_flags & TDF_BOUND) {
+ /* Find CPU from bound runq. */
+ KASSERT(SKE_RUNQ_PCPU(ts),
+ ("sched_add: bound td_sched not on cpu runq"));
cpu = ts->ts_runq - &runq_pcpu[0];
single_cpu = 1;
CTR3(KTR_RUNQ,
- "sched_add: Put td_sched:%p(td:%p) on cpu%d runq", ts, td, cpu);
- } else {
+ "sched_add: Put td_sched:%p(td:%p) on cpu%d runq", ts, td,
+ cpu);
+ } else if (ts->ts_flags & TSF_AFFINITY) {
+ /* Find a valid CPU for our cpuset */
+ cpu = sched_pickcpu(td);
+ ts->ts_runq = &runq_pcpu[cpu];
+ single_cpu = 1;
+ CTR3(KTR_RUNQ,
+ "sched_add: Put td_sched:%p(td:%p) on cpu%d runq", ts, td,
+ cpu);
+ } else {
CTR2(KTR_RUNQ,
- "sched_add: adding td_sched:%p (td:%p) to gbl runq", ts, td);
+ "sched_add: adding td_sched:%p (td:%p) to gbl runq", ts,
+ td);
cpu = NOCPU;
ts->ts_runq = &runq;
}
-
+
if (single_cpu && (cpu != PCPU_GET(cpuid))) {
- kick_other_cpu(td->td_priority,cpu);
+ kick_other_cpu(td->td_priority, cpu);
} else {
-
if (!single_cpu) {
cpumask_t me = PCPU_GET(cpumask);
- int idle = idle_cpus_mask & me;
+ cpumask_t idle = idle_cpus_mask & me;
if (!idle && ((flags & SRQ_INTR) == 0) &&
(idle_cpus_mask & ~(hlt_cpus_mask | me)))
@@ -1222,14 +1267,17 @@
maybe_resched(td);
}
}
-
+
if ((td->td_proc->p_flag & P_NOLOAD) == 0)
sched_load_add();
runq_add(ts->ts_runq, td, flags);
+ if (cpu != NOCPU)
+ runq_length[cpu]++;
}
#else /* SMP */
{
struct td_sched *ts;
+
ts = td->td_sched;
THREAD_LOCK_ASSERT(td, MA_OWNED);
KASSERT((td->td_inhibitors == 0),
@@ -1241,6 +1289,7 @@
CTR5(KTR_SCHED, "sched_add: %p(%s) prio %d by %p(%s)",
td, td->td_name, td->td_priority, curthread,
curthread->td_name);
+
/*
* Now that the thread is moving to the run-queue, set the lock
* to the scheduler's lock.
@@ -1253,21 +1302,19 @@
CTR2(KTR_RUNQ, "sched_add: adding td_sched:%p (td:%p) to runq", ts, td);
ts->ts_runq = &runq;
- /*
- * If we are yielding (on the way out anyhow)
- * or the thread being saved is US,
- * then don't try be smart about preemption
- * or kicking off another CPU
- * as it won't help and may hinder.
- * In the YIEDLING case, we are about to run whoever is
- * being put in the queue anyhow, and in the
- * OURSELF case, we are puting ourself on the run queue
- * which also only happens when we are about to yield.
+ /*
+ * If we are yielding (on the way out anyhow) or the thread
+ * being saved is US, then don't try be smart about preemption
+ * or kicking off another CPU as it won't help and may hinder.
+ * In the YIEDLING case, we are about to run whoever is being
+ * put in the queue anyhow, and in the OURSELF case, we are
+ * puting ourself on the run queue which also only happens
+ * when we are about to yield.
*/
- if((flags & SRQ_YIELDING) == 0) {
+ if ((flags & SRQ_YIELDING) == 0) {
if (maybe_preempt(td))
return;
- }
+ }
if ((td->td_proc->p_flag & P_NOLOAD) == 0)
sched_load_add();
runq_add(ts->ts_runq, td, flags);
@@ -1292,13 +1339,17 @@
if ((td->td_proc->p_flag & P_NOLOAD) == 0)
sched_load_rem();
+#ifdef SMP
+ if (ts->ts_runq != &runq)
+ runq_length[ts->ts_runq - runq_pcpu]--;
+#endif
runq_remove(ts->ts_runq, td);
TD_SET_CAN_RUN(td);
}
/*
- * Select threads to run.
- * Notice that the running threads still consume a slot.
+ * Select threads to run. Note that running threads still consume a
+ * slot.
*/
struct thread *
sched_choose(void)
@@ -1314,14 +1365,14 @@
td = runq_choose_fuzz(&runq, runq_fuzz);
tdcpu = runq_choose(&runq_pcpu[PCPU_GET(cpuid)]);
- if (td == NULL ||
- (tdcpu != NULL &&
+ if (td == NULL ||
+ (tdcpu != NULL &&
tdcpu->td_priority < td->td_priority)) {
CTR2(KTR_RUNQ, "choosing td %p from pcpu runq %d", tdcpu,
PCPU_GET(cpuid));
td = tdcpu;
rq = &runq_pcpu[PCPU_GET(cpuid)];
- } else {
+ } else {
CTR1(KTR_RUNQ, "choosing td_sched %p from main runq", td);
}
@@ -1331,13 +1382,17 @@
#endif
if (td) {
+#ifdef SMP
+ if (td == tdcpu)
+ runq_length[PCPU_GET(cpuid)]--;
+#endif
runq_remove(rq, td);
td->td_flags |= TDF_DIDRUN;
KASSERT(td->td_flags & TDF_INMEM,
("sched_choose: thread swapped out"));
return (td);
- }
+ }
return (PCPU_GET(idlethread));
}
@@ -1515,4 +1570,65 @@
void
sched_affinity(struct thread *td)
{
+#ifdef SMP
+ struct td_sched *ts;
+ int cpu;
+
+ THREAD_LOCK_ASSERT(td, MA_OWNED);
+
+ /*
+ * Set the TSF_AFFINITY flag if there is at least one CPU this
+ * thread can't run on.
+ */
+ ts = td->td_sched;
+ ts->ts_flags &= ~TSF_AFFINITY;
+ for (cpu = 0; cpu <= mp_maxid; cpu++) {
+ if (CPU_ABSENT(cpu))
+ continue;
+ if (!THREAD_CAN_SCHED(td, cpu)) {
+ ts->ts_flags |= TSF_AFFINITY;
+ break;
+ }
+ }
+
+ /*
+ * If this thread can run on all CPUs, nothing else to do.
+ */
+ if (!(ts->ts_flags & TSF_AFFINITY))
+ return;
+
+ /* Pinned threads and bound threads should be left alone. */
+ if (td->td_pinned != 0 || td->td_flags & TDF_BOUND)
+ return;
+
+ switch (td->td_state) {
+ case TDS_RUNQ:
+ /*
+ * If we are on a per-CPU runqueue that is in the set,
+ * then nothing needs to be done.
+ */
+ if (ts->ts_runq != &runq &&
+ THREAD_CAN_SCHED(td, ts->ts_runq - runq_pcpu))
+ return;
+
+ /* Put this thread on a valid per-CPU runqueue. */
+ sched_rem(td);
+ sched_add(td, SRQ_BORING);
+ break;
+ case TDS_RUNNING:
+ /*
+ * See if our current CPU is in the set. If not, force a
+ * context switch.
+ */
+ if (THREAD_CAN_SCHED(td, td->td_oncpu))
+ return;
+
+ td->td_flags |= TDF_NEEDRESCHED;
+ if (td != curthread)
+ ipi_selected(1 << cpu, IPI_AST);
+ break;
+ default:
+ break;
+ }
+#endif
}
==== //depot/projects/mpsafetty/sys/modules/et/Makefile#2 (text+ko) ====
@@ -1,10 +1,10 @@
# $DragonFly: src/sys/dev/netif/et/Makefile,v 1.1 2007/10/12 14:12:42 sephe Exp $
-# $FreeBSD: src/sys/modules/et/Makefile,v 1.1 2008/06/20 19:28:33 delphij Exp $
+# $FreeBSD: src/sys/modules/et/Makefile,v 1.2 2008/07/28 17:56:37 antoine Exp $
.PATH: ${.CURDIR}/../../dev/et
KMOD= if_et
SRCS= if_et.c
-SRCS+= opt_et.h bus_if.h pci_if.h device_if.h miibus_if.h
+SRCS+= bus_if.h pci_if.h device_if.h miibus_if.h
.include <bsd.kmod.mk>
==== //depot/projects/mpsafetty/usr.bin/ldd/ldd.c#3 (text+ko) ====
@@ -29,7 +29,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/usr.bin/ldd/ldd.c,v 1.37 2008/07/21 02:13:14 edwin Exp $");
+__FBSDID("$FreeBSD: src/usr.bin/ldd/ldd.c,v 1.38 2008/07/28 12:49:16 edwin Exp $");
#include <sys/wait.h>
@@ -49,15 +49,12 @@
#include "extern.h"
/*
- * Elf32_xhdr structures can only be used if sys/elf32.h is included, so
- * check for the existence of one of the macros defined in sys/elf32.h.
- *
- * The presense of the ELF32_R_TYPE macro via machine/elf.h has been verified
- * on amd64 6.3, ia64 7.0 and sparc64 7.0. The absence of the macro has been
- * verified on alpha 6.2.
+ * 32-bit ELF data structures can only be used if the system header[s] declare
+ * them. There is no official macro for determining whether they are declared,
+ * so check for the existence of one of the 32-macros defined in elf(5).
*/
-#if defined(ELF32_R_TYPE)
-#define ELF32_SUPPORTED
+#ifdef ELF32_R_TYPE
+#define ELF32_SUPPORTED
#endif
static int is_executable(const char *fname, int fd, int *is_shlib,
==== //depot/projects/mpsafetty/usr.sbin/config/config.y#2 (text+ko) ====
@@ -31,6 +31,7 @@
%type <str> Save_id
%type <str> Opt_value
%type <str> Dev
+%token <str> PATH
%{
@@ -67,7 +68,7 @@
* SUCH DAMAGE.
*
* @(#)config.y 8.1 (Berkeley) 6/6/93
- * $FreeBSD: src/usr.sbin/config/config.y,v 1.79 2007/12/25 06:22:33 imp Exp $
+ * $FreeBSD: src/usr.sbin/config/config.y,v 1.80 2008/07/28 17:11:57 obrien Exp $
*/
#include <assert.h>
@@ -128,6 +129,11 @@
|
Config_spec SEMICOLON
|
+ INCLUDE PATH SEMICOLON {
+ if (incignore == 0)
+ include($2, 0);
+ };
+ |
INCLUDE ID SEMICOLON {
if (incignore == 0)
include($2, 0);
==== //depot/projects/mpsafetty/usr.sbin/config/lang.l#2 (text+ko) ====
@@ -28,7 +28,7 @@
* SUCH DAMAGE.
*
* @(#)lang.l 8.1 (Berkeley) 6/6/93
- * $FreeBSD: src/usr.sbin/config/lang.l,v 1.45 2007/05/12 19:38:18 wkoszek Exp $
+ * $FreeBSD: src/usr.sbin/config/lang.l,v 1.46 2008/07/28 17:11:57 obrien Exp $
*/
#include <assert.h>
@@ -96,6 +96,7 @@
%}
ID [A-Za-z_][-A-Za-z_0-9]*
+PATH [./][-/.%^A-Za-z_0-9]+
%START TOEOL
%%
{ID} {
@@ -165,6 +166,11 @@
return tok;
/* otherwise continue scanning */
}
+{PATH} {
+ BEGIN 0;
+ yylval.str = strdup(yytext);
+ return PATH;
+ }
. { return yytext[0]; }
%%
More information about the p4-projects
mailing list