Date: Thu, 30 Jan 1997 11:00:59 -0800 From: "Jordan K. Hubbard" <jkh@time.cdrom.com> To: hackers@freebsd.org Subject: Jukka Ukkonen: POSIX.4 - scheduler once more (as you requested) Message-ID: <14120.854650859@time.cdrom.com>
next in thread | raw e-mail | index | archive | help
Any interest in this? I'd like a few more reviewers, if possible. ------- Forwarded Message From: jau@iki.fi (Jukka Ukkonen) Latin-Date: Miercuri XXIX Ianuarie a.d. MCMXCVII Organization: Private person Phone: +358-9-6215280 (home) Reply-To: jau@iki.fi (Jukka Ukkonen) Content-Conversion: prohibited X-Mailer: ELM [version 2.4 PL25+pgp] MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit Greetings from Helsinki, You said earlier that you did not dare to publish my POSIX sched-package before I send you the correct version once more, because previously I had sent you an old version. So, I tried to do exactly that by replying to the address in the From header of your message, and the message bounced back due to some error the reason of which I have already forgotten. This time the attached version of my POSIX-sched package is the most recent version. (I have removed the earlier test versions from my hard disk to avoid any more surprises with them.) The manual pages are still missing though as they were about a month ago when we last discussed this extension. 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 <jau@jau.tmt.tele.fi> 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 <sys/types.h> X#include <sys/rtprio.h> X#include <time.h> /* 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 <jau@jau.tmt.tele.fi> 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 <sys/types.h> X#include <sys/time.h> X#include <sys/resource.h> X#include <sys/rtprio.h> X#include <sched.h> X#include <errno.h> 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 <jau@jau.tmt.tele.fi> 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 <sys/types.h> X#include <sys/time.h> X#include <sys/resource.h> X#include <sys/rtprio.h> 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 <jau@jau.tmt.tele.fi> 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 <sys/types.h> X#include <sys/time.h> X#include <sys/resource.h> X#include <sched.h> X#include <errno.h> 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 <jau@jau.tmt.tele.fi> 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 <sys/types.h> X#include <sys/time.h> X#include <sys/resource.h> X#include <sched.h> X#include <errno.h> 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 <jau@jau.tmt.tele.fi> 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 <sys/param.h> X#include <sys/types.h> X#include <sys/time.h> X#include <sys/resource.h> X#include <sys/rtprio.h> X#include <sys/sysctl.h> X#include <unistd.h> X#include <time.h> X#include <sched.h> X#include <errno.h> 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 <jau@jau.tmt.tele.fi> 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 <sys/types.h> X#include <sys/time.h> X#include <sys/resource.h> X#include <sys/rtprio.h> X#include <sched.h> X#include <errno.h> 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 <jau@jau.tmt.tele.fi> 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 <sys/types.h> X#include <sys/time.h> X#include <sys/resource.h> X#include <sys/rtprio.h> X#include <sched.h> X#include <errno.h> 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 ------- End of Forwarded Message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?14120.854650859>