Example #1
0
/*
 * IPIs are 'fast' interrupts, so we deal with them directly from our
 * signal handler.
 *
 * WARNING: Signals are not physically disabled here so we have to enter
 * our critical section before bumping gd_intr_nesting_level or another
 * interrupt can come along and get really confused.
 */
static
void
ipisig(int nada, siginfo_t *info, void *ctxp)
{
	globaldata_t gd = mycpu;
	thread_t td = gd->gd_curthread;

	if (td->td_critcount == 0) {
		++td->td_critcount;
		++gd->gd_intr_nesting_level;
		atomic_swap_int(&gd->gd_npoll, 0);
		lwkt_process_ipiq();
		--gd->gd_intr_nesting_level;
		--td->td_critcount;
	} else {
		need_ipiq();
	}
}
Example #2
0
/*
 * IPIs are 'fast' interrupts, so we deal with them directly from our
 * signal handler.
 *
 * WARNING: Signals are not physically disabled here so we have to enter
 * our critical section before bumping gd_intr_nesting_level or another
 * interrupt can come along and get really confused.
 */
static
void
ipisig(int nada, siginfo_t *info, void *ctxp)
{
	globaldata_t gd = mycpu;
	thread_t td = gd->gd_curthread;
	int save;

	save = errno;
	if (td->td_critcount == 0) {
		crit_enter_raw(td);
		++gd->gd_cnt.v_ipi;
		++gd->gd_intr_nesting_level;
		atomic_swap_int(&gd->gd_npoll, 0);
		lwkt_process_ipiq();
		--gd->gd_intr_nesting_level;
		crit_exit_raw(td);
	} else {
		need_ipiq();
	}
	errno = save;
}