Date: Fri, 27 Dec 1996 14:30:02 -0800 (PST) From: "Jukka A. Ukkonen" <jau@jau.tmt.tele.fi> To: freebsd-bugs Subject: Re: kern/2273: POSIX.4 / POSIX.1a style sched_*() API and RTFIFO-scheduler patches Message-ID: <199612272230.OAA11453@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR kern/2273; it has been noted by GNATS.
From: "Jukka A. Ukkonen" <jau@jau.tmt.tele.fi>
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 <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
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199612272230.OAA11453>
