this repo has no description
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Some unsuccessful work around kernel kevent workqueues, changes commented out

+61 -11
+6 -1
src/kernel/emulation/linux/bsdthread/bsdthread_register.c
··· 8 8 bsdthread_entry_t pthread_entry_point; 9 9 bsdwqthread_entry_t wqueue_entry_point; 10 10 11 + #define PTHREAD_FEATURE_DISPATCHFUNC 1 12 + #define PTHREAD_FEATURE_QOS_MAINTENANCE 0x10 13 + #define PTHREAD_FEATURE_QOS_DEFAULT 0x40000000 14 + #define WORKQ_FEATURE_FINEPRIO 0x02 11 15 #define WORKQ_FEATURE_KEVENT 0x40 12 16 13 17 long sys_bsdthread_register(void* thread_start, void* wqthread, int pthsize, ··· 16 20 pthread_obj_size = pthsize; 17 21 pthread_entry_point = (bsdthread_entry_t) thread_start; 18 22 wqueue_entry_point = (bsdwqthread_entry_t) wqthread; 19 - return WORKQ_FEATURE_KEVENT; 23 + return /* WORKQ_FEATURE_KEVENT | WORKQ_FEATURE_FINEPRIO | PTHREAD_FEATURE_QOS_MAINTENANCE 24 + | PTHREAD_FEATURE_DISPATCHFUNC | PTHREAD_FEATURE_QOS_DEFAULT */ 0; 20 25 } 21 26
+55 -10
src/kernel/emulation/linux/bsdthread/workq_kernreturn.c
··· 20 20 #define WQOPS_QUEUE_NEWSPISUPP 0x10 21 21 #define WQOPS_QUEUE_REQTHREADS 0x20 22 22 #define WQOPS_QUEUE_REQTHREADS2 0x30 23 - 23 + #define WQOPS_SET_EVENT_MANAGER_PRIORITY 0x80 24 24 25 25 // Flags for the newly spawned thread: 26 26 // WQ_FLAG_THREAD_NEWSPI ··· 58 58 void* __attribute__((weak)) __attribute__((visibility("default"))) pthread_getspecific(unsigned long key) { return NULL; } 59 59 int __attribute__((weak)) __attribute__((visibility("default"))) pthread_setspecific(unsigned long key, const void* value) { return 1; } 60 60 61 + static int priority_to_class(int prio); 62 + 61 63 // This is horrible, but it may work 62 64 static struct wq_kevent_data* wq_event_pending = NULL; 63 65 ··· 65 67 { 66 68 #ifndef VARIANT_DYLD 67 69 struct wq_kevent_data* wq_event = NULL; 70 + 71 + __simple_printf("workq_kernreturn: 0x%x, %p, 0x%x, 0x%x\n", options, item, affinity, prio); 68 72 69 73 // item is only used with WQOPS_QUEUE_ADD 70 74 switch (options) ··· 139 143 thread_self = thread_self_trap(); 140 144 stack = __darling_thread_get_stack(); 141 145 142 - // __simple_printf("Thread %d woken up\n", thread_self); 146 + __simple_printf("Thread %d woken up, prio=%d\n", thread_self, me.flags & WQ_FLAG_THREAD_PRIOMASK); 143 147 144 148 if (me.event) 145 149 wq_event_pending = me.event; 146 150 #ifdef __x86_64__ 147 151 __asm__ __volatile__ ( 152 + // "int3\n" 148 153 "movq %%rbx, %%r8\n" // 5th argument 149 154 "movl %5, %%r9d\n" // 6th argument 150 155 "movq %0, %%rsp\n" ··· 175 180 176 181 return 0; 177 182 } 183 + case WQOPS_SET_EVENT_MANAGER_PRIORITY: 178 184 case WQOPS_QUEUE_NEWSPISUPP: 179 185 return 0; 180 186 case WQOPS_QUEUE_REQTHREAD_FOR_KEVENT: ··· 187 193 { 188 194 // affinity contains thread count 189 195 190 - int i, flags, ret; 196 + int i, flags; 191 197 192 198 flags = WQ_FLAG_THREAD_NEWSPI; 193 - flags |= prio; 199 + flags |= prio & (WQ_FLAG_THREAD_PRIOMASK | WQ_FLAG_THREAD_OVERCOMMIT); //priority_to_class(prio); 194 200 195 201 if (wq_event != NULL) 196 202 flags |= WQ_FLAG_THREAD_KEVENT; 197 203 198 - // __simple_printf("Thread requested\n"); 204 + __simple_printf("Thread requested with prio %d\n", prio & WQ_FLAG_THREAD_PRIOMASK); 199 205 200 206 for (i = 0; i < affinity; i++) 201 207 { ··· 213 219 // Resume an existing thread 214 220 // __simple_printf("Resuming thread %d\n", id); 215 221 216 - //thread->prio = prio & WQ_FLAG_THREAD_PRIOMASK; 217 - //thread->prio |= prio & WQ_FLAG_THREAD_OVERCOMMIT; 218 222 thread->flags = flags; 219 223 thread->event = wq_event; 220 224 ··· 230 234 231 235 sem_up(&workq_parked_lock); 232 236 233 - // __simple_printf("Spawning a new thread, nevents=%d\n", (wq_event != NULL) ? wq_event->nevents : -1); 237 + __simple_printf("Spawning a new thread, nevents=%d\n", (wq_event != NULL) ? wq_event->nevents : -1); 234 238 wq_event_pending = wq_event; 235 239 236 - ret = __darling_thread_create(512*1024, pthread_obj_size, wqueue_entry_point, 0, 240 + __darling_thread_create(512*1024, pthread_obj_size, wqueue_entry_point, 0, 237 241 (wq_event != NULL) ? wq_event->events : NULL, flags, 238 242 (wq_event != NULL) ? wq_event->nevents : 0, 239 243 thread_self_trap); 240 244 241 - if (ret < 0) 245 + /*if (ret < 0) 246 + { 247 + __simple_printf("Failed to spawn a new thread, err %d\n", -ret); 242 248 return ret; 249 + }*/ 243 250 } 244 251 return 0; 245 252 } ··· 314 321 head->prev = item->prev; 315 322 } 316 323 324 + #define __PTHREAD_PRIORITY_CBIT_USER_INTERACTIVE 0x20 325 + #define __PTHREAD_PRIORITY_CBIT_USER_INITIATED 0x10 326 + #define __PTHREAD_PRIORITY_CBIT_DEFAULT 0x8 327 + #define __PTHREAD_PRIORITY_CBIT_UTILITY 0x4 328 + #define __PTHREAD_PRIORITY_CBIT_BACKGROUND 0x2 329 + #define __PTHREAD_PRIORITY_CBIT_MAINTENANCE 0x1 330 + #define __PTHREAD_PRIORITY_CBIT_UNSPECIFIED 0x0 331 + 332 + #define QOS_CLASS_USER_INTERACTIVE 0x21 333 + #define QOS_CLASS_USER_INITIATED 0x19 334 + #define QOS_CLASS_DEFAULT 0x15 335 + #define QOS_CLASS_UTILITY 0x11 336 + #define QOS_CLASS_BACKGROUND 0x09 337 + #define QOS_CLASS_MAINTENANCE 0x05 338 + #define QOS_CLASS_UNSPECIFIED 0x0 339 + 340 + static int priority_to_class(int prio) 341 + { 342 + int dec_prio = (prio & 0xff00) >> 8; 343 + switch (dec_prio) 344 + { 345 + case __PTHREAD_PRIORITY_CBIT_USER_INTERACTIVE: 346 + return __PTHREAD_PRIORITY_CBIT_MAINTENANCE; 347 + case __PTHREAD_PRIORITY_CBIT_USER_INITIATED: 348 + return QOS_CLASS_USER_INITIATED; 349 + case __PTHREAD_PRIORITY_CBIT_DEFAULT: 350 + return QOS_CLASS_DEFAULT; 351 + case __PTHREAD_PRIORITY_CBIT_UTILITY: 352 + return QOS_CLASS_UTILITY; 353 + case __PTHREAD_PRIORITY_CBIT_BACKGROUND: 354 + return QOS_CLASS_BACKGROUND; 355 + case __PTHREAD_PRIORITY_CBIT_MAINTENANCE: 356 + return QOS_CLASS_MAINTENANCE; 357 + default: 358 + return QOS_CLASS_UNSPECIFIED; 359 + } 360 + } 361 +