mirror of
https://github.com/freebsd/freebsd-src
synced 2024-10-16 21:34:10 +00:00
inpcb: don't gratuitously defer frees
Don't defer frees in sysctl handlers. It isn't necessary and it just confuses things. revert: r333911, r334104, and r334125 Requested by: jtl
This commit is contained in:
parent
3f9b72b641
commit
99208b820f
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=335856
|
@ -552,7 +552,6 @@ div_detach(struct socket *so)
|
|||
KASSERT(inp != NULL, ("div_detach: inp == NULL"));
|
||||
INP_INFO_WLOCK(&V_divcbinfo);
|
||||
INP_WLOCK(inp);
|
||||
/* XXX defer destruction to epoch_call */
|
||||
in_pcbdetach(inp);
|
||||
in_pcbfree(inp);
|
||||
INP_INFO_WUNLOCK(&V_divcbinfo);
|
||||
|
@ -632,7 +631,6 @@ static int
|
|||
div_pcblist(SYSCTL_HANDLER_ARGS)
|
||||
{
|
||||
int error, i, n;
|
||||
struct in_pcblist *il;
|
||||
struct inpcb *inp, **inp_list;
|
||||
inp_gen_t gencnt;
|
||||
struct xinpgen xig;
|
||||
|
@ -672,8 +670,9 @@ div_pcblist(SYSCTL_HANDLER_ARGS)
|
|||
if (error)
|
||||
return error;
|
||||
|
||||
il = malloc(sizeof(struct in_pcblist) + n * sizeof(struct inpcb *), M_TEMP, M_WAITOK|M_ZERO_INVARIANTS);
|
||||
inp_list = il->il_inp_list;
|
||||
inp_list = malloc(n * sizeof *inp_list, M_TEMP, M_WAITOK);
|
||||
if (inp_list == NULL)
|
||||
return ENOMEM;
|
||||
|
||||
INP_INFO_RLOCK(&V_divcbinfo);
|
||||
for (inp = CK_LIST_FIRST(V_divcbinfo.ipi_listhead), i = 0; inp && i < n;
|
||||
|
@ -702,9 +701,14 @@ div_pcblist(SYSCTL_HANDLER_ARGS)
|
|||
} else
|
||||
INP_RUNLOCK(inp);
|
||||
}
|
||||
il->il_count = n;
|
||||
il->il_pcbinfo = &V_divcbinfo;
|
||||
epoch_call(net_epoch_preempt, &il->il_epoch_ctx, in_pcblist_rele_rlocked);
|
||||
INP_INFO_WLOCK(&V_divcbinfo);
|
||||
for (i = 0; i < n; i++) {
|
||||
inp = inp_list[i];
|
||||
INP_RLOCK(inp);
|
||||
if (!in_pcbrele_rlocked(inp))
|
||||
INP_RUNLOCK(inp);
|
||||
}
|
||||
INP_INFO_WUNLOCK(&V_divcbinfo);
|
||||
|
||||
if (!error) {
|
||||
/*
|
||||
|
@ -721,6 +725,7 @@ div_pcblist(SYSCTL_HANDLER_ARGS)
|
|||
INP_INFO_RUNLOCK(&V_divcbinfo);
|
||||
error = SYSCTL_OUT(req, &xig, sizeof xig);
|
||||
}
|
||||
free(inp_list, M_TEMP);
|
||||
return error;
|
||||
}
|
||||
|
||||
|
@ -800,7 +805,6 @@ div_modevent(module_t mod, int type, void *unused)
|
|||
break;
|
||||
}
|
||||
ip_divert_ptr = NULL;
|
||||
/* XXX defer to epoch_call ? */
|
||||
err = pf_proto_unregister(PF_INET, IPPROTO_DIVERT, SOCK_RAW);
|
||||
INP_INFO_WUNLOCK(&V_divcbinfo);
|
||||
#ifndef VIMAGE
|
||||
|
|
|
@ -863,7 +863,6 @@ rip_detach(struct socket *so)
|
|||
ip_rsvp_force_done(so);
|
||||
if (so == V_ip_rsvpd)
|
||||
ip_rsvp_done();
|
||||
/* XXX defer to epoch_call */
|
||||
in_pcbdetach(inp);
|
||||
in_pcbfree(inp);
|
||||
INP_INFO_WUNLOCK(&V_ripcbinfo);
|
||||
|
@ -1033,7 +1032,6 @@ static int
|
|||
rip_pcblist(SYSCTL_HANDLER_ARGS)
|
||||
{
|
||||
int error, i, n;
|
||||
struct in_pcblist *il;
|
||||
struct inpcb *inp, **inp_list;
|
||||
inp_gen_t gencnt;
|
||||
struct xinpgen xig;
|
||||
|
@ -1068,8 +1066,9 @@ rip_pcblist(SYSCTL_HANDLER_ARGS)
|
|||
if (error)
|
||||
return (error);
|
||||
|
||||
il = malloc(sizeof(struct in_pcblist) + n * sizeof(struct inpcb *), M_TEMP, M_WAITOK|M_ZERO_INVARIANTS);
|
||||
inp_list = il->il_inp_list;
|
||||
inp_list = malloc(n * sizeof *inp_list, M_TEMP, M_WAITOK);
|
||||
if (inp_list == NULL)
|
||||
return (ENOMEM);
|
||||
|
||||
INP_INFO_RLOCK(&V_ripcbinfo);
|
||||
for (inp = CK_LIST_FIRST(V_ripcbinfo.ipi_listhead), i = 0; inp && i < n;
|
||||
|
@ -1098,9 +1097,14 @@ rip_pcblist(SYSCTL_HANDLER_ARGS)
|
|||
} else
|
||||
INP_RUNLOCK(inp);
|
||||
}
|
||||
il->il_count = n;
|
||||
il->il_pcbinfo = &V_ripcbinfo;
|
||||
epoch_call(net_epoch_preempt, &il->il_epoch_ctx, in_pcblist_rele_rlocked);
|
||||
INP_INFO_WLOCK(&V_ripcbinfo);
|
||||
for (i = 0; i < n; i++) {
|
||||
inp = inp_list[i];
|
||||
INP_RLOCK(inp);
|
||||
if (!in_pcbrele_rlocked(inp))
|
||||
INP_RUNLOCK(inp);
|
||||
}
|
||||
INP_INFO_WUNLOCK(&V_ripcbinfo);
|
||||
|
||||
if (!error) {
|
||||
/*
|
||||
|
@ -1116,6 +1120,7 @@ rip_pcblist(SYSCTL_HANDLER_ARGS)
|
|||
INP_INFO_RUNLOCK(&V_ripcbinfo);
|
||||
error = SYSCTL_OUT(req, &xig, sizeof xig);
|
||||
}
|
||||
free(inp_list, M_TEMP);
|
||||
return (error);
|
||||
}
|
||||
|
||||
|
|
|
@ -943,7 +943,6 @@ deregister_tcp_functions(struct tcp_function_block *blk, bool quiesce,
|
|||
rw_wunlock(&tcp_function_lock);
|
||||
|
||||
VNET_LIST_RLOCK();
|
||||
/* XXX handle */
|
||||
VNET_FOREACH(vnet_iter) {
|
||||
CURVNET_SET(vnet_iter);
|
||||
INP_INFO_WLOCK(&V_tcbinfo);
|
||||
|
@ -1733,7 +1732,6 @@ tcp_ccalgounload(struct cc_algo *unload_algo)
|
|||
tmpalgo = CC_ALGO(tp);
|
||||
/* NewReno does not require any init. */
|
||||
CC_ALGO(tp) = &newreno_cc_algo;
|
||||
/* XXX defer to epoch_call */
|
||||
if (tmpalgo->cb_destroy != NULL)
|
||||
tmpalgo->cb_destroy(tp->ccv);
|
||||
}
|
||||
|
@ -2106,7 +2104,6 @@ static int
|
|||
tcp_pcblist(SYSCTL_HANDLER_ARGS)
|
||||
{
|
||||
int error, i, m, n, pcb_count;
|
||||
struct in_pcblist *il;
|
||||
struct inpcb *inp, **inp_list;
|
||||
inp_gen_t gencnt;
|
||||
struct xinpgen xig;
|
||||
|
@ -2153,8 +2150,7 @@ tcp_pcblist(SYSCTL_HANDLER_ARGS)
|
|||
if (error)
|
||||
return (error);
|
||||
|
||||
il = malloc(sizeof(struct in_pcblist) + n * sizeof(struct inpcb *), M_TEMP, M_WAITOK|M_ZERO_INVARIANTS);
|
||||
inp_list = il->il_inp_list;
|
||||
inp_list = malloc(n * sizeof *inp_list, M_TEMP, M_WAITOK);
|
||||
|
||||
INP_INFO_WLOCK(&V_tcbinfo);
|
||||
for (inp = CK_LIST_FIRST(V_tcbinfo.ipi_listhead), i = 0;
|
||||
|
@ -2197,10 +2193,14 @@ tcp_pcblist(SYSCTL_HANDLER_ARGS)
|
|||
} else
|
||||
INP_RUNLOCK(inp);
|
||||
}
|
||||
|
||||
il->il_count = n;
|
||||
il->il_pcbinfo = &V_tcbinfo;
|
||||
epoch_call(net_epoch_preempt, &il->il_epoch_ctx, in_pcblist_rele_rlocked);
|
||||
INP_INFO_RLOCK(&V_tcbinfo);
|
||||
for (i = 0; i < n; i++) {
|
||||
inp = inp_list[i];
|
||||
INP_RLOCK(inp);
|
||||
if (!in_pcbrele_rlocked(inp))
|
||||
INP_RUNLOCK(inp);
|
||||
}
|
||||
INP_INFO_RUNLOCK(&V_tcbinfo);
|
||||
|
||||
if (!error) {
|
||||
/*
|
||||
|
@ -2217,6 +2217,7 @@ tcp_pcblist(SYSCTL_HANDLER_ARGS)
|
|||
INP_LIST_RUNLOCK(&V_tcbinfo);
|
||||
error = SYSCTL_OUT(req, &xig, sizeof xig);
|
||||
}
|
||||
free(inp_list, M_TEMP);
|
||||
return (error);
|
||||
}
|
||||
|
||||
|
|
|
@ -837,7 +837,6 @@ udp_pcblist(SYSCTL_HANDLER_ARGS)
|
|||
{
|
||||
int error, i, n;
|
||||
struct inpcb *inp, **inp_list;
|
||||
struct in_pcblist *il;
|
||||
inp_gen_t gencnt;
|
||||
struct xinpgen xig;
|
||||
|
||||
|
@ -875,8 +874,10 @@ udp_pcblist(SYSCTL_HANDLER_ARGS)
|
|||
error = SYSCTL_OUT(req, &xig, sizeof xig);
|
||||
if (error)
|
||||
return (error);
|
||||
il = malloc(sizeof(struct in_pcblist) + n * sizeof(struct inpcb *), M_TEMP, M_WAITOK|M_ZERO_INVARIANTS);
|
||||
inp_list = il->il_inp_list;
|
||||
|
||||
inp_list = malloc(n * sizeof *inp_list, M_TEMP, M_WAITOK);
|
||||
if (inp_list == NULL)
|
||||
return (ENOMEM);
|
||||
|
||||
INP_INFO_RLOCK(&V_udbinfo);
|
||||
for (inp = CK_LIST_FIRST(V_udbinfo.ipi_listhead), i = 0; inp && i < n;
|
||||
|
@ -905,9 +906,14 @@ udp_pcblist(SYSCTL_HANDLER_ARGS)
|
|||
} else
|
||||
INP_RUNLOCK(inp);
|
||||
}
|
||||
il->il_count = n;
|
||||
il->il_pcbinfo = &V_udbinfo;
|
||||
epoch_call(net_epoch_preempt, &il->il_epoch_ctx, in_pcblist_rele_rlocked);
|
||||
INP_INFO_WLOCK(&V_udbinfo);
|
||||
for (i = 0; i < n; i++) {
|
||||
inp = inp_list[i];
|
||||
INP_RLOCK(inp);
|
||||
if (!in_pcbrele_rlocked(inp))
|
||||
INP_RUNLOCK(inp);
|
||||
}
|
||||
INP_INFO_WUNLOCK(&V_udbinfo);
|
||||
|
||||
if (!error) {
|
||||
/*
|
||||
|
@ -923,6 +929,7 @@ udp_pcblist(SYSCTL_HANDLER_ARGS)
|
|||
INP_INFO_RUNLOCK(&V_udbinfo);
|
||||
error = SYSCTL_OUT(req, &xig, sizeof xig);
|
||||
}
|
||||
free(inp_list, M_TEMP);
|
||||
return (error);
|
||||
}
|
||||
|
||||
|
@ -1714,7 +1721,6 @@ udp_detach(struct socket *so)
|
|||
INP_WLOCK(inp);
|
||||
up = intoudpcb(inp);
|
||||
KASSERT(up != NULL, ("%s: up == NULL", __func__));
|
||||
/* XXX defer to epoch_call */
|
||||
inp->inp_ppcb = NULL;
|
||||
in_pcbdetach(inp);
|
||||
in_pcbfree(inp);
|
||||
|
|
|
@ -63,13 +63,6 @@
|
|||
|
||||
#define M_MAGIC 877983977 /* time when first defined :-) */
|
||||
|
||||
#ifdef INVARIANTS
|
||||
#define M_ZERO_INVARIANTS M_ZERO
|
||||
#else
|
||||
#define M_ZERO_INVARIANTS 0
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* Two malloc type structures are present: malloc_type, which is used by a
|
||||
* type owner to declare the type, and malloc_type_internal, which holds
|
||||
|
|
Loading…
Reference in a new issue