diff options
Diffstat (limited to 'usr/src/lib/libc/port/threads/rtsched.c')
-rw-r--r-- | usr/src/lib/libc/port/threads/rtsched.c | 120 |
1 files changed, 11 insertions, 109 deletions
diff --git a/usr/src/lib/libc/port/threads/rtsched.c b/usr/src/lib/libc/port/threads/rtsched.c index 60d3357655..a85118dc5c 100644 --- a/usr/src/lib/libc/port/threads/rtsched.c +++ b/usr/src/lib/libc/port/threads/rtsched.c @@ -2,9 +2,8 @@ * CDDL HEADER START * * The contents of this file are subject to the terms of the - * Common Development and Distribution License, Version 1.0 only - * (the "License"). You may not use this file except in compliance - * with the License. + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. @@ -19,8 +18,9 @@ * * CDDL HEADER END */ + /* - * Copyright 2004 Sun Microsystems, Inc. All rights reserved. + * Copyright 2006 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -39,9 +39,6 @@ * The following variables are used for caching information * for priocntl TS and RT scheduling classs. */ -struct pcclass ts_class, rt_class; - -static rtdpent_t *rt_dptbl; /* RT class parameter table */ static int rt_rrmin; static int rt_rrmax; static int rt_fifomin; @@ -50,87 +47,6 @@ static int rt_othermin; static int rt_othermax; /* - * Get the RT class parameter table - */ -static void -_get_rt_dptbl() -{ - struct pcclass *pccp; - pcadmin_t pcadmin; - rtadmin_t rtadmin; - size_t rtdpsize; - - pccp = &ts_class; - /* get class's info */ - (void) strcpy(pccp->pcc_info.pc_clname, "TS"); - if (priocntl(P_PID, 0, PC_GETCID, (caddr_t)&(pccp->pcc_info)) < 0) - goto out; - - pccp = &rt_class; - /* get class's info */ - (void) strcpy(pccp->pcc_info.pc_clname, "RT"); - if (priocntl(P_PID, 0, PC_GETCID, (caddr_t)&(pccp->pcc_info)) < 0) - goto out; - - /* get RT class dispatch table in rt_dptbl */ - pcadmin.pc_cid = rt_class.pcc_info.pc_cid; - pcadmin.pc_cladmin = (caddr_t)&rtadmin; - rtadmin.rt_cmd = RT_GETDPSIZE; - if (priocntl(P_PID, 0, PC_ADMIN, (caddr_t)&pcadmin) < 0) - goto out; - rtdpsize = rtadmin.rt_ndpents * sizeof (rtdpent_t); - if (rt_dptbl == NULL && (rt_dptbl = lmalloc(rtdpsize)) == NULL) - goto out; - rtadmin.rt_dpents = rt_dptbl; - rtadmin.rt_cmd = RT_GETDPTBL; - if (priocntl(P_PID, 0, PC_ADMIN, (caddr_t)&pcadmin) < 0) - goto out; - pccp->pcc_primin = 0; - pccp->pcc_primax = ((rtinfo_t *)rt_class.pcc_info.pc_clinfo)->rt_maxpri; - return; -out: - thr_panic("get_rt_dptbl failed"); -} - -/* - * Translate RT class's user priority to global scheduling priority. - * This is for priorities coming from librt. - */ -pri_t -_map_rtpri_to_gp(pri_t pri) -{ - static mutex_t map_lock = DEFAULTMUTEX; - static int mapped = 0; - rtdpent_t *rtdp; - pri_t gpri; - - if (!mapped) { - lmutex_lock(&map_lock); - if (!mapped) { /* do this only once */ - _get_rt_dptbl(); - mapped = 1; - } - lmutex_unlock(&map_lock); - } - - /* First case is the default case, other two are seldomly taken */ - if (pri <= rt_dptbl[rt_class.pcc_primin].rt_globpri) { - gpri = pri + rt_dptbl[rt_class.pcc_primin].rt_globpri - - rt_class.pcc_primin; - } else if (pri >= rt_dptbl[rt_class.pcc_primax].rt_globpri) { - gpri = pri + rt_dptbl[rt_class.pcc_primax].rt_globpri - - rt_class.pcc_primax; - } else { - gpri = rt_dptbl[rt_class.pcc_primin].rt_globpri + 1; - for (rtdp = rt_dptbl+1; rtdp->rt_globpri < pri; ++rtdp, ++gpri) - ; - if (rtdp->rt_globpri > pri) - --gpri; - } - return (gpri); -} - -/* * Set the RT priority/policy of a lwp/thread. */ int @@ -175,30 +91,16 @@ _thrp_setlwpprio(lwpid_t lwpid, int policy, int pri) static void _init_rt_prio_ranges() { - pcinfo_t info; - - (void) strcpy(info.pc_clname, "RT"); - if (priocntl(P_PID, 0, PC_GETCID, (caddr_t)&info) == -1L) - rt_fifomin = rt_rrmin = rt_fifomax = rt_rrmax = 0; - else { - rtinfo_t *rtinfop = (rtinfo_t *)info.pc_clinfo; - rt_fifomin = rt_rrmin = 0; - rt_fifomax = rt_rrmax = rtinfop->rt_maxpri; - } - - (void) strcpy(info.pc_clname, "TS"); - if (priocntl(P_PID, 0, PC_GETCID, (caddr_t)&info) == -1L) - rt_othermin = rt_othermax = 0; - else { - tsinfo_t *tsinfop = (tsinfo_t *)info.pc_clinfo; - pri_t pri = tsinfop->ts_maxupri / 3; - rt_othermin = -pri; - rt_othermax = pri; - } + rt_rrmin = sched_get_priority_min(SCHED_RR); + rt_rrmax = sched_get_priority_max(SCHED_RR); + rt_fifomin = sched_get_priority_min(SCHED_FIFO); + rt_fifomax = sched_get_priority_max(SCHED_FIFO); + rt_othermin = sched_get_priority_min(SCHED_OTHER); + rt_othermax = sched_get_priority_max(SCHED_OTHER); } /* - * Validate priorities from librt. + * Validate priorities. */ int _validate_rt_prio(int policy, int pri) |