On Sat, Jan 25, 2025 at 10:17:36AM +0100, Anton Lindqvist wrote:
> On Fri, Jan 24, 2025 at 02:19:07AM -0700, Vitaliy Makkoveev wrote:
> > CVSROOT: /cvs
> > Module name: src
> > Changes by: [email protected] 2025/01/24 02:19:07
> >
> > Modified files:
> > sys/net : if.c if_var.h
> >
> > Log message:
> > Move interface groups copyout(9)s out of netlock within ifioctl_get().
> >
> > The interface groups use complicated linking scheme with special data
> > structures allowing to link multiple interfaces with multiple groups.
> > We can't use iterators here, because some path are netlock covered and
> > we can't sleep in refcnt_finalize(9). We also can't use double locking
> > to protect this linking data because this new lock will cover very wide
> > area in kernel.
> >
> > Link desired interface groups or interfaces from group into temporary
> > lists, protected by new dedicated `if_tmplist_lock' rwlock(9). Bump the
> > reference counter to make concurrent destruction thread wait until
> > temporary linked data became unused.
> >
> > Delivered data are immutable, so netlock required only while filling
> > temporary lists.
> >
> > ok bluhm
>
> My amd64 regress machine locks up while running regress/usr.sbin/snmpd,
> cannot spawn new processes nor enter ddb. Bisected to this commit
> introducing the regression.
Sorry, I made stupid mitype with this diff. Fixed in tree.
Index: sys/net/if.c
===================================================================
RCS file: /cvs/src/sys/net/if.c,v
retrieving revision 1.724
diff -u -p -r1.724 if.c
--- sys/net/if.c 24 Jan 2025 09:19:07 -0000 1.724
+++ sys/net/if.c 25 Jan 2025 10:45:54 -0000
@@ -3195,7 +3195,7 @@ if_getgrouplist(caddr_t data)
NET_LOCK_SHARED();
TAILQ_FOREACH(ifg, &ifg_head, ifg_next)
ifgr->ifgr_len += sizeof(ifgrq);
- NET_LOCK_SHARED();
+ NET_UNLOCK_SHARED();
return (0);
}