/* * This thread is responsible for nearly all of the partition * activation/deactivation. */ static int xpc_hb_checker(void *ignore) { int force_IRQ = 0; /* this thread was marked active by xpc_hb_init() */ set_cpus_allowed_ptr(current, cpumask_of(XPC_HB_CHECK_CPU)); /* set our heartbeating to other partitions into motion */ xpc_hb_check_timeout = jiffies + (xpc_hb_check_interval * HZ); xpc_start_hb_beater(); while (!xpc_exiting) { dev_dbg(xpc_part, "woke up with %d ticks rem; %d IRQs have " "been received\n", (int)(xpc_hb_check_timeout - jiffies), xpc_activate_IRQ_rcvd); /* checking of remote heartbeats is skewed by IRQ handling */ if (time_is_before_eq_jiffies(xpc_hb_check_timeout)) { xpc_hb_check_timeout = jiffies + (xpc_hb_check_interval * HZ); dev_dbg(xpc_part, "checking remote heartbeats\n"); xpc_check_remote_hb(); /* * On sn2 we need to periodically recheck to ensure no * IRQ/amo pairs have been missed. */ if (is_shub()) force_IRQ = 1; } /* check for outstanding IRQs */ if (xpc_activate_IRQ_rcvd > 0 || force_IRQ != 0) { force_IRQ = 0; dev_dbg(xpc_part, "processing activate IRQs " "received\n"); xpc_process_activate_IRQ_rcvd(); } /* wait for IRQ or timeout */ (void)wait_event_interruptible(xpc_activate_IRQ_wq, (time_is_before_eq_jiffies( xpc_hb_check_timeout) || xpc_activate_IRQ_rcvd > 0 || xpc_exiting)); } xpc_stop_hb_beater(); dev_dbg(xpc_part, "heartbeat checker is exiting\n"); /* mark this thread as having exited */ complete(&xpc_hb_checker_exited); return 0; }
static int xpc_hb_checker(void *ignore) { int force_IRQ = 0; /* */ set_cpus_allowed_ptr(current, cpumask_of(XPC_HB_CHECK_CPU)); /* */ xpc_hb_check_timeout = jiffies + (xpc_hb_check_interval * HZ); xpc_start_hb_beater(); while (!xpc_exiting) { dev_dbg(xpc_part, "woke up with %d ticks rem; %d IRQs have " "been received\n", (int)(xpc_hb_check_timeout - jiffies), xpc_activate_IRQ_rcvd); /* */ if (time_is_before_eq_jiffies(xpc_hb_check_timeout)) { xpc_hb_check_timeout = jiffies + (xpc_hb_check_interval * HZ); dev_dbg(xpc_part, "checking remote heartbeats\n"); xpc_check_remote_hb(); /* */ if (is_shub()) force_IRQ = 1; } /* */ if (xpc_activate_IRQ_rcvd > 0 || force_IRQ != 0) { force_IRQ = 0; dev_dbg(xpc_part, "processing activate IRQs " "received\n"); xpc_arch_ops.process_activate_IRQ_rcvd(); } /* */ (void)wait_event_interruptible(xpc_activate_IRQ_wq, (time_is_before_eq_jiffies( xpc_hb_check_timeout) || xpc_activate_IRQ_rcvd > 0 || xpc_exiting)); } xpc_stop_hb_beater(); dev_dbg(xpc_part, "heartbeat checker is exiting\n"); /* */ complete(&xpc_hb_checker_exited); return 0; }