aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOliver O'Halloran <oohall@gmail.com>2016-07-25 14:16:25 +1000
committerStewart Smith <stewart@linux.vnet.ibm.com>2017-02-23 13:18:57 +1100
commitc55f3f83789fdc865d7052beaab5ebedea55b042 (patch)
treeb06ca4f3c8c3e2cbfed31802be74670a368f7551
parent5bcb6c4ac405ab7dd5227069b5c2e686d5d087eb (diff)
downloadskiboot-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.c49
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;
}