Commit Graph

116 Commits

Author SHA1 Message Date
julian
5813d27029 Refactor a bunch of scheduler code to give basically the same behaviour
but with slightly cleaned up interfaces.

The KSE structure has become the same as the "per thread scheduler
private data" structure. In order to not make the diffs too great
one is #defined as the other at this time.

The KSE (or td_sched) structure is  now allocated per thread and has no
allocation code of its own.

Concurrency for a KSEGRP is now kept track of via a simple pair of counters
rather than using KSE structures as tokens.

Since the KSE structure is different in each scheduler, kern_switch.c
is now included at the end of each scheduler. Nothing outside the
scheduler knows the contents of the KSE (aka td_sched) structure.

The fields in the ksegrp structure that are to do with the scheduler's
queueing mechanisms are now moved to the kg_sched structure.
(per ksegrp scheduler private data structure). In other words how the
scheduler queues and keeps track of threads is no-one's business except
the scheduler's. This should allow people to write experimental
schedulers with completely different internal structuring.

A scheduler call sched_set_concurrency(kg, N) has been added that
notifies teh scheduler that no more than N threads from that ksegrp
should be allowed to be on concurrently scheduled. This is also
used to enforce 'fainess' at this time so that a ksegrp with
10000 threads can not swamp a the run queue and force out a process
with 1 thread, since the current code will not set the concurrency above
NCPU, and both schedulers will not allow more than that many
onto the system run queue at a time. Each scheduler should eventualy develop
their own methods to do this now that they are effectively separated.

Rejig libthr's kernel interface to follow the same code paths as
linkse for scope system threads. This has slightly hurt libthr's performance
but I will work to recover as much of it as I can.

Thread exit code has been cleaned up greatly.
exit and exec code now transitions a process back to
'standard non-threaded mode' before taking the next step.
Reviewed by:	scottl, peter
MFC after:	1 week
2004-09-05 02:09:54 +00:00
marcel
01fd13440d Move the kernel-specific logic to adjust frompc from MI to MD. For
these two reasons:
1. On ia64 a function pointer does not hold the address of the first
   instruction of a functions implementation. It holds the address
   of a function descriptor. Hence the user(), btrap(), eintr() and
   bintr() prototypes are wrong for getting the actual code address.
2. The logic forces interrupt, trap and exception entry points to
   be layed-out contiguously. This can not be achieved on ia64 and is
   generally just bad programming.

The MCOUNT_FROMPC_USER macro is used to set the frompc argument to
some kernel address which represents any frompc that falls outside
the kernel text range. The macro can expand to ~0U to bail out in
that case.
The MCOUNT_FROMPC_INTR macro is used to set the frompc argument to
some kernel address to represent a call to a trap or interrupt
handler. This to avoid that the trap or interrupt handler appear to
be called from everywhere in the call graph. The macro can expand
to ~0U to prevent adjusting frompc. Note that the argument is selfpc,
not frompc.

This commit defines the macros on all architectures equivalently to
the original code in sys/libkern/mcount.c. People can take it from
here...

Compile-tested on: alpha, amd64, i386, ia64 and sparc64
Boot-tested on: i386
2004-08-27 19:42:35 +00:00
marcel
fbbaea5f90 Add __elfN(dump_thread). This function is called from __elfN(coredump)
to allow dumping per-thread machine specific notes. On ia64 we use this
function to flush the dirty registers onto the backingstore before we
write out the PRSTATUS notes.

Tested on: alpha, amd64, i386, ia64 & sparc64
Not tested on: arm, powerpc
2004-08-11 02:35:06 +00:00
alc
989ca43572 Add a comment describing pmap_extract_and_hold() noting that the protection
check still needs implementation on arm.
2004-08-10 21:43:40 +00:00
cognet
bc600631b5 Use the new prototype for the zone constructor. 2004-08-06 22:32:53 +00:00
alc
41618225a8 - Push down the acquisition and release of Giant into pmap_enter_quick()
on those architectures without pmap locking.
 - Eliminate the acquisition and release of Giant in vm_map_pmap_enter().
