From owner-freebsd-bugs Fri Dec 27 14:31:25 1996 Return-Path: Received: (from root@localhost) by freefall.freebsd.org (8.8.4/8.8.4) id OAA11483 for bugs-outgoing; Fri, 27 Dec 1996 14:31:25 -0800 (PST) Received: (from gnats@localhost) by freefall.freebsd.org (8.8.4/8.8.4) id OAA11453; Fri, 27 Dec 1996 14:30:02 -0800 (PST) Date: Fri, 27 Dec 1996 14:30:02 -0800 (PST) Message-Id: <199612272230.OAA11453@freefall.freebsd.org> To: freebsd-bugs Cc: From: "Jukka A. Ukkonen" Subject: Re: kern/2273: POSIX.4 / POSIX.1a style sched_*() API and RTFIFO-scheduler patches Reply-To: "Jukka A. Ukkonen" Sender: owner-bugs@FreeBSD.ORG X-Loop: FreeBSD.org Precedence: bulk The following reply was made to PR kern/2273; it has been noted by GNATS. From: "Jukka A. Ukkonen" To: FreeBSD-gnats@freefall.freebsd.org, freebsd-bugs@freefall.freebsd.org Cc: Subject: Re: kern/2273: POSIX.4 / POSIX.1a style sched_*() API and RTFIFO-scheduler patches Date: Wed, 25 Dec 1996 13:02:58 +0200 (EET) Quoting FreeBSD-gnats@freefall.freebsd.org: > > Thank you very much for your problem report. > It has the internal identification `kern/2273'. > The individual assigned to look at your > bug is: freebsd-bugs. > > >Category: kern > >Responsible: freebsd-bugs > >Synopsis: support for POSIX.4 / POSIX.1a RT-scheduler API > >Arrival-Date: Tue Dec 24 05:30:01 PST 1996 > Aargh! I did it again - sent the old shar package, I mean. Now the attached one is the correct one. I promise. Cheers, // jau ------ / Jukka A. Ukkonen, Internet and New Media / Finnish Telecom Ltd. /__ M.Sc. (sw-eng & cs) (Phone) +358-2040-4025 / Internet: Jukka.Ukkonen@tele.fi (Fax) +358-2040-2712 / Internet: jau@iki.fi (Mobile) +358-400-606671 v Internet: ukkonen@nic.funet.fi (Home&Fax) +358-9-6215280 o \ / - X ------------------------- clip clip ------------------------------ / \ O # This is a shell archive. Save it in a file, remove anything before # this line, and then unpack it by entering "sh file". Note, it may # create directories; files and directories will be owned by you and # have default permissions. # # This archive contains: # # sched/sched.h # sched/sched_getparam.c # sched/sched_getscheduler.c # sched/sched_get_priority_max.c # sched/sched_get_priority_min.c # sched/sched_rr_get_interval.c # sched/sched_setparam.c # sched/sched_setscheduler.c # sched/Makefile # sched/Kernel-Sched.Diffs # sched/sched_yield.Diffs # sched/RTprio.diffs # echo x - sched/sched.h sed 's/^X//' >sched/sched.h << 'END-of-sched/sched.h' X/* X * Copyright (c) 1995,1996 Jukka Ukkonen X * X * Redistribution and use in source and binary forms, with or without X * modification, are permitted provided that the following conditions X * are met: X * 1. Redistributions of source code must retain the above copyright X * notice, this list of conditions and the following disclaimer. X * 2. Redistributions in binary form must reproduce the above copyright X * notice, this list of conditions and the following disclaimer in the X * documentation and/or other materials provided with the distribution. X * 3. All advertising materials mentioning features or use of this software X * must display the following acknowledgement: X * This product includes software developed by Jukka Antero Ukkonen. X * 4. Neither the names of the authors nor the names of contributors X * may be used to endorse or promote products derived from this software X * without specific prior written permission. X * 5. The source code must be available for anyone who wishes to have it. X * X * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND X * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE X * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE X * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE X * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL X * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS X * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) X * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT X * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY X * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF X * SUCH DAMAGE. X * X * %W% (Jukka Ukkonen) %E% X */ X X X#ifndef _SCHED_H X#define _SCHED_H X X#include X#include X#include /* For struct timespec */ X X#ifndef _POSIX_PRIORITY_SCHEDULING X# define _POSIX_PRIORITY_SCHEDULING X#endif X X/* X * FIFO and Round-Robin must really be separate, but maybe X * it could be possible and worthwhile to try approximate FIFO X * using RR with higher priorities. X * X * RTP_PRIO_REALTIME with round-robin among equal priority X * processes at every time-quantum (= currently HZ/10) would X * still be only a poor substitute for fifo scheduling on X * systems that don't have a real fifo policy. X * X * Otherwise FIFO and RR are equivalent in all respects, but X * RR comes with involuntary release of CPU after the time X * quantum has passed. X * FIFO knows only about voluntary release of the CPU while X * the process can run as long as it wishes. So, you really X * can hang your machine, if there is no other process with X * higher RT-priority (FIFO or RR) ready to kill a infinitely X * looping FIFO process. X */ X X#ifdef RTP_PRIO_FIFO X# define SCHED_FIFO RTP_PRIO_FIFO X#else X# define SCHED_FIFO RTP_PRIO_REALTIME X#endif X X#define SCHED_RR RTP_PRIO_REALTIME X#define SCHED_TIMESHARE RTP_PRIO_NORMAL X#define SCHED_IDLE RTP_PRIO_IDLE X#define SCHED_OTHER SCHED_TIMESHARE X X/* X * Hopefully someone is interested enough to add X * the necessary deadline logic to the kernel. X */ X X#ifdef RTP_PRIO_DEADLINE X# define SCHED_DEADLINE RTP_PRIO_DEADLINE X#endif X Xstruct sched_param { X int sched_type; /* scheduling policy */ X int sched_priority; /* nice for time-share, else true prio */ X int sched_pgprio; /* pg-nice for TS, else unused */ X int sched_userprio; /* user-nice for TS, else unused */ X struct timespec sched_deadline; /* reserved for deadline scheduling */ X struct timespec sched_timereq; /* reserved for deadline scheduling */ X}; X X#endif END-of-sched/sched.h echo x - sched/sched_getparam.c sed 's/^X//' >sched/sched_getparam.c << 'END-of-sched/sched_getparam.c' X/* X * Copyright (c) 1995,1996 Jukka Ukkonen X * X * Redistribution and use in source and binary forms, with or without X * modification, are permitted provided that the following conditions X * are met: X * 1. Redistributions of source code must retain the above copyright X * notice, this list of conditions and the following disclaimer. X * 2. Redistributions in binary form must reproduce the above copyright X * notice, this list of conditions and the following disclaimer in the X * documentation and/or other materials provided with the distribution. X * 3. All advertising materials mentioning features or use of this software X * must display the following acknowledgement: X * This product includes software developed by Jukka Antero Ukkonen. X * 4. Neither the names of the authors nor the names of contributors X * may be used to endorse or promote products derived from this software X * without specific prior written permission. X * 5. The source code must be available for anyone who wishes to have it. X * X * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND X * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE X * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE X * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE X * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL X * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS X * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) X * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT X * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY X * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF X * SUCH DAMAGE. X * X * %W% (Jukka Ukkonen) %E% X */ X X#ifndef lint Xstatic const char sccsid[] = "%W%\t(Jukka Ukkonen)\t%E%"; X#endif X X X#include X#include X#include X#include X#include X#include X Xint Xsched_getparam (pid, param) X pid_t pid; X struct sched_param *param; X{ X struct rtprio rtp; X X if (! param) { X errno = EINVAL; X return (-1); X } X X if (rtprio (RTP_LOOKUP, pid, &rtp) < 0) X return (-1); X X param->sched_type = rtp.type; X X if (rtp.type == RTP_PRIO_NORMAL) { X errno = 0; X X param->sched_priority = getpriority (PRIO_PROCESS, pid); X X if ((param->sched_priority == -1) && errno) X return (-1); X X param->sched_priority = -param->sched_priority; X X errno = 0; X X param->sched_pgprio = getpriority (PRIO_PGRP, pid); X X if ((param->sched_pgprio == -1) && errno) X return (-1); X X param->sched_pgprio = -param->sched_pgprio; X X errno = 0; X X param->sched_userprio = getpriority (PRIO_USER, pid); X X if ((param->sched_userprio == -1) && errno) X return (-1); X X param->sched_userprio = -param->sched_userprio; X } X else X param->sched_priority = RTP_PRIO_MAX - rtp.prio; X X return (0); X} END-of-sched/sched_getparam.c echo x - sched/sched_getscheduler.c sed 's/^X//' >sched/sched_getscheduler.c << 'END-of-sched/sched_getscheduler.c' X/* X * Copyright (c) 1995,1996 Jukka Ukkonen X * X * Redistribution and use in source and binary forms, with or without X * modification, are permitted provided that the following conditions X * are met: X * 1. Redistributions of source code must retain the above copyright X * notice, this list of conditions and the following disclaimer. X * 2. Redistributions in binary form must reproduce the above copyright X * notice, this list of conditions and the following disclaimer in the X * documentation and/or other materials provided with the distribution. X * 3. All advertising materials mentioning features or use of this software X * must display the following acknowledgement: X * This product includes software developed by Jukka Antero Ukkonen. X * 4. Neither the names of the authors nor the names of contributors X * may be used to endorse or promote products derived from this software X * without specific prior written permission. X * 5. The source code must be available for anyone who wishes to have it. X * X * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND X * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE X * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE X * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE X * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL X * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS X * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) X * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT X * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY X * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF X * SUCH DAMAGE. X * X * %W% (Jukka Ukkonen) %E% X */ X X#ifndef lint Xstatic const char sccsid[] = "%W%\t(Jukka Ukkonen)\t%E%"; X#endif X X X#include X#include X#include X#include X Xint Xsched_getscheduler (pid) X pid_t pid; X{ X struct rtprio rtp; X X if (rtprio (RTP_LOOKUP, pid, &rtp) < 0) X return (-1); X X return ((int) rtp.type); X} END-of-sched/sched_getscheduler.c echo x - sched/sched_get_priority_max.c sed 's/^X//' >sched/sched_get_priority_max.c << 'END-of-sched/sched_get_priority_max.c' X/* X * Copyright (c) 1995,1996 Jukka Ukkonen X * X * Redistribution and use in source and binary forms, with or without X * modification, are permitted provided that the following conditions X * are met: X * 1. Redistributions of source code must retain the above copyright X * notice, this list of conditions and the following disclaimer. X * 2. Redistributions in binary form must reproduce the above copyright X * notice, this list of conditions and the following disclaimer in the X * documentation and/or other materials provided with the distribution. X * 3. All advertising materials mentioning features or use of this software X * must display the following acknowledgement: X * This product includes software developed by Jukka Antero Ukkonen. X * 4. Neither the names of the authors nor the names of contributors X * may be used to endorse or promote products derived from this software X * without specific prior written permission. X * 5. The source code must be available for anyone who wishes to have it. X * X * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND X * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE X * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE X * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE X * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL X * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS X * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) X * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT X * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY X * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF X * SUCH DAMAGE. X * X * %W% (Jukka Ukkonen) %E% X */ X X#ifndef lint Xstatic const char sccsid[] = "%W%\t(Jukka Ukkonen)\t%E%"; X#endif X X X#include X#include X#include X#include X#include X Xint Xsched_get_priority_max (policy) X int policy; X{ X errno = 0; X X switch (policy) { X X case SCHED_FIFO: X case SCHED_RR: X case SCHED_IDLE: X return (RTP_PRIO_MAX); X X case SCHED_TIMESHARE: X return (PRIO_MAX); X X default: X errno = EINVAL; /* Here is a gotcha! Always check errno! */ X return (-1); /* Whether negatives are valid is unspecified. */ X } X} X END-of-sched/sched_get_priority_max.c echo x - sched/sched_get_priority_min.c sed 's/^X//' >sched/sched_get_priority_min.c << 'END-of-sched/sched_get_priority_min.c' X/* X * Copyright (c) 1995,1996 Jukka Ukkonen X * X * Redistribution and use in source and binary forms, with or without X * modification, are permitted provided that the following conditions X * are met: X * 1. Redistributions of source code must retain the above copyright X * notice, this list of conditions and the following disclaimer. X * 2. Redistributions in binary form must reproduce the above copyright X * notice, this list of conditions and the following disclaimer in the X * documentation and/or other materials provided with the distribution. X * 3. All advertising materials mentioning features or use of this software X * must display the following acknowledgement: X * This product includes software developed by Jukka Antero Ukkonen. X * 4. Neither the names of the authors nor the names of contributors X * may be used to endorse or promote products derived from this software X * without specific prior written permission. X * 5. The source code must be available for anyone who wishes to have it. X * X * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND X * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE X * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE X * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE X * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL X * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS X * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) X * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT X * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY X * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF X * SUCH DAMAGE. X * X * %W% (Jukka Ukkonen) %E% X */ X X#ifndef lint Xstatic const char sccsid[] = "%W%\t(Jukka Ukkonen)\t%E%"; X#endif X X X#include X#include X#include X#include X#include X Xint Xsched_get_priority_max (policy) X int policy; X{ X errno = 0; X X switch (policy) { X X case SCHED_FIFO: X case SCHED_RR: X case SCHED_IDLE: X return (RTP_PRIO_MIN); X X case SCHED_TIMESHARE: X return (PRIO_MIN); X X default: X errno = EINVAL; /* Here is a gotcha! Always check errno! */ X return (-1); /* Whether negatives are valid is unspecified. */ X } X} X END-of-sched/sched_get_priority_min.c echo x - sched/sched_rr_get_interval.c sed 's/^X//' >sched/sched_rr_get_interval.c << 'END-of-sched/sched_rr_get_interval.c' X/* X * Copyright (c) 1995,1996 Jukka Ukkonen X * X * Redistribution and use in source and binary forms, with or without X * modification, are permitted provided that the following conditions X * are met: X * 1. Redistributions of source code must retain the above copyright X * notice, this list of conditions and the following disclaimer. X * 2. Redistributions in binary form must reproduce the above copyright X * notice, this list of conditions and the following disclaimer in the X * documentation and/or other materials provided with the distribution. X * 3. All advertising materials mentioning features or use of this software X * must display the following acknowledgement: X * This product includes software developed by Jukka Antero Ukkonen. X * 4. Neither the names of the authors nor the names of contributors X * may be used to endorse or promote products derived from this software X * without specific prior written permission. X * 5. The source code must be available for anyone who wishes to have it. X * X * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND X * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE X * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE X * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE X * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL X * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS X * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) X * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT X * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY X * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF X * SUCH DAMAGE. X * X * %W% (Jukka Ukkonen) %E% X */ X X#ifndef lint Xstatic const char sccsid[] = "%W%\t(Jukka Ukkonen)\t%E%"; X#endif X X X#include X#include X#include X#include X#include X#include X#include X#include X#include X#include X Xint Xsched_rr_get_interval (pid, ts) X pid_t pid; X struct timespec *ts; X{ X struct clockinfo cinfo; X struct rtprio rtp; X int sysmib[2]; X size_t cinfosize; X X if (! ts) { X errno = EFAULT; X X return (-1); X } X X if (rtprio (RTP_LOOKUP, pid, &rtp) < 0) X return (-1); X X if (rtp.type != SCHED_RR) { X errno = EINVAL; X X return (-1); X } X X cinfosize = sizeof (cinfo); X X sysmib[0] = CTL_KERN; X sysmib[1] = KERN_CLOCKRATE; X X if (sysctl (sysmib, 2, &cinfo, &cinfosize, NULL, 0) < 0) X return (-1); X X ts->ts_sec = 0; X ts->ts_nsec = cinfo.tick * 10 * 1000; /* really (hz / 10) */ X X return (0); X} X X#ifdef DEBUG_SCHED_RR_GET_INTERVAL X Xint Xmain () X{ X struct timespec ts; X X if (sched_rr_get_interval (getpid (), &ts) < 0) { X perror ("sched_rr_get_interval ()"); X exit (-1); X } X X printf ("ts.ts_sec = %d, ts.ts_nsec = %d\n", ts.ts_sec, ts.ts_nsec); X X return (0); X} X X#endif X END-of-sched/sched_rr_get_interval.c echo x - sched/sched_setparam.c sed 's/^X//' >sched/sched_setparam.c << 'END-of-sched/sched_setparam.c' X/* X * Copyright (c) 1995,1996 Jukka Ukkonen X * X * Redistribution and use in source and binary forms, with or without X * modification, are permitted provided that the following conditions X * are met: X * 1. Redistributions of source code must retain the above copyright X * notice, this list of conditions and the following disclaimer. X * 2. Redistributions in binary form must reproduce the above copyright X * notice, this list of conditions and the following disclaimer in the X * documentation and/or other materials provided with the distribution. X * 3. All advertising materials mentioning features or use of this software X * must display the following acknowledgement: X * This product includes software developed by Jukka Antero Ukkonen. X * 4. Neither the names of the authors nor the names of contributors X * may be used to endorse or promote products derived from this software X * without specific prior written permission. X * 5. The source code must be available for anyone who wishes to have it. X * X * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND X * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE X * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE X * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE X * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL X * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS X * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) X * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT X * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY X * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF X * SUCH DAMAGE. X * X * %W% (Jukka Ukkonen) %E% X */ X X#ifndef lint Xstatic const char sccsid[] = "%W%\t(Jukka Ukkonen)\t%E%"; X#endif X X X#include X#include X#include X#include X#include X#include X Xint Xsched_setparam (pid, param) X pid_t pid; X struct sched_param *param; X{ X struct rtprio rtp; X X if (! param) { X errno = EINVAL; X return (-1); X } X X if (rtprio (RTP_LOOKUP, pid, &rtp) < 0) X return (-1); X X if (rtp.type == RTP_PRIO_NORMAL) { X if (setpriority (PRIO_PROCESS, pid, -param->sched_priority) < 0) X return (-1); X X if (setpriority (PRIO_PGRP, pid, -param->sched_pgprio) < 0) X return (-1); X X if (setpriority (PRIO_USER, pid, -param->sched_userprio) < 0) X return (-1); X X rtp.prio = 0; X } X else X rtp.prio = RTP_PRIO_MAX - param->sched_priority; X X if (rtprio (RTP_SET, pid, &rtp) < 0) X return (-1); X X return (0); X} END-of-sched/sched_setparam.c echo x - sched/sched_setscheduler.c sed 's/^X//' >sched/sched_setscheduler.c << 'END-of-sched/sched_setscheduler.c' X/* X * Copyright (c) 1995,1996 Jukka Ukkonen X * X * Redistribution and use in source and binary forms, with or without X * modification, are permitted provided that the following conditions X * are met: X * 1. Redistributions of source code must retain the above copyright X * notice, this list of conditions and the following disclaimer. X * 2. Redistributions in binary form must reproduce the above copyright X * notice, this list of conditions and the following disclaimer in the X * documentation and/or other materials provided with the distribution. X * 3. All advertising materials mentioning features or use of this software X * must display the following acknowledgement: X * This product includes software developed by Jukka Antero Ukkonen. X * 4. Neither the names of the authors nor the names of contributors X * may be used to endorse or promote products derived from this software X * without specific prior written permission. X * 5. The source code must be available for anyone who wishes to have it. X * X * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND X * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE X * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE X * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE X * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL X * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS X * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) X * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT X * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY X * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF X * SUCH DAMAGE. X * X * %W% (Jukka Ukkonen) %E% X */ X X#ifndef lint Xstatic const char sccsid[] = "%W%\t(Jukka Ukkonen)\t%E%"; X#endif X X X#include X#include X#include X#include X#include X#include X Xint Xsched_setscheduler (pid, policy, param) X pid_t pid; X int policy; X struct sched_param *param; X{ X struct rtprio rtp; X X if (! param) { X errno = EINVAL; X return (-1); X } X X rtp.type = policy; X X if (policy == RTP_PRIO_NORMAL) { X if (setpriority (PRIO_PROCESS, pid, -param->sched_priority) < 0) X return (-1); X X if (setpriority (PRIO_PGRP, pid, -param->sched_pgprio) < 0) X return (-1); X X if (setpriority (PRIO_USER, pid, -param->sched_userprio) < 0) X return (-1); X X rtp.prio = 0; X } X else X rtp.prio = RTP_PRIO_MAX - param->sched_priority; X X if (rtprio (RTP_SET, pid, &rtp) < 0) X return (-1); X X return (0); X} END-of-sched/sched_setscheduler.c echo x - sched/Makefile sed 's/^X//' >sched/Makefile << 'END-of-sched/Makefile' X XCC = gcc X X.c.o: X $(CC) $(CFLAGS) -c $< X ld -r -x $@ X mv a.out $@ X chmod a-x $@ X XCINCL = -I../include -I../ctype X XCFLAGS = -O4 -fexpensive-optimizations -fpcc-struct-return -funsigned-char \ X -D_NO_POSIX_OPAQUE_TYPES $(CDEBUG) $(CINCL) X#CFLAGS = $(CDEBUG) $(CINCL) X XSRCS = \ X sched_get_priority_max.c sched_setparam.c \ X sched_get_priority_min.c sched_setscheduler.c \ X sched_getparam.c sched_getscheduler.c \ X sched_rr_get_interval.c X XOBJS = \ X sched_get_priority_max.o sched_setparam.o \ X sched_get_priority_min.o sched_setscheduler.o \ X sched_getparam.o sched_getscheduler.o \ X sched_rr_get_interval.o X Xlibsched.a: $(OBJS) X rm -f $@ X ar rv $@ $(OBJS) X ranlib $@ X END-of-sched/Makefile echo x - sched/Kernel-Sched.Diffs sed 's/^X//' >sched/Kernel-Sched.Diffs << 'END-of-sched/Kernel-Sched.Diffs' X--- /sys/kern/kern_resource.c.orig Tue May 30 11:05:39 1995 X+++ /sys/kern/kern_resource.c Mon Dec 25 20:52:30 1995 X@@ -247,8 +247,11 @@ X /* can't set realtime priority */ X if (rtp.type == RTP_PRIO_REALTIME) X return (EPERM); X+ if (rtp.type == RTP_PRIO_FIFO) X+ return (EPERM); X } X switch (rtp.type) { X+ case RTP_PRIO_FIFO: X case RTP_PRIO_REALTIME: X case RTP_PRIO_NORMAL: X case RTP_PRIO_IDLE: X--- /sys/kern/kern_synch.c.orig Tue May 30 11:05:44 1995 X+++ /sys/kern/kern_synch.c Tue Dec 26 16:23:20 1995 X@@ -67,8 +67,10 @@ X roundrobin(arg) X void *arg; X { X+ if (! curproc || curproc->p_rtprio.type != RTP_PRIO_FIFO) { X+ need_resched(); X+ } X X- need_resched(); X timeout(roundrobin, NULL, hz / 10); X } X X@@ -670,7 +672,11 @@ X p->p_usrpri = newpriority; X if (newpriority < curpriority) X need_resched(); X- } else { X+ } else if (! curproc || X+ (curproc->p_rtprio.type != RTP_PRIO_FIFO) || X+ (((p->p_rtprio.type == RTP_PRIO_FIFO) || X+ (p->p_rtprio.type == RTP_PRIO_REALTIME)) && X+ (p->p_rtprio.prio < curproc->p_rtprio.prio))) { X need_resched(); X } X } X--- /sys/sys/rtprio.h.orig Sun Oct 2 06:45:59 1994 X+++ /sys/sys/rtprio.h Mon Dec 25 20:48:18 1995 X@@ -42,7 +42,26 @@ X #define RTP_PRIO_REALTIME 0 X #define RTP_PRIO_NORMAL 1 X #define RTP_PRIO_IDLE 2 X+#define RTP_PRIO_FIFO 3 X X+/* X+ * RTP_PRIO_QUANTUM -- not implemented yet! X+ * Actually this is intended as another type X+ * of round-robin policy with the ability to X+ * allow processes request a non-default X+ * time-slice or time-quantum. X+ */ X+/* #define RTP_PRIO_QUANTUM 4 */ X+ X+/* X+ * RTP_PRIO_DEADLINE -- not implemented yet! X+ */ X+/* #define RTP_PRIO_DEADLINE 5 */ X+ X+/* X+ * Actual priority ranges should be changed X+ * to cover at least some 128 to 256 steps! X+ */ X /* priority range */ X #define RTP_PRIO_MIN 0 /* Highest priority */ X #define RTP_PRIO_MAX 31 /* Lowest priority */ X@@ -57,6 +76,10 @@ X struct rtprio { X u_short type; X u_short prio; X+#if defined(RTP_PRIO_DEADLINE) || defined(RTP_PRIO_QUANTUM) X+ struct timeval deadline; /* Fail if not ready to repeat. */ X+ struct timeval quantum; /* Min./required time slice. */ X+#endif X }; X #endif X X--- /sys/i386/i386/swtch.s.orig Tue Dec 26 14:19:25 1995 X+++ /sys/i386/i386/swtch.s Tue Dec 26 14:20:58 1995 X@@ -90,6 +90,9 @@ X X movzwl P_RTPRIO_PRIO(%eax),%edx X X+ cmpw $RTP_PRIO_FIFO,P_RTPRIO_TYPE(%eax) /* fifo rt priority? */ X+ je set_rt X+ X cmpw $RTP_PRIO_REALTIME,P_RTPRIO_TYPE(%eax) /* realtime priority? */ X jne set_id /* must be idle priority */ X X--- /sys/vm/vm_glue.c.orig Mon Oct 16 22:43:05 1995 X+++ /sys/vm/vm_glue.c Mon Dec 25 20:52:32 1995 X@@ -430,6 +430,9 @@ X /* X * do not swapout a realtime process X */ X+ if (p->p_rtprio.type == RTP_PRIO_FIFO) X+ continue; X+ X if (p->p_rtprio.type == RTP_PRIO_REALTIME) X continue; X X--- /usr/include/sys/rtprio.h.orig Sun Oct 2 06:45:59 1994 X+++ /usr/include/sys/rtprio.h Mon Dec 25 20:48:18 1995 X@@ -42,7 +42,26 @@ X #define RTP_PRIO_REALTIME 0 X #define RTP_PRIO_NORMAL 1 X #define RTP_PRIO_IDLE 2 X+#define RTP_PRIO_FIFO 3 X X+/* X+ * RTP_PRIO_QUANTUM -- not implemented yet! X+ * Actually this is intended as another type X+ * of round-robin policy with the ability to X+ * allow processes request a non-default X+ * time-slice or time-quantum. X+ */ X+/* #define RTP_PRIO_QUANTUM 4 */ X+ X+/* X+ * RTP_PRIO_DEADLINE -- not implemented yet! X+ */ X+/* #define RTP_PRIO_DEADLINE 5 */ X+ X+/* X+ * Actual priority ranges should be changed X+ * to cover at least some 128 to 256 steps! X+ */ X /* priority range */ X #define RTP_PRIO_MIN 0 /* Highest priority */ X #define RTP_PRIO_MAX 31 /* Lowest priority */ X@@ -57,6 +76,10 @@ X struct rtprio { X u_short type; X u_short prio; X+#if defined(RTP_PRIO_DEADLINE) || defined(RTP_PRIO_QUANTUM) X+ struct timeval deadline; /* Fail if not ready to repeat. */ X+ struct timeval quantum; /* Min./required time slice. */ X+#endif X }; X #endif X END-of-sched/Kernel-Sched.Diffs echo x - sched/sched_yield.Diffs sed 's/^X//' >sched/sched_yield.Diffs << 'END-of-sched/sched_yield.Diffs' X--- /sys/kern/init_sysent.c.no_sched_yield Wed Dec 4 23:41:55 1996 X+++ /sys/kern/init_sysent.c Wed Dec 4 23:49:14 1996 X@@ -179,6 +179,7 @@ X int mlock(); X int munlock(); X int getsid(); X+int sched_yield(); X int lkmnosys(); X X #ifdef COMPAT_43 X@@ -489,7 +490,8 @@ X { 2, munlock }, /* 204 = munlock */ X /* { 0, nosys }, 205 = nosys */ X { 1, getsid }, /* 205 = getsid */ X- { 0, nosys }, /* 206 = nosys */ X+ /* { 0, nosys }, 206 = nosys */ X+ { 0, sched_yield }, /* 206 = sched_yield */ X { 0, nosys }, /* 207 = nosys */ X { 0, nosys }, /* 208 = nosys */ X { 0, nosys }, /* 209 = nosys */ X--- /sys/kern/syscalls.c.no_sched_yield Wed Dec 4 23:42:24 1996 X+++ /sys/kern/syscalls.c Wed Dec 4 23:46:07 1996 X@@ -249,7 +249,8 @@ X "munlock", /* 204 = munlock */ X /* "#205", 205 = nosys */ X "getsid", /* 205 = getsid */ X- "#206", /* 206 = nosys */ X+ /* "#206", 206 = nosys */ X+ "sched_yield", /* 206 = sched_yield */ X "#207", /* 207 = nosys */ X "#208", /* 208 = nosys */ X "#209", /* 209 = nosys */ X--- /sys/kern/syscalls.master.no_sched_yield Wed Dec 4 23:42:43 1996 X+++ /sys/kern/syscalls.master Wed Dec 4 23:44:28 1996 X@@ -280,7 +280,8 @@ X 204 STD 2 BSD munlock X ; 205 UNIMPL 0 NOHIDE nosys X 205 STD 1 BSD getsid X-206 UNIMPL 0 NOHIDE nosys X+; 206 UNIMPL 0 NOHIDE nosys X+206 STD 0 POSIX sched_yield X 207 UNIMPL 0 NOHIDE nosys X 208 UNIMPL 0 NOHIDE nosys X 209 UNIMPL 0 NOHIDE nosys X--- /sys/kern/kern_synch.c.no_sched_yield Tue Dec 24 13:12:02 1996 X+++ /sys/kern/kern_synch.c Tue Dec 24 11:25:33 1996 X@@ -681,3 +681,20 @@ X } X } X X+struct sched_yield_args { X+ void *arg; X+}; X+/* ARGSUSED */ X+int X+sched_yield (p, uap, retval) X+ struct proc *p; X+ struct sched_yield_args *uap; X+ int *retval; X+{ X+ need_resched (); /* Wild, isn't it? */ X+ X+ *retval = 0; X+ X+ return (0); X+} X+ X--- /usr/include/sys/syscall.h.no_sched_yield Tue Dec 24 13:19:56 1996 X+++ /usr/include/sys/syscall.h Tue Dec 24 12:23:18 1996 X@@ -193,3 +193,4 @@ X #define SYS_mlock 203 X #define SYS_munlock 204 X #define SYS_getsid 205 X+#define SYS_sched_yield 206 X--- /usr/include/unistd.h.no_sched_yield Tue Dec 24 13:18:59 1996 X+++ /usr/include/unistd.h Tue Dec 24 12:39:59 1996 X@@ -174,6 +174,7 @@ X int vhangup __P((void)); X void *valloc __P((size_t)); /* obsoleted by malloc() */ X pid_t vfork __P((void)); X+int sched_yield __P((void)); X #endif /* !_POSIX_SOURCE */ X __END_DECLS X X--- /sys/sys/syscall.h.no_sched_yield Tue Dec 24 13:22:52 1996 X+++ /sys/sys/syscall.h Tue Dec 24 12:23:56 1996 X@@ -193,3 +193,4 @@ X #define SYS_mlock 203 X #define SYS_munlock 204 X #define SYS_getsid 205 X+#define SYS_sched_yield 206 END-of-sched/sched_yield.Diffs echo x - sched/RTprio.diffs sed 's/^X//' >sched/RTprio.diffs << 'END-of-sched/RTprio.diffs' X--- /usr/src/usr.sbin/rtprio/rtprio.c.orig Sun Oct 2 06:48:21 1994 X+++ /usr/src/usr.sbin/rtprio/rtprio.c Tue Dec 26 11:18:20 1995 X@@ -63,6 +63,10 @@ X X if (!strcmp(p, "rtprio")) X rtp.type = RTP_PRIO_REALTIME; X+#ifdef RTP_PRIO_FIFO X+ else if (!strcmp(p, "rtfifoprio")) X+ rtp.type = RTP_PRIO_FIFO; X+#endif X else if (!strcmp(p, "idprio")) X rtp.type = RTP_PRIO_IDLE; X X@@ -76,8 +80,13 @@ X perror(argv[0]); X exit (1); X } X+ X printf("%s: ", p); X+ X switch (rtp.type) { X+ case RTP_PRIO_FIFO: X+ printf("hard realtime fifo priority %d\n", rtp.prio); X+ break; X case RTP_PRIO_REALTIME: X printf("realtime priority %d\n", rtp.prio); X break; END-of-sched/RTprio.diffs exit