From: Janosch Frank <frankja@linux.ibm.com>
To: kvm@vger.kernel.org
Cc: linux-s390@vger.kernel.org, david@redhat.com, thuth@redhat.com
Subject: [kvm-unit-tests PATCH v3 3/6] s390x: Add linemode buffer to fix newline on every print
Date: Fri, 20 Sep 2019 10:03:53 +0200 [thread overview]
Message-ID: <20190920080356.1948-4-frankja@linux.ibm.com> (raw)
In-Reply-To: <20190920080356.1948-1-frankja@linux.ibm.com>
Linemode seems to add a newline for each sent message which makes
reading rather hard. Hence we add a small buffer and only print if
it's full or a newline is encountered. Except for when the string is
longer than the buffer, then we flush the buffer and print directly.
Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Acked-by: David Hildenbrand <david@redhat.com>
---
lib/s390x/sclp-console.c | 45 ++++++++++++++++++++++++++++++++++++----
1 file changed, 41 insertions(+), 4 deletions(-)
diff --git a/lib/s390x/sclp-console.c b/lib/s390x/sclp-console.c
index 19416b5..e1b9000 100644
--- a/lib/s390x/sclp-console.c
+++ b/lib/s390x/sclp-console.c
@@ -13,6 +13,7 @@
#include <asm/page.h>
#include <asm/arch_def.h>
#include <asm/io.h>
+#include <asm/spinlock.h>
#include "sclp.h"
/*
@@ -87,6 +88,10 @@ static uint8_t _ascebc[256] = {
0x90, 0x3F, 0x3F, 0x3F, 0x3F, 0xEA, 0x3F, 0xFF
};
+static char lm_buff[120];
+static unsigned char lm_buff_off;
+static struct spinlock lm_buff_lock;
+
static void sclp_print_ascii(const char *str)
{
int len = strlen(str);
@@ -103,10 +108,10 @@ static void sclp_print_ascii(const char *str)
sclp_service_call(SCLP_CMD_WRITE_EVENT_DATA, sccb);
}
-static void sclp_print_lm(const char *str)
+static void lm_print(const char *buff, int len)
{
unsigned char *ptr, *end, ch;
- unsigned int count, offset, len;
+ unsigned int count, offset;
struct WriteEventData *sccb;
struct mdb *mdb;
struct mto *mto;
@@ -117,11 +122,10 @@ static void sclp_print_lm(const char *str)
end = (unsigned char *) sccb + 4096 - 1;
memset(sccb, 0, sizeof(*sccb));
ptr = (unsigned char *) &sccb->msg.mdb.mto;
- len = strlen(str);
offset = 0;
do {
for (count = sizeof(*mto); offset < len; count++) {
- ch = str[offset++];
+ ch = buff[offset++];
if (ch == 0x0a || ptr + count > end)
break;
ptr[count] = _ascebc[ch];
@@ -148,6 +152,39 @@ static void sclp_print_lm(const char *str)
sclp_service_call(SCLP_CMD_WRITE_EVENT_DATA, sccb);
}
+
+/*
+ * In contrast to the ascii console, linemode produces a new
+ * line with every write of data. The report() function uses
+ * several printf() calls to generate a line of data which
+ * would all end up on different lines.
+ *
+ * Hence we buffer here until we encounter a \n or the buffer
+ * is full. That means that linemode output can look a bit
+ * different from ascii and that it takes a bit longer for
+ * lines to appear.
+ */
+static void sclp_print_lm(const char *str)
+{
+ int len = strlen(str), i = 0;
+
+ spin_lock(&lm_buff_lock);
+
+ while (len) {
+ lm_buff[lm_buff_off] = str[i];
+ lm_buff_off++;
+ len--;
+ /* Buffer full or newline? */
+ if (str[i] == '\n' || lm_buff_off == (sizeof(lm_buff) - 1)) {
+ lm_print(lm_buff, lm_buff_off);
+ memset(lm_buff, 0 , sizeof(lm_buff));
+ lm_buff_off = 0;
+ }
+ i++;
+ }
+ spin_unlock(&lm_buff_lock);
+}
+
/*
* SCLP needs to be initialized by setting a send and receive mask,
* indicating which messages the control program (we) want(s) to
--
2.17.2
next prev parent reply other threads:[~2019-09-20 8:04 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-09-20 8:03 [kvm-unit-tests PATCH v3 0/6] s390x: Add multiboot and smp Janosch Frank
2019-09-20 8:03 ` [kvm-unit-tests PATCH v3 1/6] s390x: Use interrupts in SCLP and add locking Janosch Frank
2019-09-20 8:12 ` David Hildenbrand
2019-09-20 8:03 ` [kvm-unit-tests PATCH v3 2/6] s390x: Add linemode console Janosch Frank
2019-09-20 8:03 ` Janosch Frank [this message]
2019-09-20 8:24 ` [kvm-unit-tests PATCH v3 3/6] s390x: Add linemode buffer to fix newline on every print David Hildenbrand
2019-09-20 8:31 ` Janosch Frank
2019-09-20 11:23 ` [kvm-unit-tests PATCH] " Janosch Frank
2019-09-20 8:03 ` [kvm-unit-tests PATCH v3 4/6] s390x: Add initial smp code Janosch Frank
2019-09-23 10:43 ` Thomas Huth
2019-09-23 14:15 ` [kvm-unit-tests PATCH] " Janosch Frank
2019-09-24 16:06 ` Thomas Huth
2019-09-20 8:03 ` [kvm-unit-tests PATCH v3 5/6] s390x: Prepare for external calls Janosch Frank
2019-09-25 8:50 ` David Hildenbrand
2019-09-20 8:03 ` [kvm-unit-tests PATCH v3 6/6] s390x: SMP test Janosch Frank
2019-09-25 8:49 ` Thomas Huth
2019-09-25 10:26 ` Janosch Frank
2019-09-25 9:03 ` David Hildenbrand
2019-09-25 10:24 ` Janosch Frank
2019-09-25 13:27 ` David Hildenbrand
2019-09-25 13:30 ` Thomas Huth
2019-09-25 13:32 ` David Hildenbrand
2019-09-25 13:35 ` David Hildenbrand
2019-09-25 13:39 ` David Hildenbrand
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190920080356.1948-4-frankja@linux.ibm.com \
--to=frankja@linux.ibm.com \
--cc=david@redhat.com \
--cc=kvm@vger.kernel.org \
--cc=linux-s390@vger.kernel.org \
--cc=thuth@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.