Commit 8da53d4595a53fb9a3380dd4d1c9bc24c7c9aab8 ("lib/string.c: improve strrchr()") changed strrchr() implementation from "rewind to the end and search backwards" to "search forward" optimizing for characher not found case. However, common case is exactly the opposite: string is absolute pathname, c is '/' always to be found.
Previous code did 1 branch per character + 1 branch for every character in the last path component. Current code does 2 branches per characher regardless. Patch reverts to previous implementation (sans fixed coding style). Signed-off-by: Alexey Dobriyan <adobri...@gmail.com> --- Cc linux-kernel lib/string.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) --- a/lib/string.c +++ b/lib/string.c @@ -313,12 +313,13 @@ EXPORT_SYMBOL(strchrnul); */ char *strrchr(const char *s, int c) { - const char *last = NULL; + const char *p = s + strlen(s); + do { - if (*s == (char)c) - last = s; - } while (*s++); - return (char *)last; + if (*p == (char)c) + return (char *)p; + } while (--p >= s); + return NULL; } EXPORT_SYMBOL(strrchr); #endif -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/