mcreboot: -h to indicate halting CPU in idle threads (e.g., in futex_wait())
This commit is contained in:
@@ -673,9 +673,11 @@ static uint64_t futex_wait_queue_me(struct futex_hash_bucket *hb, struct futex_q
|
||||
xchg4(&(cpu_local_var(current)->status), PS_INTERRUPTIBLE);
|
||||
|
||||
/* Indicate spin sleep */
|
||||
irqstate = ihk_mc_spinlock_lock(&thread->spin_sleep_lock);
|
||||
thread->spin_sleep = 1;
|
||||
ihk_mc_spinlock_unlock(&thread->spin_sleep_lock, irqstate);
|
||||
if (!idle_halt) {
|
||||
irqstate = ihk_mc_spinlock_lock(&thread->spin_sleep_lock);
|
||||
thread->spin_sleep = 1;
|
||||
ihk_mc_spinlock_unlock(&thread->spin_sleep_lock, irqstate);
|
||||
}
|
||||
|
||||
queue_me(q, hb);
|
||||
|
||||
|
||||
@@ -277,6 +277,7 @@ struct resource_set {
|
||||
|
||||
extern struct list_head resource_set_list;
|
||||
extern mcs_rwlock_lock_t resource_set_lock;
|
||||
extern int idle_halt;
|
||||
|
||||
struct process_hash {
|
||||
struct list_head list[HASH_SIZE];
|
||||
|
||||
@@ -144,6 +144,12 @@ static void parse_kargs(void)
|
||||
}
|
||||
}
|
||||
ihk_mc_set_dump_level(dump_level);
|
||||
|
||||
/* idle_halt option */
|
||||
ptr = find_command_line("idle_halt");
|
||||
if (ptr) {
|
||||
idle_halt = 1;
|
||||
}
|
||||
}
|
||||
|
||||
extern void ihk_mc_get_boot_time(unsigned long *tv_sec, unsigned long *tv_nsec);
|
||||
|
||||
@@ -100,6 +100,8 @@ extern void perf_reset(struct mc_perf_event *event);
|
||||
struct list_head resource_set_list;
|
||||
mcs_rwlock_lock_t resource_set_lock;
|
||||
|
||||
int idle_halt = 0;
|
||||
|
||||
void
|
||||
init_process(struct process *proc, struct process *parent)
|
||||
{
|
||||
@@ -3044,6 +3046,12 @@ void spin_sleep_or_schedule(void)
|
||||
int woken = 0;
|
||||
long irqstate;
|
||||
|
||||
/* Spinning disabled explicitly */
|
||||
if (idle_halt) {
|
||||
dkprintf("%s: idle_halt -> schedule()\n", __FUNCTION__);
|
||||
goto out_schedule;
|
||||
}
|
||||
|
||||
/* Try to spin sleep */
|
||||
irqstate = ihk_mc_spinlock_lock(&thread->spin_sleep_lock);
|
||||
if (thread->spin_sleep == 0) {
|
||||
@@ -3092,6 +3100,7 @@ void spin_sleep_or_schedule(void)
|
||||
cpu_pause();
|
||||
}
|
||||
|
||||
out_schedule:
|
||||
schedule();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user