[PATCH 3/3] ARM: early_printk: use printascii() rather than printch()

Nicolas Pitre nicolas.pitre at linaro.org
Mon Oct 2 07:09:32 PDT 2017


On Mon, 2 Oct 2017, Uwe Kleine-König wrote:

> Hello Nicolas,
> 
> On Sun, Oct 01, 2017 at 10:06:18PM -0400, Nicolas Pitre wrote:
> > With printch() the console messages are sent out one character at a time
> > which is agonizingly slow especially with semihosting as the whole trap
> > intercept, remote byte access, and system resume danse is performed for
> 
> s/danse/dance/ ?
> 
> > every single character across a relatively slow remote debug connection.
> > Let's use printascii() to send a whole string at once. This is also going
> > to be more efficient, albeit to a quite lesser extent, with serial ports
> > as well.
> > 
> > Signed-off-by: Nicolas Pitre <nico at linaro.org>
> > ---
> >  arch/arm/kernel/early_printk.c | 16 ++++++++++------
> >  1 file changed, 10 insertions(+), 6 deletions(-)
> > 
> > diff --git a/arch/arm/kernel/early_printk.c b/arch/arm/kernel/early_printk.c
> > index 4307653696..9257736ec9 100644
> > --- a/arch/arm/kernel/early_printk.c
> > +++ b/arch/arm/kernel/early_printk.c
> > @@ -11,16 +11,20 @@
> >  #include <linux/kernel.h>
> >  #include <linux/console.h>
> >  #include <linux/init.h>
> > +#include <linux/string.h>
> >  
> > -extern void printch(int);
> > +extern void printascii(const char *);
> >  
> >  static void early_write(const char *s, unsigned n)
> >  {
> > -	while (n-- > 0) {
> > -		if (*s == '\n')
> > -			printch('\r');
> > -		printch(*s);
> > -		s++;
> > +	char buf[128];
> > +	while (n) {
> > +		unsigned l = min(n, sizeof(buf)-1);
> > +		memcpy(buf, s, l);
> > +		buf[l] = 0;
> > +		s += l;
> > +		n -= l;
> > +		printascii(buf);
> 
> I wonder if it is a usual case that n < 128 and s[n] == '\0'. If so this
> could be tested for and then the memcpy could be dropped.

I did try it. Unfortunately the passed string is not null terminated.


Nicolas


More information about the linux-arm-kernel mailing list