From afe2513c217f9b5747d250b93ff15d6951b2a088 Mon Sep 17 00:00:00 2001 From: Thomas Schoebel-Theuer Date: Sun, 8 Jan 2017 08:49:30 +0100 Subject: [PATCH] infra: shutdown bricks in parallel --- kernel/sy_old/sy_generic.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/kernel/sy_old/sy_generic.c b/kernel/sy_old/sy_generic.c index 965f6dcf..3a2bfc28 100644 --- a/kernel/sy_old/sy_generic.c +++ b/kernel/sy_old/sy_generic.c @@ -1471,7 +1471,7 @@ int mars_kill_brick(struct mars_brick *brick) // start shutdown set_button_wait((void*)brick, false, true, 0); - if (likely(brick->power.led_off)) { + if (brick->power.led_off) { int max_inputs = 0; bool failed = false; int i; @@ -1517,7 +1517,9 @@ int mars_kill_brick(struct mars_brick *brick) } status = 0; } else { - MARS_ERR("brick '%s' '%s' is not off\n", SAFE_STR(brick->brick_name), SAFE_STR(brick->brick_path)); + /* This may happen regularly when bricks are shut down in parallel */ + MARS_INF("brick '%s' '%s' is not off\n", + SAFE_STR(brick->brick_name), SAFE_STR(brick->brick_path)); status = -EUCLEAN; } @@ -1608,19 +1610,24 @@ restart: continue; } - list_del_init(tmp); + /* start shutdown */ + mars_power_button(brick, false, true); + + /* wait until actually off */ + if (!brick->power.led_off) + continue; + if (global) { up_write(&global->brick_mutex); } - MARS_DBG("KILLING '%s'\n", brick->brick_name); + MARS_DBG("KILLING '%s' '%s'\n", + brick->brick_path, brick->brick_name); status = mars_kill_brick(brick); - if (status >= 0) { + if (status >= 0) return_status++; - } else { - return status; - } + /* The list may have changed during the open lock * in unpredictable ways. */