iwl->iwl_thread_port.mp_putport = iwl_put_port;
lwkt_create(iwl_service_loop, iwl, NULL, &iwl->iwl_thread,
- TDF_MPSAFE, unit % ncpus, "iwl%d", unit);
+ 0, unit % ncpus, "iwl%d", unit);
}
static void
struct fq_disk_ctx *diskctx = (struct fq_disk_ctx *)ds_diskctx;
struct thread *td_core, *td_balance;
- lwkt_create((void (*)(void *))fq_dispatcher, diskctx, &td_core, NULL,
- TDF_MPSAFE, -1, "fq_dispatch_%s", ds_diskctx->dp->d_cdev->si_name);
+ lwkt_create((void (*)(void *))fq_dispatcher, diskctx, &td_core,
+ NULL, 0, -1, "fq_dispatch_%s",
+ ds_diskctx->dp->d_cdev->si_name);
lwkt_create((void (*)(void *))fq_balance_thread, diskctx, &td_balance,
- NULL, TDF_MPSAFE, -1, "fq_balance_%s", ds_diskctx->dp->d_cdev->si_name);
+ NULL, 0, -1, "fq_balance_%s",
+ ds_diskctx->dp->d_cdev->si_name);
diskctx->td_balance = td_balance;
return 0;
void
mi_proc0init(struct globaldata *gd, struct user *proc0paddr)
{
- lwkt_init_thread(&thread0, proc0paddr, LWKT_THREAD_STACK,
- TDF_MPSAFE, gd);
+ lwkt_init_thread(&thread0, proc0paddr, LWKT_THREAD_STACK, 0, gd);
lwkt_set_comm(&thread0, "thread0");
#ifdef SMP
thread0.td_mpcount = 1; /* will hold mplock initially */
destproc->p_lasttid = lp->lwp_tid;
destproc->p_nthreads++;
- td = lwkt_alloc_thread(NULL, LWKT_THREAD_STACK, -1, TDF_MPSAFE);
+ td = lwkt_alloc_thread(NULL, LWKT_THREAD_STACK, -1, 0);
lp->lwp_thread = td;
td->td_proc = destproc;
td->td_lwp = lp;
* it up.
*/
if (emergency_intr_thread.td_kstack == NULL) {
- lwkt_create(ithread_emergency, NULL, NULL,
- &emergency_intr_thread,
- TDF_STOPREQ|TDF_INTTHREAD|TDF_MPSAFE,
- -1, "ithread emerg");
+ lwkt_create(ithread_emergency, NULL, NULL, &emergency_intr_thread,
+ TDF_STOPREQ | TDF_INTTHREAD, -1, "ithread emerg");
systimer_init_periodic_nq(&emergency_intr_timer,
emergency_intr_timer_callback, &emergency_intr_thread,
(emergency_intr_enable ? emergency_intr_freq : 1));
*/
if (info->i_state == ISTATE_NOTHREAD) {
info->i_state = ISTATE_NORMAL;
- lwkt_create((void *)ithread_handler, (void *)(intptr_t)intr, NULL,
- &info->i_thread, TDF_STOPREQ|TDF_INTTHREAD|TDF_MPSAFE, -1,
- "ithread %d", intr);
+ lwkt_create(ithread_handler, (void *)(intptr_t)intr, NULL,
+ &info->i_thread, TDF_STOPREQ | TDF_INTTHREAD, -1,
+ "ithread %d", intr);
if (intr >= FIRST_SOFTINT)
lwkt_setpri(&info->i_thread, TDPRI_SOFT_NORM);
else
/*
* The loop must be entered with one critical section held. The thread
- * is created with TDF_MPSAFE so the MP lock is not held on start.
+ * does not hold the mplock on startup.
*/
gd = mycpu;
lseconds = gd->gd_time_seconds;
thread_t td;
__va_list ap;
- td = lwkt_alloc_thread(NULL, LWKT_THREAD_STACK, -1,
- TDF_VERBOSE | TDF_MPSAFE);
+ td = lwkt_alloc_thread(NULL, LWKT_THREAD_STACK, -1, TDF_VERBOSE);
if (tdp)
*tdp = td;
cpu_set_thread_handler(td, kthread_exit, func, arg);
thread_t td;
__va_list ap;
- td = lwkt_alloc_thread(NULL, LWKT_THREAD_STACK, cpu,
- TDF_VERBOSE | TDF_MPSAFE);
+ td = lwkt_alloc_thread(NULL, LWKT_THREAD_STACK, cpu, TDF_VERBOSE);
if (tdp)
*tdp = td;
cpu_set_thread_handler(td, kthread_exit, func, arg);
thread_t td;
__va_list ap;
- td = lwkt_alloc_thread(NULL, stksize, -1, TDF_VERBOSE | TDF_MPSAFE);
+ td = lwkt_alloc_thread(NULL, stksize, -1, TDF_VERBOSE);
if (tdp)
*tdp = td;
cpu_set_thread_handler(td, kthread_exit, func, arg);
void
rand_thread_init(void)
{
- lwkt_create(rand_thread_loop, NULL, &rand_td, NULL,
- TDF_MPSAFE, 0, "random");
+ lwkt_create(rand_thread_loop, NULL, &rand_td, NULL, 0, 0, "random");
}
SYSINIT(rand, SI_SUB_HELPER_THREADS, SI_ORDER_ANY, rand_thread_init, 0);
* the cpu they were scheduled on.
*/
lwkt_create(softclock_handler, sc, NULL,
- &sc->thread, TDF_STOPREQ|TDF_INTTHREAD|TDF_MPSAFE,
+ &sc->thread, TDF_STOPREQ | TDF_INTTHREAD,
cpu, "softclock %d", cpu);
}
}
#endif
+/*
+ * lwkt core thread structural initialization.
+ *
+ * NOTE: All threads are initialized as mpsafe threads.
+ */
void
lwkt_init_thread(thread_t td, void *stack, int stksize, int flags,
struct globaldata *gd)
{
globaldata_t mygd = mycpu;
- /* all threads start mpsafe now */
- KKASSERT(flags & TDF_MPSAFE);
-
bzero(td, sizeof(struct thread));
td->td_kstack = stack;
td->td_kstack_size = stksize;
td->td_pri = TDPRI_KERN_DAEMON;
td->td_critcount = 1;
td->td_toks_stop = &td->td_toks_base;
-#ifdef SMP
- if ((flags & TDF_MPSAFE) == 0)
- td->td_mpcount = 1;
-#endif
if (lwkt_use_spin_port)
lwkt_initport_spin(&td->td_msgport);
else
atomic_add_int(&numasyncthreads, 1);
lwkt_create(device_attach_thread, dev, &td, NULL,
- TDF_MPSAFE, 0,
- (dev->desc ? dev->desc : "devattach"));
+ 0, 0, (dev->desc ? dev->desc : "devattach"));
}
static void
lwkt_gettoken(&disklist_token);
lwkt_create(disk_msg_core, /*args*/NULL, &td_core, NULL,
- TDF_MPSAFE, 0, "disk_msg_core");
+ 0, 0, "disk_msg_core");
tsleep(td_core, 0, "diskcore", 0);
lwkt_reltoken(&disklist_token);
}
if (count == 1) {
error = lwkt_create(taskqueue_thread_loop, tqp,
- &tq->tq_threads[i], NULL, TDF_STOPREQ | TDF_MPSAFE,
- cpu, "%s", ktname);
+ &tq->tq_threads[i], NULL,
+ TDF_STOPREQ, cpu,
+ "%s", ktname);
} else {
error = lwkt_create(taskqueue_thread_loop, tqp,
- &tq->tq_threads[i], NULL, TDF_STOPREQ | TDF_MPSAFE,
- cpu, "%s_%d", ktname, i);
+ &tq->tq_threads[i], NULL,
+ TDF_STOPREQ, cpu,
+ "%s_%d", ktname, i);
}
if (error) {
kprintf("%s: kthread_add(%s): error %d", __func__,
kprintf(" %d", i);
lwkt_create(sched_thread, NULL, NULL, &dd->helper_thread,
- TDF_STOPREQ | TDF_MPSAFE, i, "usched %d", i);
+ TDF_STOPREQ, i, "usched %d", i);
/*
* Allow user scheduling on the target cpu. cpu #0 has already
kprintf(" %d", i);
lwkt_create(dummy_sched_thread, NULL, NULL, &dd->helper_thread,
- TDF_STOPREQ | TDF_MPSAFE, i, "dsched %d", i);
+ TDF_STOPREQ, i, "dsched %d", i);
/*
* Allow user scheduling on the target cpu. cpu #0 has already
jo->flags &= ~(MC_JOURNAL_STOP_REQ | MC_JOURNAL_STOP_IMM);
jo->flags |= MC_JOURNAL_WACTIVE;
lwkt_create(journal_wthread, jo, NULL, &jo->wthread,
- TDF_STOPREQ | TDF_MPSAFE,
- -1, "journal w:%.*s", JIDMAX, jo->id);
+ TDF_STOPREQ, -1,
+ "journal w:%.*s", JIDMAX, jo->id);
lwkt_setpri(&jo->wthread, TDPRI_KERN_DAEMON);
lwkt_schedule(&jo->wthread);
if (jo->flags & MC_JOURNAL_WANT_FULLDUPLEX) {
jo->flags |= MC_JOURNAL_RACTIVE;
lwkt_create(journal_rthread, jo, NULL, &jo->rthread,
- TDF_STOPREQ | TDF_MPSAFE,
- -1, "journal r:%.*s", JIDMAX, jo->id);
+ TDF_STOPREQ, -1,
+ "journal r:%.*s", JIDMAX, jo->id);
lwkt_setpri(&jo->rthread, TDPRI_KERN_DAEMON);
lwkt_schedule(&jo->rthread);
}
struct thread *thr = &ifnet_threads[i];
lwkt_create(netmsg_service_loop, &ifnet_mpsafe_thread, NULL,
- thr, TDF_NETWORK | TDF_MPSAFE, i, "ifnet %d", i);
+ thr, TDF_NETWORK, i,
+ "ifnet %d", i);
netmsg_service_port_init(&thr->td_msgport);
}
}
*/
for (i = 0; i < ncpus; ++i) {
lwkt_create(netmsg_service_loop, &netisr_mpsafe_thread, NULL,
- &netisr_cpu[i], TDF_NETWORK | TDF_MPSAFE, i,
+ &netisr_cpu[i], TDF_NETWORK, i,
"netisr_cpu %d", i);
netmsg_service_port_init(&netisr_cpu[i].td_msgport);
}
int mplocked, *mpsafe_mode = arg;
/*
- * Thread was started with TDF_MPSAFE
+ * Threads always start mpsafe.
*/
mplocked = 0;
for (cpu = 0; cpu < ncpus; cpu++) {
lwkt_create(rtable_service_loop, NULL, &rtd, NULL,
- TDF_MPSAFE, cpu, "rtable_cpu %d", cpu);
+ 0, cpu, "rtable_cpu %d", cpu);
rt_ports[cpu] = &rtd->td_msgport;
}
}
for (cpu = 0; cpu < ncpus2; cpu++) {
lwkt_create(tcpmsg_service_loop, NULL, NULL,
- &tcp_thread[cpu], TDF_NETWORK | TDF_MPSAFE, cpu,
+ &tcp_thread[cpu], TDF_NETWORK, cpu,
"tcp_thread %d", cpu);
netmsg_service_port_init(&tcp_thread[cpu].td_msgport);
}
for (cpu = 0; cpu < ncpus2; cpu++) {
lwkt_create(netmsg_service_loop, &udp_mpsafe_thread, NULL,
- &udp_thread[cpu], TDF_NETWORK | TDF_MPSAFE, cpu,
+ &udp_thread[cpu], TDF_NETWORK, cpu,
"udp_thread %d", cpu);
netmsg_service_port_init(&udp_thread[cpu].td_msgport);
}
int mplocked;
/*
- * Thread was started with TDF_MPSAFE
+ * Threads always start mpsafe.
*/
mplocked = 0;
lwkt_init_thread(&gd->mi.gd_idlethread,
gd->mi.gd_prvspace->idlestack,
sizeof(gd->mi.gd_prvspace->idlestack),
- TDF_MPSAFE, &gd->mi);
+ 0, &gd->mi);
lwkt_set_comm(&gd->mi.gd_idlethread, "idle_%d", cpu);
gd->mi.gd_idlethread.td_switch = cpu_lwkt_switch;
gd->mi.gd_idlethread.td_sp -= sizeof(void *);
lwkt_init_thread(&gd->mi.gd_idlethread,
gd->mi.gd_prvspace->idlestack,
sizeof(gd->mi.gd_prvspace->idlestack),
- TDF_MPSAFE, &gd->mi);
+ 0, &gd->mi);
lwkt_set_comm(&gd->mi.gd_idlethread, "idle_%d", cpu);
gd->mi.gd_idlethread.td_switch = cpu_lwkt_switch;
gd->mi.gd_idlethread.td_sp -= sizeof(void *);
lwkt_init_thread(&gd->mi.gd_idlethread,
gd->mi.gd_prvspace->idlestack,
sizeof(gd->mi.gd_prvspace->idlestack),
- TDF_MPSAFE, &gd->mi);
+ 0, &gd->mi);
lwkt_set_comm(&gd->mi.gd_idlethread, "idle_%d", cpu);
gd->mi.gd_idlethread.td_switch = cpu_lwkt_switch;
gd->mi.gd_idlethread.td_sp -= sizeof(void *);
lwkt_init_thread(&gd->mi.gd_idlethread,
gd->mi.gd_prvspace->idlestack,
sizeof(gd->mi.gd_prvspace->idlestack),
- TDF_MPSAFE, &gd->mi);
+ 0, &gd->mi);
lwkt_set_comm(&gd->mi.gd_idlethread, "idle_%d", cpu);
gd->mi.gd_idlethread.td_switch = cpu_lwkt_switch;
gd->mi.gd_idlethread.td_sp -= sizeof(void *);
#define TDF_BLOCKED 0x00040000 /* Thread is blocked */
#define TDF_PANICWARN 0x00080000 /* panic warning in switch */
#define TDF_BLOCKQ 0x00100000 /* on block queue */
-#define TDF_MPSAFE 0x00200000 /* (thread creation) */
+#define TDF_UNUSED200000 0x00200000
#define TDF_EXITING 0x00400000 /* thread exiting */
#define TDF_USINGFP 0x00800000 /* thread using fp coproc */
#define TDF_KERNELFP 0x01000000 /* kernel using fp coproc */
lockmgr(&devfs_lock, LK_EXCLUSIVE);
lwkt_create(devfs_msg_core, /*args*/NULL, &td_core, NULL,
- TDF_MPSAFE, 0, "devfs_msg_core");
+ 0, 0, "devfs_msg_core");
while (devfs_run == 0)
lksleep(td_core, &devfs_lock, 0, "devfsc", 0);
lockmgr(&devfs_lock, LK_RELEASE);
TAILQ_INIT(&hmp->flusher.ready_list);
lwkt_create(hammer_flusher_master_thread, hmp,
- &hmp->flusher.td, NULL, TDF_MPSAFE, -1, "hammer-M");
+ &hmp->flusher.td, NULL, 0, -1, "hammer-M");
for (i = 0; i < HAMMER_MAX_FLUSHERS; ++i) {
info = kmalloc(sizeof(*info), hmp->m_misc, M_WAITOK|M_ZERO);
info->hmp = hmp;
TAILQ_INSERT_TAIL(&hmp->flusher.ready_list, info, entry);
lwkt_create(hammer_flusher_slave_thread, info,
- &info->td, NULL, TDF_MPSAFE, -1, "hammer-S%d", i);
+ &info->td, NULL, 0, -1, "hammer-S%d", i);
}
}
* Start the reader and writer threads.
*/
lwkt_create(nfssvc_iod_reader, nmp, &nmp->nm_rxthread,
- NULL, TDF_MPSAFE, rxcpu, "nfsiod_rx");
+ NULL, 0, rxcpu, "nfsiod_rx");
lwkt_create(nfssvc_iod_writer, nmp, &nmp->nm_txthread,
- NULL, TDF_MPSAFE, txcpu, "nfsiod_tx");
+ NULL, 0, txcpu, "nfsiod_tx");
return (0);
bad: