kernel: preserve guest pthread priorities

Extracted from Stefanos Costa's pthread fix in #147.
This commit is contained in:
Stefanos Costa authored and nmzik committed 2026-08-03 01:05:00 +02:00
1 parent 86a586025f
commit 3f21e2ee0f
1 file changed
+28 -29
+28 -29
View File
@@ -365,6 +365,7 @@ struct PthreadAttrPrivate {
uint64_t stack_map_addr; uint64_t stack_map_addr;
size_t stack_map_size; size_t stack_map_size;
int policy; int policy;
int guest_priority;
int inherit_sched; int inherit_sched;
int solosched; int solosched;
bool detached; bool detached;
@@ -2128,13 +2129,8 @@ int KYTY_SYSV_ABI PthreadAttrGetschedparam(const PthreadAttr* attr, KernelSchedP
int result = pthread_attr_getschedparam(&(*attr)->p, param); int result = pthread_attr_getschedparam(&(*attr)->p, param);
if (param->sched_priority <= -2) { // Host priority mapping is lossy; return the exact guest value.
param->sched_priority = 767; param->sched_priority = (*attr)->guest_priority;
} else if (param->sched_priority >= +2) {
param->sched_priority = 256;
} else {
param->sched_priority = 700;
}
if (result == 0) { if (result == 0) {
return OK; return OK;
@@ -2309,10 +2305,17 @@ int KYTY_SYSV_ABI PthreadAttrSetschedparam(PthreadAttr* attr, const KernelSchedP
int result = pthread_attr_setschedparam(&attr_value->p, &pparam); int result = pthread_attr_setschedparam(&attr_value->p, &pparam);
#if KYTY_PLATFORM == KYTY_PLATFORM_WINDOWS
if (result == 0) { if (result == 0) {
attr_value->guest_priority = param->sched_priority;
return OK; return OK;
} }
return KERNEL_ERROR_EINVAL; return KERNEL_ERROR_EINVAL;
#else
attr_value->guest_priority = param->sched_priority;
(void)result;
return OK;
#endif
} }
int KYTY_SYSV_ABI PthreadAttrSetschedpolicy(PthreadAttr* attr, int policy) { int KYTY_SYSV_ABI PthreadAttrSetschedpolicy(PthreadAttr* attr, int policy) {
@@ -3639,28 +3642,17 @@ int KYTY_SYSV_ABI PthreadGetprio(Pthread thread, int* prio) {
EXIT_NOT_IMPLEMENTED(prio == nullptr); EXIT_NOT_IMPLEMENTED(prio == nullptr);
sched_param param {}; sched_param native_param {};
int pol = 0; int native_policy = 0;
if (pthread_getschedparam(thread->p, &native_policy, &native_param) != 0) {
int result = pthread_getschedparam(thread->p, &pol, &param);
if (result == 0) {
if (param.sched_priority <= -2) {
*prio = 767;
} else if (param.sched_priority >= +2) {
*prio = 256;
} else {
*prio = 700;
}
LOGF("\t PthreadGetprio: %d, %d\n", thread->unique_id, *prio);
return OK;
}
return KERNEL_ERROR_EINVAL; return KERNEL_ERROR_EINVAL;
} }
*prio = thread->attr->guest_priority;
LOGF("\t PthreadGetprio: %d, %d\n", thread->unique_id, *prio);
return OK;
}
int KYTY_SYSV_ABI PthreadSetprio(Pthread thread, int prio) { int KYTY_SYSV_ABI PthreadSetprio(Pthread thread, int prio) {
PRINT_NAME(); PRINT_NAME();
@@ -3673,7 +3665,10 @@ int KYTY_SYSV_ABI PthreadSetprio(Pthread thread, int prio) {
int result = pthread_getschedparam(thread->p, &pol, &param); int result = pthread_getschedparam(thread->p, &pol, &param);
if (result == 0) { if (result != 0) {
return KERNEL_ERROR_EINVAL;
}
if (prio <= 478) { if (prio <= 478) {
param.sched_priority = +2; param.sched_priority = +2;
} else if (prio >= 733) { } else if (prio >= 733) {
@@ -3685,13 +3680,17 @@ int KYTY_SYSV_ABI PthreadSetprio(Pthread thread, int prio) {
result = pthread_setschedparam(thread->p, pol, &param); result = pthread_setschedparam(thread->p, pol, &param);
if (result == 0) { if (result == 0) {
thread->attr->guest_priority = prio;
LOGF("\t PthreadSetprio: %d, %d\n", thread->unique_id, prio); LOGF("\t PthreadSetprio: %d, %d\n", thread->unique_id, prio);
return OK; return OK;
} }
}
#if KYTY_PLATFORM == KYTY_PLATFORM_WINDOWS
return KERNEL_ERROR_EINVAL; return KERNEL_ERROR_EINVAL;
#else
thread->attr->guest_priority = prio;
return OK;
#endif
} }
void KYTY_SYSV_ABI PthreadTestcancel() { void KYTY_SYSV_ABI PthreadTestcancel() {