Lines 1422-1427
linux_sched_setscheduler(struct thread *td,
Link Here
|
1422 |
if (error) |
1422 |
if (error) |
1423 |
return (error); |
1423 |
return (error); |
1424 |
|
1424 |
|
|
|
1425 |
switch (policy) { |
1426 |
case SCHED_OTHER: |
1427 |
if (sched_param.sched_priority != 0) |
1428 |
return (EINVAL); |
1429 |
|
1430 |
sched_param.sched_priority = |
1431 |
PRI_MAX_TIMESHARE - PRI_MIN_TIMESHARE; |
1432 |
break; |
1433 |
case SCHED_FIFO: |
1434 |
case SCHED_RR: |
1435 |
if (sched_param.sched_priority < 1 || |
1436 |
sched_param.sched_priority > LINUX_SCHED_RTPRIO_MAX) |
1437 |
return (EINVAL); |
1438 |
|
1439 |
/* |
1440 |
* Map [1, LINUX_SCHED_RTPRIO_MAX] to |
1441 |
* [0, RTP_PRIO_MAX - RTP_PRIO_MIN] (rounding down). |
1442 |
*/ |
1443 |
sched_param.sched_priority = (sched_param.sched_priority - 1) * |
1444 |
(RTP_PRIO_MAX - RTP_PRIO_MIN) / |
1445 |
(LINUX_SCHED_RTPRIO_MAX - 1); |
1446 |
break; |
1447 |
} |
1448 |
|
1425 |
tdt = linux_tdfind(td, args->pid, -1); |
1449 |
tdt = linux_tdfind(td, args->pid, -1); |
1426 |
if (tdt == NULL) |
1450 |
if (tdt == NULL) |
1427 |
return (ESRCH); |
1451 |
return (ESRCH); |
Lines 1463-1506
int
Link Here
|
1463 |
linux_sched_get_priority_max(struct thread *td, |
1487 |
linux_sched_get_priority_max(struct thread *td, |
1464 |
struct linux_sched_get_priority_max_args *args) |
1488 |
struct linux_sched_get_priority_max_args *args) |
1465 |
{ |
1489 |
{ |
1466 |
struct sched_get_priority_max_args bsd; |
|
|
1467 |
|
1468 |
switch (args->policy) { |
1490 |
switch (args->policy) { |
1469 |
case LINUX_SCHED_OTHER: |
1491 |
case LINUX_SCHED_OTHER: |
1470 |
bsd.policy = SCHED_OTHER; |
1492 |
td->td_retval[0] = 0; |
1471 |
break; |
1493 |
return (0); |
1472 |
case LINUX_SCHED_FIFO: |
1494 |
case LINUX_SCHED_FIFO: |
1473 |
bsd.policy = SCHED_FIFO; |
|
|
1474 |
break; |
1475 |
case LINUX_SCHED_RR: |
1495 |
case LINUX_SCHED_RR: |
1476 |
bsd.policy = SCHED_RR; |
1496 |
td->td_retval[0] = LINUX_SCHED_RTPRIO_MAX; |
1477 |
break; |
1497 |
return (0); |
1478 |
default: |
1498 |
default: |
1479 |
return (EINVAL); |
1499 |
return (EINVAL); |
1480 |
} |
1500 |
} |
1481 |
return (sys_sched_get_priority_max(td, &bsd)); |
|
|
1482 |
} |
1501 |
} |
1483 |
|
1502 |
|
1484 |
int |
1503 |
int |
1485 |
linux_sched_get_priority_min(struct thread *td, |
1504 |
linux_sched_get_priority_min(struct thread *td, |
1486 |
struct linux_sched_get_priority_min_args *args) |
1505 |
struct linux_sched_get_priority_min_args *args) |
1487 |
{ |
1506 |
{ |
1488 |
struct sched_get_priority_min_args bsd; |
|
|
1489 |
|
1490 |
switch (args->policy) { |
1507 |
switch (args->policy) { |
1491 |
case LINUX_SCHED_OTHER: |
1508 |
case LINUX_SCHED_OTHER: |
1492 |
bsd.policy = SCHED_OTHER; |
1509 |
td->td_retval[0] = 0; |
1493 |
break; |
1510 |
return (0); |
1494 |
case LINUX_SCHED_FIFO: |
1511 |
case LINUX_SCHED_FIFO: |
1495 |
bsd.policy = SCHED_FIFO; |
|
|
1496 |
break; |
1497 |
case LINUX_SCHED_RR: |
1512 |
case LINUX_SCHED_RR: |
1498 |
bsd.policy = SCHED_RR; |
1513 |
td->td_retval[0] = 1; |
1499 |
break; |
1514 |
return (0); |
1500 |
default: |
1515 |
default: |
1501 |
return (EINVAL); |
1516 |
return (EINVAL); |
1502 |
} |
1517 |
} |
1503 |
return (sys_sched_get_priority_min(td, &bsd)); |
|
|
1504 |
} |
1518 |
} |
1505 |
|
1519 |
|
1506 |
#define REBOOT_CAD_ON 0x89abcdef |
1520 |
#define REBOOT_CAD_ON 0x89abcdef |
Lines 1873-1879
linux_sched_setparam(struct thread *td,
Link Here
|
1873 |
{ |
1887 |
{ |
1874 |
struct sched_param sched_param; |
1888 |
struct sched_param sched_param; |
1875 |
struct thread *tdt; |
1889 |
struct thread *tdt; |
1876 |
int error; |
1890 |
int error, policy; |
1877 |
|
1891 |
|
1878 |
error = copyin(uap->param, &sched_param, sizeof(sched_param)); |
1892 |
error = copyin(uap->param, &sched_param, sizeof(sched_param)); |
1879 |
if (error) |
1893 |
if (error) |
Lines 1883-1888
linux_sched_setparam(struct thread *td,
Link Here
|
1883 |
if (tdt == NULL) |
1897 |
if (tdt == NULL) |
1884 |
return (ESRCH); |
1898 |
return (ESRCH); |
1885 |
|
1899 |
|
|
|
1900 |
error = kern_sched_getscheduler(td, tdt, &policy); |
1901 |
if (error) { |
1902 |
PROC_UNLOCK(tdt->td_proc); |
1903 |
return (error); |
1904 |
} |
1905 |
switch (policy) { |
1906 |
case SCHED_OTHER: |
1907 |
if (sched_param.sched_priority != 0) |
1908 |
return (EINVAL); |
1909 |
|
1910 |
sched_param.sched_priority = |
1911 |
PRI_MAX_TIMESHARE - PRI_MIN_TIMESHARE; |
1912 |
break; |
1913 |
case SCHED_FIFO: |
1914 |
case SCHED_RR: |
1915 |
if (sched_param.sched_priority < 1 || |
1916 |
sched_param.sched_priority > LINUX_SCHED_RTPRIO_MAX) |
1917 |
return (EINVAL); |
1918 |
|
1919 |
/* |
1920 |
* Map [1, LINUX_SCHED_RTPRIO_MAX] to |
1921 |
* [0, RTP_PRIO_MAX - RTP_PRIO_MIN] (rounding down). |
1922 |
*/ |
1923 |
sched_param.sched_priority = (sched_param.sched_priority - 1) * |
1924 |
(RTP_PRIO_MAX - RTP_PRIO_MIN) / |
1925 |
(LINUX_SCHED_RTPRIO_MAX - 1); |
1926 |
break; |
1927 |
} |
1928 |
|
1886 |
error = kern_sched_setparam(td, tdt, &sched_param); |
1929 |
error = kern_sched_setparam(td, tdt, &sched_param); |
1887 |
PROC_UNLOCK(tdt->td_proc); |
1930 |
PROC_UNLOCK(tdt->td_proc); |
1888 |
return (error); |
1931 |
return (error); |
Lines 1894-1910
linux_sched_getparam(struct thread *td,
Link Here
|
1894 |
{ |
1937 |
{ |
1895 |
struct sched_param sched_param; |
1938 |
struct sched_param sched_param; |
1896 |
struct thread *tdt; |
1939 |
struct thread *tdt; |
1897 |
int error; |
1940 |
int error, policy; |
1898 |
|
1941 |
|
1899 |
tdt = linux_tdfind(td, uap->pid, -1); |
1942 |
tdt = linux_tdfind(td, uap->pid, -1); |
1900 |
if (tdt == NULL) |
1943 |
if (tdt == NULL) |
1901 |
return (ESRCH); |
1944 |
return (ESRCH); |
1902 |
|
1945 |
|
1903 |
error = kern_sched_getparam(td, tdt, &sched_param); |
1946 |
error = kern_sched_getscheduler(td, tdt, &policy); |
1904 |
PROC_UNLOCK(tdt->td_proc); |
1947 |
if (error) { |
1905 |
if (error == 0) |
1948 |
PROC_UNLOCK(tdt->td_proc); |
1906 |
error = copyout(&sched_param, uap->param, |
1949 |
return (error); |
1907 |
sizeof(sched_param)); |
1950 |
} |
|
|
1951 |
switch (policy) { |
1952 |
case SCHED_OTHER: |
1953 |
PROC_UNLOCK(tdt->td_proc); |
1954 |
sched_param.sched_priority = 0; |
1955 |
break; |
1956 |
case SCHED_FIFO: |
1957 |
case SCHED_RR: |
1958 |
error = kern_sched_getparam(td, tdt, &sched_param); |
1959 |
PROC_UNLOCK(tdt->td_proc); |
1960 |
if (error) |
1961 |
return (error); |
1962 |
|
1963 |
/* |
1964 |
* Map [0, RTP_PRIO_MAX - RTP_PRIO_MIN] to |
1965 |
* [1, LINUX_SCHED_RTPRIO_MAX] (rounding up). |
1966 |
*/ |
1967 |
sched_param.sched_priority = (sched_param.sched_priority * |
1968 |
(LINUX_SCHED_RTPRIO_MAX - 1) + |
1969 |
(RTP_PRIO_MAX - RTP_PRIO_MIN - 1)) / |
1970 |
(RTP_PRIO_MAX - RTP_PRIO_MIN) + 1; |
1971 |
break; |
1972 |
} |
1973 |
error = copyout(&sched_param, uap->param, sizeof(sched_param)); |
1908 |
return (error); |
1974 |
return (error); |
1909 |
} |
1975 |
} |
1910 |
|
1976 |
|