/** Function to initialize the first DDE process. */ static int __init l4dde26_process_init(void) { ddekit_lock_init_unlocked(&_pid_task_list_lock); int kthreadd_pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES); kthreadd_task = find_task_by_pid(kthreadd_pid); l4dde26_process_add_worker(); return 0; }
/** Softirq thread function. * * Once started, a softirq thread waits for tasklets to be scheduled * and executes them. * * \param arg # of this softirq thread so that it grabs the correct lock * if multiple softirq threads are running. */ void l4dde26_softirq_thread(void *arg) { printk("Softirq daemon starting\n"); l4dde26_process_add_worker(); /* This thread will always be in a softirq, so set the * corresponding flag right now. */ preempt_count() |= SOFTIRQ_MASK; while(1) { ddekit_sem_down(dde_softirq_sem); do_softirq(); } }
/** Entry point for new kernel threads. Make this thread a DDE26 * worker and then execute the real thread fn. */ static void __kthread_helper(void *arg) { struct __kthread_data *k = (struct __kthread_data *)arg; /* * Make a copy of the fn and arg pointers, as the kthread struct is * deleted by our parent after notifying it and this may happen before we * get to execute the function. */ int (*_fn)(void*) = k->fn; void *_arg = k->arg; l4dde26_process_add_worker(); /* * Handshake with creator - we store our thread data in the * kthread struct and then unlock the lock to notify our * creator about completing setup */ k->kthread = (dde26_thread_data *)ddekit_thread_get_my_data(); ddekit_lock_unlock(&k->lock); do_exit(_fn(_arg)); }