Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 27 Sep 2022 15:37:50 +0200
From:      Hans Petter Selasky <hps@selasky.org>
To:        Alan Somers <asomers@FreeBSD.org>, src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org, Emmanuel Vadot <manu@freebsd.org>
Subject:   Re: git: d3f96f661050 - main - Fix O(n^2) behavior in sysctl
Message-ID:  <8c611405-ae67-7235-5d11-f1ec25eaa70d@selasky.org>
In-Reply-To: <93f782f8-6c97-feaf-176c-37e70b349418@selasky.org>
References:  <202209270004.28R04K1r086731@gitrepo.freebsd.org> <93f782f8-6c97-feaf-176c-37e70b349418@selasky.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On 9/27/22 15:33, Hans Petter Selasky wrote:
> This change has resulted in some external breakage:
> 
>> drm_sysctl_freebsd.c:93:2: error: no member named 'sle_next' in 
>> 'struct sysctl_oid::(unnamed at /usr/src/sys/sys/sysctl.h:189:2)'
>>         SLIST_FOREACH(oid, SYSCTL_CHILDREN(drioid), oid_link) {
>>         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> /usr/src/sys/sys/queue.h:236:14: note: expanded from macro 
>> 'SLIST_FOREACH'
>>             (var) = SLIST_NEXT((var), field))
>>                     ^~~~~~~~~~~~~~~~~~~~~~~~
>> /usr/src/sys/sys/queue.h:272:46: note: expanded from macro 'SLIST_NEXT'
>> #define SLIST_NEXT(elm, field)  ((elm)->field.sle_next)
> 
> Maybe we should have a SYSCTL_FOREACH() macro?
> 
> --HPS

The fix is simple enough:

diff --git 
a/./work/drm-kmod-drm_v5.10.113_7/drivers/gpu/drm/drm_sysctl_freebsd.c.orig 
b/./work/drm-kmod-drm_v5.10.113_7/drivers/gpu/drm/drm_sysctl_freebsd.c
index 6bb5ece..2956210 100644
--- 
a/./work/drm-kmod-drm_v5.10.113_7/drivers/gpu/drm/drm_sysctl_freebsd.c.orig
+++ b/./work/drm-kmod-drm_v5.10.113_7/drivers/gpu/drm/drm_sysctl_freebsd.c
@@ -90,7 +90,7 @@ drm_sysctl_init(struct drm_device *dev)

         /* Find the next free slot under hw.dri */
         i = 0;
-       SLIST_FOREACH(oid, SYSCTL_CHILDREN(drioid), oid_link) {
+       RB_FOREACH(oid, sysctl_oid_list, SYSCTL_CHILDREN(drioid)) {
                 if (i == oid->oid_name[0] - '0' && oid->oid_name[1] == 0)
                         i++;
         }


--HPS



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?8c611405-ae67-7235-5d11-f1ec25eaa70d>