Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F110013679
D26162.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
8 KB
Referenced Files
None
Subscribers
None
D26162.diff
View Options
Index: head/sys/kern/subr_witness.c
===================================================================
--- head/sys/kern/subr_witness.c
+++ head/sys/kern/subr_witness.c
@@ -531,7 +531,6 @@
*/
{ "so_rcv", &lock_class_mtx_sleep },
{ "radix node head", &lock_class_rm },
- { "rtentry", &lock_class_mtx_sleep },
{ "ifaddr", &lock_class_mtx_sleep },
{ NULL, NULL },
/*
Index: head/sys/net/route.c
===================================================================
--- head/sys/net/route.c
+++ head/sys/net/route.c
@@ -214,18 +214,19 @@
/* Verify the allowed flag mask. */
KASSERT(((flags & ~(RTF_GATEWAY)) == 0),
("invalid redirect flags: %x", flags));
+ flags |= RTF_HOST | RTF_DYNAMIC;
/* Get the best ifa for the given interface and gateway. */
if ((ifa = ifaof_ifpforaddr(gateway, ifp)) == NULL)
return (ENETUNREACH);
ifa_ref(ifa);
-
+
bzero(&info, sizeof(info));
info.rti_info[RTAX_DST] = dst;
info.rti_info[RTAX_GATEWAY] = gateway;
info.rti_ifa = ifa;
info.rti_ifp = ifp;
- info.rti_flags = flags | RTF_HOST | RTF_DYNAMIC;
+ info.rti_flags = flags;
/* Setup route metrics to define expire time. */
bzero(&rti_rmx, sizeof(rti_rmx));
@@ -242,10 +243,6 @@
return (error);
}
- RT_LOCK(rc.rc_rt);
- flags = rc.rc_rt->rte_flags;
- RT_UNLOCK(rc.rc_rt);
-
RTSTAT_INC(rts_dynamic);
/* Send notification of a route addition to userland. */
@@ -253,7 +250,7 @@
info.rti_info[RTAX_DST] = dst;
info.rti_info[RTAX_GATEWAY] = gateway;
info.rti_info[RTAX_AUTHOR] = author;
- rt_missmsg_fib(RTM_REDIRECT, &info, flags, error, fibnum);
+ rt_missmsg_fib(RTM_REDIRECT, &info, flags | RTF_UP, error, fibnum);
return (0);
}
@@ -811,9 +808,7 @@
*/
if (rn) {
rto = RNTORT(rn);
- RT_LOCK(rto);
rto->rte_flags |= RTF_UP;
- RT_UNLOCK(rto);
} else if (rt->rte_flags & RTF_GATEWAY) {
/*
* For gateway routes, we need to
Index: head/sys/net/route/route_ctl.c
===================================================================
--- head/sys/net/route/route_ctl.c
+++ head/sys/net/route/route_ctl.c
@@ -149,9 +149,6 @@
KASSERT(rt != NULL, ("%s: NULL rt", __func__));
- RT_LOCK_ASSERT(rt);
-
- RT_UNLOCK(rt);
epoch_call(net_epoch_preempt, destroy_rtentry_epoch,
&rt->rt_epoch_ctx);
}
@@ -250,7 +247,6 @@
nhop_free(nh);
return (ENOBUFS);
}
- RT_LOCK_INIT(rt);
rt->rte_flags = RTF_UP | flags;
rt->rt_nhop = nh;
@@ -283,7 +279,6 @@
rt_old = NULL;
RIB_WLOCK(rnh);
- RT_LOCK(rt);
#ifdef RADIX_MPATH
/* do not permit exactly the same dst/mask/gw pair */
if (rt_mpath_capable(rnh) &&
@@ -291,7 +286,6 @@
RIB_WUNLOCK(rnh);
nhop_free(nh);
- RT_LOCK_DESTROY(rt);
uma_zfree(V_rtzone, rt);
return (EEXIST);
}
@@ -307,8 +301,9 @@
/* Finalize notification */
rnh->rnh_gen++;
- rc->rc_rt = RNTORT(rn);
+ rc->rc_rt = rt;
rc->rc_nh_new = nh;
+ rc->rc_nh_weight = rt->rt_weight;
rib_notify(rnh, RIB_NOTIFY_IMMEDIATE, rc);
} else if ((info->rti_flags & RTF_PINNED) != 0) {
@@ -333,14 +328,15 @@
if (rn != NULL) {
rc->rc_cmd = RTM_CHANGE;
- rc->rc_rt = RNTORT(rn);
+ rc->rc_rt = rt;
rc->rc_nh_old = rt_old->rt_nhop;
rc->rc_nh_new = nh;
+ rc->rc_nh_weight = rt->rt_weight;
} else {
rc->rc_cmd = RTM_DELETE;
- rc->rc_rt = RNTORT(rn);
+ rc->rc_rt = rt_old;
rc->rc_nh_old = rt_old->rt_nhop;
- rc->rc_nh_new = nh;
+ rc->rc_nh_weight = rt_old->rt_weight;
}
rib_notify(rnh, RIB_NOTIFY_IMMEDIATE, rc);
}
@@ -359,13 +355,10 @@
*/
if (rn == NULL) {
nhop_free(nh);
- RT_LOCK_DESTROY(rt);
uma_zfree(V_rtzone, rt);
return (EEXIST);
}
- RT_UNLOCK(rt);
-
return (0);
}
@@ -461,7 +454,6 @@
panic ("rtrequest delete");
rt = RNTORT(rn);
- RT_LOCK(rt);
rt->rte_flags &= ~RTF_UP;
*perror = 0;
@@ -620,21 +612,19 @@
}
/* Proceed with the update */
- RT_LOCK(rt);
/* Provide notification to the protocols.*/
rt->rt_nhop = nh;
rt_setmetrics(info, rt);
/* Finalize notification */
+ rnh->rnh_gen++;
+
rc->rc_rt = rt;
rc->rc_nh_old = nh_orig;
rc->rc_nh_new = rt->rt_nhop;
+ rc->rc_nh_weight = rt->rt_weight;
- RT_UNLOCK(rt);
-
- /* Update generation id to reflect rtable change */
- rnh->rnh_gen++;
rib_notify(rnh, RIB_NOTIFY_IMMEDIATE, rc);
RIB_WUNLOCK(rnh);
Index: head/sys/net/route/route_var.h
===================================================================
--- head/sys/net/route/route_var.h
+++ head/sys/net/route/route_var.h
@@ -168,22 +168,9 @@
int rte_flags; /* up/down?, host/net */
u_long rt_weight; /* absolute weight */
u_long rt_expire; /* lifetime for route, e.g. redirect */
-#define rt_endzero rt_mtx
- struct mtx rt_mtx; /* mutex for routing entry */
struct rtentry *rt_chain; /* pointer to next rtentry to delete */
struct epoch_context rt_epoch_ctx; /* net epoch tracker */
};
-
-#define RT_LOCK_INIT(_rt) \
- mtx_init(&(_rt)->rt_mtx, "rtentry", NULL, MTX_DEF | MTX_DUPOK | MTX_NEW)
-#define RT_LOCK(_rt) mtx_lock(&(_rt)->rt_mtx)
-#define RT_UNLOCK(_rt) mtx_unlock(&(_rt)->rt_mtx)
-#define RT_LOCK_DESTROY(_rt) mtx_destroy(&(_rt)->rt_mtx)
-#define RT_LOCK_ASSERT(_rt) mtx_assert(&(_rt)->rt_mtx, MA_OWNED)
-#define RT_UNLOCK_COND(_rt) do { \
- if (mtx_owned(&(_rt)->rt_mtx)) \
- mtx_unlock(&(_rt)->rt_mtx); \
-} while (0)
/*
* With the split between the routing entry and the nexthop,
Index: head/sys/net/rtsock.c
===================================================================
--- head/sys/net/rtsock.c
+++ head/sys/net/rtsock.c
@@ -184,9 +184,9 @@
static void rt_dispatch(struct mbuf *, sa_family_t);
static int handle_rtm_get(struct rt_addrinfo *info, u_int fibnum,
struct rt_msghdr *rtm, struct rib_cmd_info *rc);
-static int update_rtm_from_rte(struct rt_addrinfo *info,
+static int update_rtm_from_rc(struct rt_addrinfo *info,
struct rt_msghdr **prtm, int alloc_len,
- struct rtentry *rt, struct nhop_object *nh);
+ struct rib_cmd_info *rc, struct nhop_object *nh);
static void send_rtm_reply(struct socket *so, struct rt_msghdr *rtm,
struct mbuf *m, sa_family_t saf, u_int fibnum,
int rtm_errno);
@@ -747,7 +747,7 @@
}
/*
- * Update sockaddrs, flags, etc in @prtm based on @rt data.
+ * Update sockaddrs, flags, etc in @prtm based on @rc data.
* rtm can be reallocated.
*
* Returns 0 on success, along with pointer to (potentially reallocated)
@@ -755,8 +755,8 @@
*
*/
static int
-update_rtm_from_rte(struct rt_addrinfo *info, struct rt_msghdr **prtm,
- int alloc_len, struct rtentry *rt, struct nhop_object *nh)
+update_rtm_from_rc(struct rt_addrinfo *info, struct rt_msghdr **prtm,
+ int alloc_len, struct rib_cmd_info *rc, struct nhop_object *nh)
{
struct sockaddr_storage netmask_ss;
struct walkarg w;
@@ -767,10 +767,10 @@
rtm = *prtm;
- info->rti_info[RTAX_DST] = rt_key(rt);
+ info->rti_info[RTAX_DST] = rt_key(rc->rc_rt);
info->rti_info[RTAX_GATEWAY] = &nh->gw_sa;
- info->rti_info[RTAX_NETMASK] = rtsock_fix_netmask(rt_key(rt),
- rt_mask(rt), &netmask_ss);
+ info->rti_info[RTAX_NETMASK] = rtsock_fix_netmask(rt_key(rc->rc_rt),
+ rt_mask(rc->rc_rt), &netmask_ss);
info->rti_info[RTAX_GENMASK] = 0;
ifp = nh->nh_ifp;
if (rtm->rtm_addrs & (RTA_IFP | RTA_IFA)) {
@@ -815,12 +815,12 @@
w.w_tmemsize = alloc_len;
rtsock_msg_buffer(rtm->rtm_type, info, &w, &len);
- if (rt->rte_flags & RTF_GWFLAG_COMPAT)
+ rtm->rtm_flags = rc->rc_rt->rte_flags | nhop_get_rtflags(nh);
+ if (rtm->rtm_flags & RTF_GWFLAG_COMPAT)
rtm->rtm_flags = RTF_GATEWAY |
- (rt->rte_flags & ~RTF_GWFLAG_COMPAT);
- else
- rtm->rtm_flags = rt->rte_flags;
- rt_getmetrics(rt, nh, &rtm->rtm_rmx);
+ (rtm->rtm_flags & ~RTF_GWFLAG_COMPAT);
+ rt_getmetrics(rc->rc_rt, nh, &rtm->rtm_rmx);
+ rtm->rtm_rmx.rmx_weight = rc->rc_nh_weight;
rtm->rtm_addrs = info->rti_addrs;
if (orig_rtm != NULL)
@@ -918,8 +918,8 @@
#ifdef INET6
rti_need_deembed = 1;
#endif
- rtm->rtm_index = rc.rc_nh_new->nh_ifp->if_index;
nh = rc.rc_nh_new;
+ rtm->rtm_index = nh->nh_ifp->if_index;
}
break;
@@ -946,7 +946,7 @@
senderr(ESRCH);
}
- error = update_rtm_from_rte(&info, &rtm, alloc_len, rc.rc_rt, nh);
+ error = update_rtm_from_rc(&info, &rtm, alloc_len, &rc, nh);
/*
* Note that some sockaddr pointers may have changed to
* point to memory outsize @rtm. Some may be pointing
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Thu, Feb 13, 12:01 PM (20 h, 58 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
16627371
Default Alt Text
D26162.diff (8 KB)
Attached To
Mode
D26162: Remove RT_LOCK from rte.
Attached
Detach File
Event Timeline
Log In to Comment