From 696fca3fd491972e615195f2ce94598b9c469cac Mon Sep 17 00:00:00 2001 From: Alexander Motin Date: Sun, 8 Aug 2021 21:34:33 -0400 Subject: [PATCH] Optimize res_find(). When the device name is provided, we can simply run strncmp() for each line to quickly skip unrelated ones, that is much faster than sscanf() and only then strcmp(). MFC after: 2 weeks --- sys/kern/subr_hints.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/sys/kern/subr_hints.c b/sys/kern/subr_hints.c index 3614659ebcf..b16761d7d6f 100644 --- a/sys/kern/subr_hints.c +++ b/sys/kern/subr_hints.c @@ -127,7 +127,7 @@ res_find(char **hintp_cookie, int *line, int *startln, const char **ret_name, int *ret_namelen, int *ret_unit, const char **ret_resname, int *ret_resnamelen, const char **ret_value) { - int fbacklvl = FBACK_MDENV, i = 0, n = 0; + int fbacklvl = FBACK_MDENV, i = 0, n = 0, namelen; char r_name[32]; int r_unit; char r_resname[32]; @@ -229,12 +229,16 @@ fallback: i = 0; } + if (name) + namelen = strlen(name); cp = hintp; while (cp) { (*line)++; if (strncmp(cp, "hint.", 5) != 0) goto nexthint; - n = sscanf(cp, "hint.%32[^.].%d.%32[^=]=%127s", r_name, &r_unit, + if (name && strncmp(cp + 5, name, namelen) != 0) + goto nexthint; + n = sscanf(cp + 5, "%32[^.].%d.%32[^=]=%127s", r_name, &r_unit, r_resname, r_value); if (n != 4) { printf("CONFIG: invalid hint '%s'\n", cp);