Skip to content

Commit 72fcce7

Browse files
Alexey Dobriyanpmladek
authored andcommitted
vsprintf: uninline simple_strntoull(), reorder arguments
* uninline simple_strntoull(), gcc overinlines and this function is not performance critical * reorder arguments, so that appending INT_MAX as 4th argument generates very efficient tail call Space savings: add/remove: 1/0 grow/shrink: 0/3 up/down: 27/-179 (-152) Function old new delta simple_strntoll - 27 +27 simple_strtoull 15 10 -5 simple_strtoll 41 7 -34 vsscanf 1930 1790 -140 Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com> Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Reviewed-by: Petr Mladek <pmladek@suse.com> Signed-off-by: Petr Mladek <pmladek@suse.com> Link: https://lore.kernel.org/all/82a2af6e-9b6c-4a09-89d7-ca90cc1cdad1@p183/
1 parent 3f6074c commit 72fcce7

File tree

1 file changed

+12
-13
lines changed

1 file changed

+12
-13
lines changed

lib/vsprintf.c

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,8 @@
6060
bool no_hash_pointers __ro_after_init;
6161
EXPORT_SYMBOL_GPL(no_hash_pointers);
6262

63-
static noinline unsigned long long simple_strntoull(const char *startp, size_t max_chars, char **endp, unsigned int base)
63+
noinline
64+
static unsigned long long simple_strntoull(const char *startp, char **endp, unsigned int base, size_t max_chars)
6465
{
6566
const char *cp;
6667
unsigned long long result = 0ULL;
@@ -95,7 +96,7 @@ static noinline unsigned long long simple_strntoull(const char *startp, size_t m
9596
noinline
9697
unsigned long long simple_strtoull(const char *cp, char **endp, unsigned int base)
9798
{
98-
return simple_strntoull(cp, INT_MAX, endp, base);
99+
return simple_strntoull(cp, endp, base, INT_MAX);
99100
}
100101
EXPORT_SYMBOL(simple_strtoull);
101102

@@ -130,8 +131,8 @@ long simple_strtol(const char *cp, char **endp, unsigned int base)
130131
}
131132
EXPORT_SYMBOL(simple_strtol);
132133

133-
static long long simple_strntoll(const char *cp, size_t max_chars, char **endp,
134-
unsigned int base)
134+
noinline
135+
static long long simple_strntoll(const char *cp, char **endp, unsigned int base, size_t max_chars)
135136
{
136137
/*
137138
* simple_strntoull() safely handles receiving max_chars==0 in the
@@ -140,9 +141,9 @@ static long long simple_strntoll(const char *cp, size_t max_chars, char **endp,
140141
* and the content of *cp is irrelevant.
141142
*/
142143
if (*cp == '-' && max_chars > 0)
143-
return -simple_strntoull(cp + 1, max_chars - 1, endp, base);
144+
return -simple_strntoull(cp + 1, endp, base, max_chars - 1);
144145

145-
return simple_strntoull(cp, max_chars, endp, base);
146+
return simple_strntoull(cp, endp, base, max_chars);
146147
}
147148

148149
/**
@@ -155,7 +156,7 @@ static long long simple_strntoll(const char *cp, size_t max_chars, char **endp,
155156
*/
156157
long long simple_strtoll(const char *cp, char **endp, unsigned int base)
157158
{
158-
return simple_strntoll(cp, INT_MAX, endp, base);
159+
return simple_strntoll(cp, endp, base, INT_MAX);
159160
}
160161
EXPORT_SYMBOL(simple_strtoll);
161162

@@ -3648,13 +3649,11 @@ int vsscanf(const char *buf, const char *fmt, va_list args)
36483649
break;
36493650

36503651
if (is_sign)
3651-
val.s = simple_strntoll(str,
3652-
field_width >= 0 ? field_width : INT_MAX,
3653-
&next, base);
3652+
val.s = simple_strntoll(str, &next, base,
3653+
field_width >= 0 ? field_width : INT_MAX);
36543654
else
3655-
val.u = simple_strntoull(str,
3656-
field_width >= 0 ? field_width : INT_MAX,
3657-
&next, base);
3655+
val.u = simple_strntoull(str, &next, base,
3656+
field_width >= 0 ? field_width : INT_MAX);
36583657

36593658
switch (qualifier) {
36603659
case 'H': /* that's 'hh' in format */

0 commit comments

Comments
 (0)