Index: sys/net/route.c =================================================================== RCS file: /mount/openbsd/cvs/src/sys/net/route.c,v diff -u -p -u -p -r1.439 route.c --- sys/net/route.c 13 Feb 2025 21:01:34 -0000 1.439 +++ sys/net/route.c 13 Feb 2025 22:22:34 -0000 @@ -578,10 +578,10 @@ rt_setgwroute(struct rtentry *rt, const * of a cached entry is greater than the bigger lifetime of the * gateway entries it is pointed by. */ - rw_enter_write(&nhrt->rt_lock); + mtx_enter(&nhrt->rt_mtx); nhrt->rt_flags |= RTF_CACHED; nhrt->rt_cachecnt++; - rw_exit_write(&nhrt->rt_lock); + mtx_leave(&nhrt->rt_mtx); /* commit */ rt_putgwroute(rt, nhrt); @@ -602,20 +602,20 @@ rt_putgwroute(struct rtentry *rt, struct if (!ISSET(rt->rt_flags, RTF_GATEWAY)) return; - rw_enter_write(&rt->rt_lock); + mtx_enter(&rt->rt_mtx); onhrt = SMR_PTR_GET_LOCKED(&rt->rt_gwroute); SMR_PTR_SET_LOCKED(&rt->rt_gwroute, nhrt); - rw_exit_write(&rt->rt_lock); + mtx_leave(&rt->rt_mtx); if (onhrt != NULL) { smr_barrier(); - rw_enter_write(&onhrt->rt_lock); + mtx_enter(&onhrt->rt_mtx); KASSERT(onhrt->rt_cachecnt > 0); KASSERT(ISSET(onhrt->rt_flags, RTF_CACHED)); --onhrt->rt_cachecnt; if (onhrt->rt_cachecnt == 0) CLR(onhrt->rt_flags, RTF_CACHED); - rw_exit_write(&onhrt->rt_lock); + mtx_leave(&onhrt->rt_mtx); rtfree(onhrt); } } @@ -1013,7 +1013,7 @@ rtrequest(int req, struct rt_addrinfo *i return (ENOBUFS); } - rw_init(&rt->rt_lock, "rtentry"); + mtx_init_flags(&rt->rt_mtx, IPL_SOFTNET, "rtentry", 0); refcnt_init_trace(&rt->rt_refcnt, DT_REFCNT_IDX_RTENTRY); rt->rt_flags = info->rti_flags | RTF_UP; rt->rt_priority = prio; /* init routing priority */ Index: sys/net/route.h =================================================================== RCS file: /mount/openbsd/cvs/src/sys/net/route.h,v diff -u -p -u -p -r1.212 route.h --- sys/net/route.h 13 Feb 2025 21:01:34 -0000 1.212 +++ sys/net/route.h 13 Feb 2025 22:22:34 -0000 @@ -41,9 +41,9 @@ * N net lock * X exclusive net lock, or shared net lock + kernel lock * R art (rtable) lock - * r per route entry lock + * r per rtentry lock rt_mtx * L arp/nd6/etc lock for updates, net lock for reads - * T rttimer_mtx route timer lists + T rttimer_mtx route timer lists */ /* @@ -115,7 +115,7 @@ struct rttimer; */ struct rtentry { - struct rwlock rt_lock; + struct mutex rt_mtx; struct sockaddr *rt_dest; /* [I] destination */ SRPL_ENTRY(rtentry) rt_next; /* [R] next mpath entry to our dst */ struct sockaddr *rt_gateway; /* [X] gateway address */ @@ -131,7 +131,7 @@ struct rtentry { struct rtentry *rt_parent; /* [N] if cloned, parent rtentry */ LIST_HEAD(, rttimer) rt_timer; /* queue of timeouts for misc funcs */ struct rt_kmetrics rt_rmx; /* metrics used by rx'ing protocols */ - unsigned int rt_ifidx; /* [N] interface to use */ + unsigned int rt_ifidx; /* [I] interface to use */ unsigned int rt_flags; /* [X] up/down?, host/net */ struct refcnt rt_refcnt; /* # held references */ int rt_plen; /* [I] prefix length */ Index: sys/net/rtsock.c =================================================================== RCS file: /mount/openbsd/cvs/src/sys/net/rtsock.c,v diff -u -p -u -p -r1.380 rtsock.c --- sys/net/rtsock.c 13 Feb 2025 21:01:34 -0000 1.380 +++ sys/net/rtsock.c 13 Feb 2025 22:22:34 -0000 @@ -1343,11 +1343,11 @@ route_cleargateway(struct rtentry *rt, v { struct rtentry *nhrt = arg; - rw_enter_read(&rt->rt_lock); + mtx_enter(&rt->rt_mtx); if (ISSET(rt->rt_flags, RTF_GATEWAY) && rt->rt_gwroute == nhrt && !ISSET(rt->rt_locks, RTV_MTU)) atomic_store_int(&rt->rt_mtu, 0); - rw_exit_read(&rt->rt_lock); + mtx_leave(&rt->rt_mtx); return (0); }