View | Details | Raw Unified | Return to bug 240043 | Differences between
and this patch

Collapse All | Expand All

(-)sys/compat/linux/linux_misc.c (-25 / +91 lines)
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
(-)sys/compat/linux/linux_misc.h (+2 lines)
Lines 105-110 extern const char *linux_kplatform; Link Here
105
#define	LINUX_SCHED_FIFO	1
105
#define	LINUX_SCHED_FIFO	1
106
#define	LINUX_SCHED_RR		2
106
#define	LINUX_SCHED_RR		2
107
107
108
#define	LINUX_SCHED_RTPRIO_MAX	99
109
108
struct l_new_utsname {
110
struct l_new_utsname {
109
	char	sysname[LINUX_MAX_UTSNAME];
111
	char	sysname[LINUX_MAX_UTSNAME];
110
	char	nodename[LINUX_MAX_UTSNAME];
112
	char	nodename[LINUX_MAX_UTSNAME];

Return to bug 240043