Re: [PATCH] seq_file: Optimize seq_puts()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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)








[Index of Archives]     [Kernel Development]     [Kernel Announce]     [Kernel Newbies]     [Linux Networking Development]     [Share Photos]     [IDE]     [Security]     [Git]     [Netfilter]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Device Mapper]

  Powered by Linux