aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Motin <mav@FreeBSD.org>2021-08-09 01:34:33 +0000
committerAlexander Motin <mav@FreeBSD.org>2021-08-23 01:15:47 +0000
commit0477149e585f142ca9e6732d198da470a0c346f3 (patch)
tree3b1ce9a8dcc72386a2e31024058921a80ab8f3fc
parent48edac83b3b577c2864f8ea4f8bb9962c834eaf8 (diff)
downloadsrc-0477149e585f142ca9e6732d198da470a0c346f3.tar.gz
src-0477149e585f142ca9e6732d198da470a0c346f3.zip
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 (cherry picked from commit 696fca3fd491972e615195f2ce94598b9c469cac)
-rw-r--r--sys/kern/subr_hints.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/sys/kern/subr_hints.c b/sys/kern/subr_hints.c
index 3614659ebcf2..b16761d7d6fc 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);