Home | History | Annotate | Line # | Download | only in freebsd
freebsd_sched.c revision 1.17
      1  1.17      elad /*	$NetBSD: freebsd_sched.c,v 1.17 2008/02/28 16:09:19 elad Exp $	*/
      2   1.1  gmcgarry 
      3   1.1  gmcgarry /*-
      4   1.1  gmcgarry  * Copyright (c) 1999 The NetBSD Foundation, Inc.
      5   1.1  gmcgarry  * All rights reserved.
      6   1.1  gmcgarry  *
      7   1.1  gmcgarry  * This code is derived from software contributed to The NetBSD Foundation
      8   1.1  gmcgarry  * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
      9   1.1  gmcgarry  * NASA Ames Research Center; by Matthias Scheler.
     10   1.1  gmcgarry  *
     11   1.1  gmcgarry  * Redistribution and use in source and binary forms, with or without
     12   1.1  gmcgarry  * modification, are permitted provided that the following conditions
     13   1.1  gmcgarry  * are met:
     14   1.1  gmcgarry  * 1. Redistributions of source code must retain the above copyright
     15   1.1  gmcgarry  *    notice, this list of conditions and the following disclaimer.
     16   1.1  gmcgarry  * 2. Redistributions in binary form must reproduce the above copyright
     17   1.1  gmcgarry  *    notice, this list of conditions and the following disclaimer in the
     18   1.1  gmcgarry  *    documentation and/or other materials provided with the distribution.
     19   1.1  gmcgarry  * 3. All advertising materials mentioning features or use of this software
     20   1.1  gmcgarry  *    must display the following acknowledgement:
     21   1.1  gmcgarry  *	This product includes software developed by the NetBSD
     22   1.1  gmcgarry  *	Foundation, Inc. and its contributors.
     23   1.1  gmcgarry  * 4. Neither the name of The NetBSD Foundation nor the names of its
     24   1.1  gmcgarry  *    contributors may be used to endorse or promote products derived
     25   1.1  gmcgarry  *    from this software without specific prior written permission.
     26   1.1  gmcgarry  *
     27   1.1  gmcgarry  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     28   1.1  gmcgarry  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     29   1.1  gmcgarry  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     30   1.1  gmcgarry  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     31   1.1  gmcgarry  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     32   1.1  gmcgarry  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     33   1.1  gmcgarry  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     34   1.1  gmcgarry  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     35   1.1  gmcgarry  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     36   1.1  gmcgarry  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     37   1.1  gmcgarry  * POSSIBILITY OF SUCH DAMAGE.
     38   1.1  gmcgarry  */
     39   1.1  gmcgarry 
     40   1.1  gmcgarry /*
     41   1.1  gmcgarry  * FreeBSD compatibility module. Try to deal with scheduler related syscalls.
     42   1.1  gmcgarry  */
     43   1.1  gmcgarry 
     44   1.1  gmcgarry #include <sys/cdefs.h>
     45  1.17      elad __KERNEL_RCSID(0, "$NetBSD: freebsd_sched.c,v 1.17 2008/02/28 16:09:19 elad Exp $");
     46   1.1  gmcgarry 
     47   1.1  gmcgarry #include <sys/param.h>
     48   1.1  gmcgarry #include <sys/mount.h>
     49   1.1  gmcgarry #include <sys/proc.h>
     50   1.1  gmcgarry #include <sys/systm.h>
     51   1.1  gmcgarry #include <sys/syscallargs.h>
     52   1.3      elad #include <sys/kauth.h>
     53   1.1  gmcgarry 
     54  1.10        ad #include <sys/cpu.h>
     55   1.1  gmcgarry 
     56   1.1  gmcgarry #include <compat/freebsd/freebsd_syscallargs.h>
     57   1.1  gmcgarry #include <compat/freebsd/freebsd_sched.h>
     58   1.1  gmcgarry 
     59   1.1  gmcgarry int
     60  1.12       dsl freebsd_sys_yield(struct lwp *l, const void *v, register_t *retval)
     61   1.1  gmcgarry {
     62   1.1  gmcgarry 
     63   1.1  gmcgarry 	yield();
     64   1.1  gmcgarry 	return 0;
     65   1.1  gmcgarry }
     66   1.1  gmcgarry 
     67  1.17      elad /*
     68  1.17      elad  * XXX: Needs adjustment to do a proper conversion.
     69  1.17      elad  */
     70  1.17      elad static int
     71  1.17      elad sched_freebsd2native(int freebsd_policy,
     72  1.17      elad     struct freebsd_sched_param *freebsd_params, int *native_policy,
     73  1.17      elad     struct sched_param *native_params)
     74  1.17      elad {
     75  1.17      elad 	int error;
     76  1.17      elad 
     77  1.17      elad 	error = 0;
     78  1.17      elad 
     79  1.17      elad 	switch (freebsd_policy) {
     80  1.17      elad 	case FREEBSD_SCHED_OTHER:
     81  1.17      elad 		*native_policy = SCHED_OTHER;
     82  1.17      elad 		break;
     83  1.17      elad 
     84  1.17      elad 	case FREEBSD_SCHED_FIFO:
     85  1.17      elad 		*native_policy = SCHED_FIFO;
     86  1.17      elad 		break;
     87  1.17      elad 
     88  1.17      elad 	case FREEBSD_SCHED_RR:
     89  1.17      elad 		*native_policy = SCHED_RR;
     90  1.17      elad 		break;
     91  1.17      elad 
     92  1.17      elad 	default:
     93  1.17      elad 		error = EINVAL;
     94  1.17      elad 		break;
     95  1.17      elad 	}
     96  1.17      elad 
     97  1.17      elad 	if (freebsd_params != NULL && native_params != NULL && !error) {
     98  1.17      elad 		native_params = (struct sched_param *)freebsd_params;
     99  1.17      elad 	}
    100  1.17      elad 
    101  1.17      elad 	return (error)
    102  1.17      elad }
    103  1.17      elad 
    104  1.17      elad /*
    105  1.17      elad  * XXX: Needs adjustment to do a proper conversion.
    106  1.17      elad  */
    107  1.17      elad static int
    108  1.17      elad sched_native2freebsd(int native_policy, struct sched_param *native_params,
    109  1.17      elad     int *freebsd_policy, struct freebsd_sched_param *freebsd_params)
    110  1.17      elad {
    111  1.17      elad 	int error;
    112  1.17      elad 
    113  1.17      elad 	error = 0;
    114  1.17      elad 
    115  1.17      elad 	switch (native_policy) {
    116  1.17      elad 	case SCHED_OTHER:
    117  1.17      elad 		*freebsd_policy = FREEBSD_SCHED_OTHER;
    118  1.17      elad 		break;
    119  1.17      elad 
    120  1.17      elad 	case SCHED_FIFO:
    121  1.17      elad 		*freebsd_policy = FREEBSD_SCHED_FIFO;
    122  1.17      elad 		break;
    123  1.17      elad 
    124  1.17      elad 	case SCHED_RR:
    125  1.17      elad 		*freebsd_policy = FREEBSD_SCHED_RR;
    126  1.17      elad 		break;
    127  1.17      elad 
    128  1.17      elad 	default:
    129  1.17      elad 		error = EINVAL;
    130  1.17      elad 		break;
    131  1.17      elad 	}
    132  1.17      elad 
    133  1.17      elad 	if (native_params != NULL && freebsd_params != NULL && !error) {
    134  1.17      elad 		freebsd_params = (struct freebsd_sched_param *)native_params;
    135  1.17      elad 	}
    136  1.17      elad 
    137  1.17      elad 	return (error)
    138  1.17      elad }
    139  1.17      elad 
    140   1.1  gmcgarry int
    141  1.12       dsl freebsd_sys_sched_setparam(struct lwp *l, const struct freebsd_sys_sched_setparam_args *uap, register_t *retval)
    142   1.1  gmcgarry {
    143  1.12       dsl 	/* {
    144   1.1  gmcgarry 		syscallarg(pid_t) pid;
    145   1.1  gmcgarry 		syscallarg(const struct freebsd_sched_param *) sp;
    146  1.12       dsl 	} */
    147  1.17      elad 	int error, policy;
    148   1.1  gmcgarry 	struct freebsd_sched_param lp;
    149  1.17      elad 	struct sched_param sp;
    150   1.1  gmcgarry 
    151  1.17      elad 	if (SCARG(uap, pid) < 0 || SCARG(uap, sp) == NULL) {
    152  1.17      elad 		error = EINVAL;
    153  1.17      elad 		goto out;
    154  1.17      elad 	}
    155   1.1  gmcgarry 
    156   1.1  gmcgarry 	error = copyin(SCARG(uap, sp), &lp, sizeof(lp));
    157   1.1  gmcgarry 	if (error)
    158  1.17      elad 		goto out;
    159  1.17      elad 
    160  1.17      elad 	/* We need the current policy in FreeBSD terms. */
    161  1.17      elad 	error = do_sched_getparam(SCARG(uap, pid), 0, &policy, NULL);
    162  1.17      elad 	if (error)
    163  1.17      elad 		goto out;
    164  1.17      elad 	error = sched_native2freebsd(policy, NULL, &policy, NULL);
    165  1.17      elad 	if (error)
    166  1.17      elad 		goto out;
    167   1.1  gmcgarry 
    168  1.17      elad 	error = sched_freebsd2native(policy, &lp, &policy, &sp);
    169  1.17      elad 	if (error)
    170  1.17      elad 		goto out;
    171  1.17      elad 
    172  1.17      elad 	error = do_sched_setparam(SCARG(uap, pid), 0, policy, &sp);
    173  1.17      elad 	if (error)
    174  1.17      elad 		goto out;
    175   1.1  gmcgarry 
    176  1.17      elad  out:
    177  1.13      elad 	return error;
    178   1.1  gmcgarry }
    179   1.1  gmcgarry 
    180   1.1  gmcgarry int
    181  1.12       dsl freebsd_sys_sched_getparam(struct lwp *l, const struct freebsd_sys_sched_getparam_args *uap, register_t *retval)
    182   1.1  gmcgarry {
    183  1.12       dsl 	/* {
    184   1.1  gmcgarry 		syscallarg(pid_t) pid;
    185   1.1  gmcgarry 		syscallarg(struct freebsd_sched_param *) sp;
    186  1.12       dsl 	} */
    187   1.1  gmcgarry 	struct freebsd_sched_param lp;
    188  1.17      elad 	struct sched_param sp;
    189   1.8       dsl 	int error;
    190   1.1  gmcgarry 
    191  1.17      elad 	if (SCARG(uap, pid) < 0 || SCARG(uap, sp) == NULL) {
    192  1.17      elad 		error = EINVAL;
    193  1.17      elad 		goto out;
    194  1.17      elad 	}
    195  1.17      elad 
    196  1.17      elad 	error = do_sched_getparam(SCARG(uap, pid), 0, NULL, &sp);
    197  1.17      elad 	if (error)
    198  1.17      elad 		goto out;
    199   1.1  gmcgarry 
    200  1.17      elad 	error = sched_native2freebsd(0, &sp, NULL, &lp);
    201  1.17      elad 	if (error)
    202  1.17      elad 		goto out;
    203  1.13      elad 
    204  1.17      elad 	error = copyout(&lp, SCARG(uap, sp), sizeof(lp));
    205   1.8       dsl 	if (error)
    206  1.17      elad 		goto out;
    207   1.1  gmcgarry 
    208  1.17      elad  out:
    209  1.17      elad 	return (error);
    210   1.1  gmcgarry }
    211   1.1  gmcgarry 
    212   1.1  gmcgarry int
    213  1.12       dsl freebsd_sys_sched_setscheduler(struct lwp *l, const struct freebsd_sys_sched_setscheduler_args *uap, register_t *retval)
    214   1.1  gmcgarry {
    215  1.12       dsl 	/* {
    216   1.1  gmcgarry 		syscallarg(pid_t) pid;
    217   1.1  gmcgarry 		syscallarg(int) policy;
    218   1.1  gmcgarry 		syscallarg(cont struct freebsd_sched_scheduler *) sp;
    219  1.12       dsl 	} */
    220  1.17      elad 	int error, policy;
    221   1.1  gmcgarry 	struct freebsd_sched_param lp;
    222  1.17      elad 	struct sched_param sp;
    223   1.1  gmcgarry 
    224  1.17      elad 	if (SCARG(uap, pid) < 0 || SCARG(uap, sp) == NULL) {
    225  1.17      elad  		error = EINVAL;
    226  1.17      elad 		goto out;
    227  1.17      elad 	}
    228   1.1  gmcgarry 
    229   1.1  gmcgarry 	error = copyin(SCARG(uap, sp), &lp, sizeof(lp));
    230   1.1  gmcgarry 	if (error)
    231  1.17      elad 		goto out;
    232   1.1  gmcgarry 
    233  1.17      elad 	error = sched_freebsd2native(SCARG(uap, policy), &lp, &policy, &sp);
    234  1.17      elad 	if (error)
    235  1.17      elad 		goto out;
    236  1.13      elad 
    237  1.17      elad 	error = do_sched_setparam(SCARG(uap, pid), 0, policy, &sp);
    238   1.8       dsl 	if (error)
    239  1.17      elad 		goto out;
    240   1.1  gmcgarry 
    241  1.17      elad  out:
    242  1.17      elad 	return error;
    243   1.1  gmcgarry }
    244   1.1  gmcgarry 
    245   1.1  gmcgarry int
    246  1.12       dsl freebsd_sys_sched_getscheduler(struct lwp *l, const struct freebsd_sys_sched_getscheduler_args *uap, register_t *retval)
    247   1.1  gmcgarry {
    248  1.12       dsl 	/* {
    249   1.1  gmcgarry 		syscallarg(pid_t) pid;
    250  1.12       dsl 	} */
    251  1.17      elad 	int error, policy;
    252   1.1  gmcgarry 
    253   1.1  gmcgarry 	*retval = -1;
    254   1.1  gmcgarry 
    255  1.17      elad 	error = do_sched_getparam(l, SCARG(uap, pid), 0, &policy, NULL);
    256  1.17      elad 	if (error)
    257  1.17      elad 		goto out;
    258   1.1  gmcgarry 
    259  1.17      elad 	error = sched_native2freebsd(policy, NULL, &policy, NULL);
    260   1.8       dsl 	if (error)
    261  1.17      elad 		goto out;
    262  1.17      elad 
    263  1.17      elad 	*retval = policy;
    264   1.1  gmcgarry 
    265  1.17      elad  out:
    266  1.17      elad 	return error;
    267   1.1  gmcgarry }
    268   1.1  gmcgarry 
    269   1.1  gmcgarry int
    270  1.12       dsl freebsd_sys_sched_yield(struct lwp *l, const void *v, register_t *retval)
    271   1.1  gmcgarry {
    272   1.1  gmcgarry 
    273   1.1  gmcgarry 	yield();
    274   1.1  gmcgarry 	return 0;
    275   1.1  gmcgarry }
    276   1.1  gmcgarry 
    277   1.1  gmcgarry int
    278  1.12       dsl freebsd_sys_sched_get_priority_max(struct lwp *l, const struct freebsd_sys_sched_get_priority_max_args *uap, register_t *retval)
    279   1.1  gmcgarry {
    280  1.12       dsl 	/* {
    281   1.1  gmcgarry 		syscallarg(int) policy;
    282  1.12       dsl 	} */
    283   1.1  gmcgarry 
    284   1.1  gmcgarry 	/*
    285   1.1  gmcgarry 	 * We can't emulate anything put the default scheduling policy.
    286   1.1  gmcgarry 	 */
    287   1.1  gmcgarry 	if (SCARG(uap, policy) != FREEBSD_SCHED_OTHER) {
    288   1.1  gmcgarry 		*retval = -1;
    289   1.1  gmcgarry 		return EINVAL;
    290   1.1  gmcgarry 	}
    291   1.1  gmcgarry 
    292   1.1  gmcgarry 	*retval = 0;
    293   1.1  gmcgarry 	return 0;
    294   1.1  gmcgarry }
    295   1.1  gmcgarry 
    296   1.1  gmcgarry int
    297  1.12       dsl freebsd_sys_sched_get_priority_min(struct lwp *l, const struct freebsd_sys_sched_get_priority_min_args *uap, register_t *retval)
    298   1.1  gmcgarry {
    299  1.12       dsl 	/* {
    300   1.1  gmcgarry 		syscallarg(int) policy;
    301  1.12       dsl 	} */
    302   1.1  gmcgarry 
    303   1.1  gmcgarry 	/*
    304   1.1  gmcgarry 	 * We can't emulate anything put the default scheduling policy.
    305   1.1  gmcgarry 	 */
    306   1.1  gmcgarry 	if (SCARG(uap, policy) != FREEBSD_SCHED_OTHER) {
    307   1.1  gmcgarry 		*retval = -1;
    308   1.1  gmcgarry 		return EINVAL;
    309   1.1  gmcgarry 	}
    310   1.1  gmcgarry 
    311   1.1  gmcgarry 	*retval = 0;
    312   1.1  gmcgarry 	return 0;
    313   1.1  gmcgarry }
    314