diff options
author | Oliver O'Halloran <oohall@gmail.com> | 2016-07-25 14:16:25 +1000 |
---|---|---|
committer | Stewart Smith <stewart@linux.vnet.ibm.com> | 2017-02-23 13:18:57 +1100 |
commit | c55f3f83789fdc865d7052beaab5ebedea55b042 (patch) | |
tree | b06ca4f3c8c3e2cbfed31802be74670a368f7551 | |
parent | 5bcb6c4ac405ab7dd5227069b5c2e686d5d087eb (diff) | |
download | skiboot-c55f3f83789fdc865d7052beaab5ebedea55b042.zip skiboot-c55f3f83789fdc865d7052beaab5ebedea55b042.tar.gz skiboot-c55f3f83789fdc865d7052beaab5ebedea55b042.tar.bz2 |
core/console: refactor __flush_console()
Simplifies the flushing logic so that we only call into
con_driver->write() once. The existing implementation splits the
function into a normal path and a separate path when the in memory
console has wrapped. The logic is the same in both branches and
__flush_console() has enough bizarre crap happening with it's
not-a-lock-but-actually-a-lock flag variable.
Signed-off-by: Oliver O'Halloran <oohall@gmail.com>
Spelling-corrected-by: Andrew Donnellan <andrew.donnellan@au1.ibm.com>
Signed-off-by: Stewart Smith <stewart@linux.vnet.ibm.com>
-rw-r--r-- | core/console.c | 49 |
1 files changed, 25 insertions, 24 deletions
diff --git a/core/console.c b/core/console.c index 309249e..b9129c9 100644 --- a/core/console.c +++ b/core/console.c @@ -137,35 +137,36 @@ static bool __flush_console(bool flush_to_drivers) } in_flush = true; + /* + * NB: this must appear after the in_flush check since it modifies + * con_out. + */ + if (!flush_to_drivers) { + con_out = con_in; + in_flush = false; + return false; + } + do { more_flush = false; + if (con_out > con_in) { req = INMEM_CON_OUT_LEN - con_out; - if (!flush_to_drivers) { - len = req; - } else { - unlock(&con_lock); - len = con_driver->write(con_buf + con_out, - req); - lock(&con_lock); - } - con_out = (con_out + len) % INMEM_CON_OUT_LEN; - if (len < req) - goto bail; - } - if (con_out < con_in) { - if (!flush_to_drivers) { - len = con_in - con_out; - } else { - unlock(&con_lock); - len = con_driver->write(con_buf + con_out, - con_in - con_out); - lock(&con_lock); - } - con_out = (con_out + len) % INMEM_CON_OUT_LEN; - } + more_flush = true; + } else + req = con_in - con_out; + + unlock(&con_lock); + len = con_driver->write(con_buf + con_out, req); + lock(&con_lock); + + con_out = (con_out + len) % INMEM_CON_OUT_LEN; + + /* write error? */ + if (len < req) + break; } while(more_flush); -bail: + in_flush = false; return con_out != con_in; } |