From a04675e95a0f9e7af840b7f8263ef850600b65a0 Mon Sep 17 00:00:00 2001 From: mickey Date: Wed, 26 Apr 2000 19:41:20 +0000 Subject: [PATCH] mi_switch(), cpu_switch() page from netbsd w/ small addition by me; second try --- share/man/man9/Makefile | 5 +- share/man/man9/ctxsw.9 | 146 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 149 insertions(+), 2 deletions(-) create mode 100644 share/man/man9/ctxsw.9 diff --git a/share/man/man9/Makefile b/share/man/man9/Makefile index 6529f31c0b8..7a3f71ff1cb 100644 --- a/share/man/man9/Makefile +++ b/share/man/man9/Makefile @@ -1,9 +1,9 @@ -# $OpenBSD: Makefile,v 1.17 2000/04/25 16:51:18 espie Exp $ +# $OpenBSD: Makefile,v 1.18 2000/04/26 19:41:20 mickey Exp $ # $NetBSD: Makefile,v 1.4 1996/01/09 03:23:01 thorpej Exp $ # Makefile for section 9 (kernel function and variable) manual pages. -MAN= boot.9 copy.9 disk.9 doshutdownhooks.9 fetch.9 fork1.9 \ +MAN= boot.9 copy.9 ctxsw.9 disk.9 doshutdownhooks.9 fetch.9 fork1.9 \ extent.9 hz.9 hzto.9 intro.9 inittodr.9 log.9 kthread.9 \ malloc.9 md5.9 microtime.9 panic.9 pfind.9 printf.9 \ psignal.9 ratecheck.9 resettodr.9 \ @@ -13,6 +13,7 @@ MAN= boot.9 copy.9 disk.9 doshutdownhooks.9 fetch.9 fork1.9 \ MLINKS+=copy.9 copyin.9 copy.9 copyout.9 copy.9 copystr.9 \ copy.9 copyinstr.9 copy.9 copyoutstr.9 +MLINKS+=ctxsw.9 cpu_switch.9 ctxsw.9 mi_switch.9 MLINKS+=disk.9 disk_init.9 disk.9 disk_attach.9 disk.9 disk_detatch.9 \ disk.9 disk_busy.9 disk.9 disk_unbusy.9 disk.9 disk_find.9 \ disk.9 disk_resetstat.9 diff --git a/share/man/man9/ctxsw.9 b/share/man/man9/ctxsw.9 new file mode 100644 index 00000000000..1050225b45a --- /dev/null +++ b/share/man/man9/ctxsw.9 @@ -0,0 +1,146 @@ +.\" $NetBSD: ctxsw.9,v 1.9 1999/03/06 22:09:29 mycroft Exp $ +.\" +.\" Copyright (c) 1996 The NetBSD Foundation, Inc. +.\" All rights reserved. +.\" +.\" This code is derived from software contributed to The NetBSD Foundation +.\" by Paul Kranenburg. +.\" +.\" 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, 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. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the NetBSD +.\" Foundation, Inc. and its contributors. +.\" 4. Neither the name of The NetBSD Foundation nor the names of its +.\" contributors may be used to endorse or promote products derived +.\" from this software without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS +.\" ``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 FOUNDATION OR CONTRIBUTORS +.\" 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. +.\" +.Dd November 24, 1996 +.Dt CTXSW 9 +.Os +.Sh NAME +.Nm mi_switch , +.Nm cpu_switch +.Nd switch to another process context +.Sh SYNOPSIS +.Ft void +.Fn mi_switch "void" +.Ft void +.Fn cpu_switch "void" +.Sh DESCRIPTION +The +.Fn mi_switch +function implements the machine-independent prelude to a process context +switch. +It is called from only a few distinguished places in the kernel code as a +result of the principle of non-preemptable kernel mode execution. +The three major uses of +.Fn mi_switch +can be enumerated as follows: +.Bl -enum -offset indent +.It +From within +.Xr sleep 9 +and +.Xr tsleep 9 +when the current process +voluntarily relinquishes the CPU to wait for some resource to become +available. +.It +After handling a trap +.Pq e.g. a system call or device interrupt +when the kernel prepares a return to user-mode execution. +This case is typically handled by machine-dependent trap-handling code after +detection of a change in the signal disposition of the current process, or +when a higher priority process might be available to run. +The latter event is communicated by the machine-independent scheduling +routines by calling the machine-dependent +.Fn need_resched "void" . +.It +In the signal handling code +.Pq see Xr issignal 9 +if a signal is delivered that causes a process to stop. +.El +.Pp +.Fn mi_switch +records the amount of time the current process has been running in the +process structure and checks this value against the CPU time limits +allocated to the process +.Pq see Xr getrlimit 2 . +Exceeding the soft limit results in a +.Dv SIGXCPU +signal to be posted to the process, while exceeding the hard limit will +cause a +.Dv SIGKILL . +For a process which accumulated longer than 10 minutes of +cpu time it's nice level is raised to 4. +After these administrative tasks are done, +.Fn mi_switch +hands over control to the machine dependent routine +.Fn cpu_switch "void" , +which will perform the actual process context switch. +.Pp +.Fn cpu_switch +will make a choice amongst the processes which are ready to run from a +priority queue data-structure. +The priority queue consists of an array +.Va qs[NQS] +of queue header structures each of which identifies a list of runnable +processes of equal priority +.Pq see Aq Pa sys/proc.h . +A single word +.Va whichqs +containing a bit mask identifying non-empty queues assists in selecting +a process quickly. +.Fn cpu_switch +must remove the first process from the list on the queue +with the highest priority +(lower indices in +.Va qs +indicate higher priority), +and assign the address of its process structure to the global variable +.Va curproc . +If no processes are available on the run queues, +.Fn cpu_switch +shall go into an +.Dq idle +loop. +The idle loop must allow interrupts to be taken that will eventually cause +processes to appear again on the run queues. +The variable +.Va curproc +should be +.Dv NULL +while +.Fn cpu_switch +waits for this to happen. +.Pp +Note that +.Fn mi_switch +and thus +.Fn cpu_switch +should be called at +.Xr splhigh 9 . +.Pp +.Sh SEE ALSO +.Xr tsleep 9 , +.Xr wakeup 9 -- 2.20.1