2004-08-04 22:03:16 +00:00
mux
35780dc21a Instead of calling ia32_pause() conditionally on __i386__ or __amd64__
being defined, define and use a new MD macro, cpu_spinwait().  It only
expands to something on i386 and amd64, so the compiled code should be
identical.

Name of the macro found by:	jhb
Reviewed by:	jhb
2004-08-03 18:44:27 +00:00
cognet
53db7b6142 *blush*
Fix htonl and htons.
2004-08-02 12:24:18 +00:00
cognet
ca5e850ced Fix comments.
Spotted out by:	mux
2004-08-02 12:23:53 +00:00
alc
9b295c2fd9 - Push down the acquisition and release of Giant into pmap_protect() on
those architectures without pmap locking.
 - Eliminate the acquisition and release of Giant from vm_map_protect().

(Translation: mprotect(2) runs to completion without touching Giant on
alpha, amd64, i386 and ia64.)
2004-07-30 20:38:30 +00:00
cognet
7c7f4453cf Don't use cast as lvalue. 2004-07-29 12:33:54 +00:00
rwatson
1a23ddfc9e Correct typo in prior commit: s/cd/td/ 2004-07-27 19:44:08 +00:00
rwatson
4ab080249a Pass a thread argument into cpu_critical_{enter,exit}() rather than
dereference curthread.  It is called only from critical_{enter,exit}(),
which already dereferences curthread.  This doesn't seem to affect SMP
performance in my benchmarks, but improves MySQL transaction throughput
by about 1% on UP on my Xeon.

Head nodding:	jhb, bmilekic
2004-07-27 16:41:01 +00:00
alc
f3c3c8c6c5 MFi386 revision 1.421
- Use kmem_alloc_nofault() rather than kmem_alloc_pageable() in
   pmap_mapdev().  See revision 1.140 of kern/sys_pipe.c for a detailed
   rationale.
2004-07-22 23:04:41 +00:00
cognet
348f262f29 Do not declare curpcb. 2004-07-21 22:04:32 +00:00
cognet
ae0a320fb3 Use the kernel pmap if no thread is provided. 2004-07-21 22:04:05 +00:00
cognet
c5c2cfa0c5 Define pmap_page_is_mapped(). 2004-07-21 22:02:48 +00:00
cognet
2f02562eed Do not use NULL as a malloc type for contigmalloc(). 2004-07-21 15:18:45 +00:00
marcel
f77d7b9449 Unify db_stack_trace_cmd(). All it did was look up the thread given
the thread ID and call db_trace_thread().
Since arm has all the logic in db_stack_trace_cmd(), rename the
new DB_COMMAND function to db_stack_trace to avoid conflicts on
arm.
While here, have db_stack_trace parse its own arguments so that
we can use a more natural radix for IDs. If the ID is not a thread
ID, or more precisely when no thread exists with the ID, try if
there's a process with that ID and return the first thread in it.
This makes it easier to print stack traces from the ps output.

requested by: rwatson@
tested on: amd64, i386, ia64
2004-07-21 05:07:09 +00:00
cognet
4f3de515b5 Implement ptrace_set_pc().
Add a stub for ptrace_clear_single_step().
2004-07-20 23:00:02 +00:00
cognet
62054ab640 Remove astpending, it has not been used for a long time. 2004-07-20 22:39:56 +00:00
cognet
cc5ead7b77 Uncomment the vector relocation code. 2004-07-20 22:39:24 +00:00
cognet
f6936a77a8 Nuke disable_intr() and enable_intr(), as it already exists elsewhere. 2004-07-20 22:38:46 +00:00
cognet
96ca74bf7d Make kdb_backtrace() sort of work. 2004-07-19 12:26:44 +00:00
das
86c293bf54 Make FLT_ROUNDS correctly reflect the dynamic rounding mode. 2004-07-19 08:17:25 +00:00
cognet
512283ce25 In pmap_remove_pages(), when the pv_list is entry, we want to clean the
PG_WRITEABLE flag, not the PG_REFERENCED flag.

