svn commit: r361415 - in head/sys/net: . route
Alexander V. Chernikov
melifaro at FreeBSD.org
Sat May 23 12:15:48 UTC 2020
Author: melifaro
Date: Sat May 23 12:15:47 2020
New Revision: 361415
URL: https://svnweb.freebsd.org/changeset/base/361415
Log:
Remove refcounting from rtentry.
After making rtentry reclamation backed by epoch(9) in r361409, there is
no reason in keeping reference counting code.
Differential Revision: https://reviews.freebsd.org/D24867
Modified:
head/sys/net/route.c
head/sys/net/route/route_var.h
Modified: head/sys/net/route.c
==============================================================================
--- head/sys/net/route.c Sat May 23 12:00:46 2020 (r361414)
+++ head/sys/net/route.c Sat May 23 12:15:47 2020 (r361415)
@@ -439,39 +439,8 @@ rtfree(struct rtentry *rt)
RT_LOCK_ASSERT(rt);
- /*
- * The callers should use RTFREE_LOCKED() or RTFREE(), so
- * we should come here exactly with the last reference.
- */
- RT_REMREF(rt);
- if (rt->rt_refcnt > 0) {
- log(LOG_DEBUG, "%s: %p has %d refs\n", __func__, rt, rt->rt_refcnt);
- goto done;
- }
-
- /*
- * If we are no longer "up" (and ref == 0)
- * then we can free the resources associated
- * with the route.
- */
- if ((rt->rt_flags & RTF_UP) == 0) {
- if (rt->rt_nodes->rn_flags & (RNF_ACTIVE | RNF_ROOT))
- panic("rtfree 2");
-#ifdef DIAGNOSTIC
- if (rt->rt_refcnt < 0) {
- printf("rtfree: %p not freed (neg refs)\n", rt);
- goto done;
- }
-#endif
- epoch_call(net_epoch_preempt, destroy_rtentry_epoch,
- &rt->rt_epoch_ctx);
-
- /*
- * FALLTHROUGH to RT_UNLOCK() so the reporting functions
- * have consistent behaviour of operating on unlocked entry.
- */
- }
-done:
+ epoch_call(net_epoch_preempt, destroy_rtentry_epoch,
+ &rt->rt_epoch_ctx);
RT_UNLOCK(rt);
}
@@ -958,7 +927,7 @@ rib_walk_del(u_int fibnum, int family, rt_filter_f_t *
if (report)
rt_routemsg(RTM_DELETE, rt, rt->rt_nhop->nh_ifp, 0,
fibnum);
- RTFREE_LOCKED(rt);
+ rtfree(rt);
}
}
@@ -1114,7 +1083,6 @@ rt_unlinkrte(struct rib_head *rnh, struct rt_addrinfo
rt = RNTORT(rn);
RT_LOCK(rt);
- RT_ADDREF(rt);
rt->rt_flags &= ~RTF_UP;
*perror = 0;
@@ -1569,8 +1537,10 @@ add_route(struct rib_head *rnh, struct rt_addrinfo *in
}
RIB_WUNLOCK(rnh);
- if (rt_old != NULL)
- RT_UNLOCK(rt_old);
+ if (rt_old != NULL) {
+ rt_notifydelete(rt_old, info);
+ rtfree(rt_old);
+ }
/*
* If it still failed to go into the tree,
@@ -1582,11 +1552,6 @@ add_route(struct rib_head *rnh, struct rt_addrinfo *in
return (EEXIST);
}
- if (rt_old != NULL) {
- rt_notifydelete(rt_old, info);
- RTFREE(rt_old);
- }
-
/*
* If this protocol has something to add to this then
* allow it to do that as well.
@@ -1639,7 +1604,7 @@ del_route(struct rib_head *rnh, struct rt_addrinfo *in
if (ret_nrt)
*ret_nrt = rt;
- RTFREE_LOCKED(rt);
+ rtfree(rt);
return (0);
}
Modified: head/sys/net/route/route_var.h
==============================================================================
--- head/sys/net/route/route_var.h Sat May 23 12:00:46 2020 (r361414)
+++ head/sys/net/route/route_var.h Sat May 23 12:15:47 2020 (r361415)
@@ -143,7 +143,6 @@ struct rtentry {
};
int rt_flags; /* up/down?, host/net */
- int rt_refcnt; /* # held references */
u_long rt_weight; /* absolute weight */
u_long rt_expire; /* lifetime for route, e.g. redirect */
#define rt_endzero rt_mtx
@@ -161,36 +160,6 @@ struct rtentry {
#define RT_UNLOCK_COND(_rt) do { \
if (mtx_owned(&(_rt)->rt_mtx)) \
mtx_unlock(&(_rt)->rt_mtx); \
-} while (0)
-
-#define RT_ADDREF(_rt) do { \
- RT_LOCK_ASSERT(_rt); \
- KASSERT((_rt)->rt_refcnt >= 0, \
- ("negative refcnt %d", (_rt)->rt_refcnt)); \
- (_rt)->rt_refcnt++; \
-} while (0)
-
-#define RT_REMREF(_rt) do { \
- RT_LOCK_ASSERT(_rt); \
- KASSERT((_rt)->rt_refcnt > 0, \
- ("bogus refcnt %d", (_rt)->rt_refcnt)); \
- (_rt)->rt_refcnt--; \
-} while (0)
-
-#define RTFREE_LOCKED(_rt) do { \
- if ((_rt)->rt_refcnt <= 1) \
- rtfree(_rt); \
- else { \
- RT_REMREF(_rt); \
- RT_UNLOCK(_rt); \
- } \
- /* guard against invalid refs */ \
- _rt = 0; \
-} while (0)
-
-#define RTFREE(_rt) do { \
- RT_LOCK(_rt); \
- RTFREE_LOCKED(_rt); \
} while (0)
/*
More information about the svn-src-head
mailing list