Reduce in_pcbinfo_init() by two params. No users supply any flags to this
function (they used to say UMA_ZONE_NOFREE), so flag parameter goes away. The zone_fini parameter also goes away. Previously no protocols (except divert) supplied zone_fini function, so inpcb locks were leaked with slabs. This was okay while zones were allocated with UMA_ZONE_NOFREE flag, but now this is a leak. Fix that by suppling inpcb_fini() function as fini method for all inpcb zones.
This commit is contained in:
parent
c48eb1f427
commit
cc487c1697
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=318321
@ -211,6 +211,18 @@ SYSCTL_INT(_net_inet_ip_portrange, OID_AUTO, randomtime,
|
|||||||
* functions often modify hash chains or addresses in pcbs.
|
* functions often modify hash chains or addresses in pcbs.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Different protocols initialize their inpcbs differently - giving
|
||||||
|
* different name to the lock. But they all are disposed the same.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
inpcb_fini(void *mem, int size)
|
||||||
|
{
|
||||||
|
struct inpcb *inp = mem;
|
||||||
|
|
||||||
|
INP_LOCK_DESTROY(inp);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initialize an inpcbinfo -- we should be able to reduce the number of
|
* Initialize an inpcbinfo -- we should be able to reduce the number of
|
||||||
* arguments in time.
|
* arguments in time.
|
||||||
@ -218,8 +230,7 @@ SYSCTL_INT(_net_inet_ip_portrange, OID_AUTO, randomtime,
|
|||||||
void
|
void
|
||||||
in_pcbinfo_init(struct inpcbinfo *pcbinfo, const char *name,
|
in_pcbinfo_init(struct inpcbinfo *pcbinfo, const char *name,
|
||||||
struct inpcbhead *listhead, int hash_nelements, int porthash_nelements,
|
struct inpcbhead *listhead, int hash_nelements, int porthash_nelements,
|
||||||
char *inpcbzone_name, uma_init inpcbzone_init, uma_fini inpcbzone_fini,
|
char *inpcbzone_name, uma_init inpcbzone_init, u_int hashfields)
|
||||||
uint32_t inpcbzone_flags, u_int hashfields)
|
|
||||||
{
|
{
|
||||||
|
|
||||||
INP_INFO_LOCK_INIT(pcbinfo, name);
|
INP_INFO_LOCK_INIT(pcbinfo, name);
|
||||||
@ -239,8 +250,7 @@ in_pcbinfo_init(struct inpcbinfo *pcbinfo, const char *name,
|
|||||||
in_pcbgroup_init(pcbinfo, hashfields, hash_nelements);
|
in_pcbgroup_init(pcbinfo, hashfields, hash_nelements);
|
||||||
#endif
|
#endif
|
||||||
pcbinfo->ipi_zone = uma_zcreate(inpcbzone_name, sizeof(struct inpcb),
|
pcbinfo->ipi_zone = uma_zcreate(inpcbzone_name, sizeof(struct inpcb),
|
||||||
NULL, NULL, inpcbzone_init, inpcbzone_fini, UMA_ALIGN_PTR,
|
NULL, NULL, inpcbzone_init, inpcb_fini, UMA_ALIGN_PTR, 0);
|
||||||
inpcbzone_flags);
|
|
||||||
uma_zone_set_max(pcbinfo->ipi_zone, maxsockets);
|
uma_zone_set_max(pcbinfo->ipi_zone, maxsockets);
|
||||||
uma_zone_set_warning(pcbinfo->ipi_zone,
|
uma_zone_set_warning(pcbinfo->ipi_zone,
|
||||||
"kern.ipc.maxsockets limit reached");
|
"kern.ipc.maxsockets limit reached");
|
||||||
|
@ -690,7 +690,7 @@ VNET_DECLARE(int, ipport_tcpallocs);
|
|||||||
|
|
||||||
void in_pcbinfo_destroy(struct inpcbinfo *);
|
void in_pcbinfo_destroy(struct inpcbinfo *);
|
||||||
void in_pcbinfo_init(struct inpcbinfo *, const char *, struct inpcbhead *,
|
void in_pcbinfo_init(struct inpcbinfo *, const char *, struct inpcbhead *,
|
||||||
int, int, char *, uma_init, uma_fini, uint32_t, u_int);
|
int, int, char *, uma_init, u_int);
|
||||||
|
|
||||||
int in_pcbbind_check_bindmulti(const struct inpcb *ni,
|
int in_pcbbind_check_bindmulti(const struct inpcb *ni,
|
||||||
const struct inpcb *oi);
|
const struct inpcb *oi);
|
||||||
|
@ -140,14 +140,6 @@ div_inpcb_init(void *mem, int size, int flags)
|
|||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
div_inpcb_fini(void *mem, int size)
|
|
||||||
{
|
|
||||||
struct inpcb *inp = mem;
|
|
||||||
|
|
||||||
INP_LOCK_DESTROY(inp);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
div_init(void)
|
div_init(void)
|
||||||
{
|
{
|
||||||
@ -158,7 +150,7 @@ div_init(void)
|
|||||||
* place for hashbase == NULL.
|
* place for hashbase == NULL.
|
||||||
*/
|
*/
|
||||||
in_pcbinfo_init(&V_divcbinfo, "div", &V_divcb, 1, 1, "divcb",
|
in_pcbinfo_init(&V_divcbinfo, "div", &V_divcb, 1, 1, "divcb",
|
||||||
div_inpcb_init, div_inpcb_fini, 0, IPI_HASHFIELDS_NONE);
|
div_inpcb_init, IPI_HASHFIELDS_NONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -210,7 +210,7 @@ rip_init(void)
|
|||||||
{
|
{
|
||||||
|
|
||||||
in_pcbinfo_init(&V_ripcbinfo, "rip", &V_ripcb, INP_PCBHASH_RAW_SIZE,
|
in_pcbinfo_init(&V_ripcbinfo, "rip", &V_ripcb, INP_PCBHASH_RAW_SIZE,
|
||||||
1, "ripcb", rip_inpcb_init, NULL, 0, IPI_HASHFIELDS_NONE);
|
1, "ripcb", rip_inpcb_init, IPI_HASHFIELDS_NONE);
|
||||||
EVENTHANDLER_REGISTER(maxsockets_change, rip_zone_change, NULL,
|
EVENTHANDLER_REGISTER(maxsockets_change, rip_zone_change, NULL,
|
||||||
EVENTHANDLER_PRI_ANY);
|
EVENTHANDLER_PRI_ANY);
|
||||||
}
|
}
|
||||||
|
@ -647,7 +647,7 @@ tcp_init(void)
|
|||||||
hashsize);
|
hashsize);
|
||||||
}
|
}
|
||||||
in_pcbinfo_init(&V_tcbinfo, "tcp", &V_tcb, hashsize, hashsize,
|
in_pcbinfo_init(&V_tcbinfo, "tcp", &V_tcb, hashsize, hashsize,
|
||||||
"tcp_inpcb", tcp_inpcb_init, NULL, 0, IPI_HASHFIELDS_4TUPLE);
|
"tcp_inpcb", tcp_inpcb_init, IPI_HASHFIELDS_4TUPLE);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* These have to be type stable for the benefit of the timers.
|
* These have to be type stable for the benefit of the timers.
|
||||||
|
@ -203,8 +203,7 @@ udp_init(void)
|
|||||||
* a 4-tuple, flip this to 4-tuple.
|
* a 4-tuple, flip this to 4-tuple.
|
||||||
*/
|
*/
|
||||||
in_pcbinfo_init(&V_udbinfo, "udp", &V_udb, UDBHASHSIZE, UDBHASHSIZE,
|
in_pcbinfo_init(&V_udbinfo, "udp", &V_udb, UDBHASHSIZE, UDBHASHSIZE,
|
||||||
"udp_inpcb", udp_inpcb_init, NULL, 0,
|
"udp_inpcb", udp_inpcb_init, IPI_HASHFIELDS_2TUPLE);
|
||||||
IPI_HASHFIELDS_2TUPLE);
|
|
||||||
V_udpcb_zone = uma_zcreate("udpcb", sizeof(struct udpcb),
|
V_udpcb_zone = uma_zcreate("udpcb", sizeof(struct udpcb),
|
||||||
NULL, NULL, NULL, NULL, UMA_ALIGN_PTR, 0);
|
NULL, NULL, NULL, NULL, UMA_ALIGN_PTR, 0);
|
||||||
uma_zone_set_max(V_udpcb_zone, maxsockets);
|
uma_zone_set_max(V_udpcb_zone, maxsockets);
|
||||||
@ -218,8 +217,8 @@ udplite_init(void)
|
|||||||
{
|
{
|
||||||
|
|
||||||
in_pcbinfo_init(&V_ulitecbinfo, "udplite", &V_ulitecb, UDBHASHSIZE,
|
in_pcbinfo_init(&V_ulitecbinfo, "udplite", &V_ulitecb, UDBHASHSIZE,
|
||||||
UDBHASHSIZE, "udplite_inpcb", udplite_inpcb_init, NULL,
|
UDBHASHSIZE, "udplite_inpcb", udplite_inpcb_init,
|
||||||
0, IPI_HASHFIELDS_2TUPLE);
|
IPI_HASHFIELDS_2TUPLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user