Submitted by:   alc
2004-07-13 22:40:59 +00:00
alc
ea94acfaa6 Push down the acquisition and release of the page queues lock into
pmap_remove_pages().  (The implementation of pmap_remove_pages() is
optional.  If pmap_remove_pages() is unimplemented, the acquisition and
release of the page queues lock is unnecessary.)

Remove spl calls from the alpha, arm, and ia64 pmap_remove_pages().
2004-07-13 02:49:22 +00:00
cognet
1176e2e3a5 Update to kdb. 2004-07-12 21:25:01 +00:00
cognet
7563f4f40c Remove the kbd_trap() declaration. 2004-07-12 21:24:21 +00:00
cognet
a5d0266aaa Protect setjmp.h with #ifndef _MACHINE_SETJMP_H_. 2004-07-12 21:23:58 +00:00
cognet
3884d9a863 Forward declare "struct pcb", so that one does not need to include
<machine/pcb.h> before including <machine/pmap.h>.
2004-07-12 21:22:40 +00:00
cognet
b0940860cf Implement a stub breakpoint(). 2004-07-12 21:20:38 +00:00
cognet
5c9c269caa Implement makectx(). 2004-07-12 21:19:43 +00:00
cognet
017c5d391c Prototype makectx(). 2004-07-12 21:19:22 +00:00
cognet
668e7d838d Import bus_memio.h and bus_pio.h for arm. 2004-07-12 21:18:30 +00:00
cognet
5eba49c6e6 Import a kdb.h for arm, which contains stubs right now. 2004-07-12 21:17:51 +00:00
cognet
0a98d3720a Define NSFBUFS and use it. 2004-07-08 21:03:35 +00:00
alc
f2aa52f71a Correct pmap_extract()'s return type. It should be vm_paddr_t, not
vm_offset_t.
2004-07-05 23:08:27 +00:00
cognet
dad9e484c1 ithread_schedule() now only takes one argument. 2004-07-02 22:30:42 +00:00
cognet
cb7598b9ef Define __RMAN_RESOURCE_VISIBLE where appropriate. 2004-07-02 22:30:10 +00:00
cognet
02f50a9e92 Remove unused includes.
Spotted out by:	pjd
2004-06-28 11:35:05 +00:00
cognet
50ab7a0a58 Fix compilation for Xscale. 2004-06-19 20:50:50 +00:00
cognet
c959b76977 Include sys/module.h. 2004-06-19 17:38:32 +00:00
cognet
3ef0ec5c27 I happened to have a sys/pool.h file in my tree, but most people do not,
so nuke this useless include.
2004-06-19 17:37:47 +00:00
cognet
d850307d23 Nuke dead code. 2004-06-17 17:52:12 +00:00
cognet
a53709fae6 Nuke bus_space_mmap(), as it does not exist in FreeBSD. 2004-06-17 17:51:48 +00:00
phk
dfd1f7fd50 Do the dreaded s/dev_t/struct cdev */
Bump __FreeBSD_version accordingly.
2004-06-16 09:47:26 +00:00
phk
4c3fd8116d Remove filename+line number from panic messages. 2004-06-06 21:26:49 +00:00
tjr
48c79c9521 Remove checks for curthread == NULL - it can't happen. 2004-06-03 10:22:47 +00:00
tjr
7a46b27935 Move TDF_DEADLKTREAT into td_pflags (and rename it accordingly) to avoid
having to acquire sched_lock when manipulating it in lockmgr(), uiomove(),
and uiomove_fromphys().

Reviewed by:	jhb
2004-06-03 01:47:37 +00:00