Re: [PATCH] seq_file: Optimize seq_puts()

From: Christophe JAILLET
Date: Fri Apr 19 2024 - 16:47:41 EST


Le 16/04/2024 à 22:56, David Laight a écrit :
From: Al Viro
Sent: 15 April 2024 22:01
...
No need to make it a macro, actually. And I would suggest going
a bit further:

static inline void seq_puts(struct seq_file *m, const char *s)

That probably needs to be 'always_inline'.

{
if (!__builtin_constant_p(*s))
__seq_puts(m, s);
else if (s[0] && !s[1])
seq_putc(m, s[0]);
else
seq_write(m, s, __builtin_strlen(s));
}

You missed seq_puts(m, "");

I did wonder about checking sizeof(s) <= 2 in the #define version.

git grep seq_puts.*\"[^\\].\" | wc -l
77

What would you do in this case?
2 seq_putc() in order to save a memcpy(..., 2), that's it?

It would also slightly change the behaviour, as only the 1st char could be added. Actually, it is all or nothing.

Don't know what is the best.

Any thought?

CJ


That would pick up the cases where a separator is changed/added
in a loop.

Could you do:
size_t len = __builtin_strlen(s);
if (!__builtin_constant_p(len))
__seq_puts(m, s);
else switch (len){
case 0: break;
case 1: seq_putc(m, s[0]);
default: seq_write(m, s, len);
}

David

-
Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK
Registration No: 1397386 (Wales)