Page MenuHomeFreeBSD

D17031.id47667.diff
No OneTemporary

D17031.id47667.diff

Index: sys/netinet/in_pcb.h
===================================================================
--- sys/netinet/in_pcb.h
+++ sys/netinet/in_pcb.h
@@ -70,6 +70,7 @@
*/
CK_LIST_HEAD(inpcbhead, inpcb);
CK_LIST_HEAD(inpcbporthead, inpcbport);
+CK_LIST_HEAD(inpcblbgrouphead, inpcblbgroup);
typedef uint64_t inp_gen_t;
/*
@@ -566,7 +567,8 @@
* is dynamically resized as processes bind/unbind to that specific group.
*/
struct inpcblbgroup {
- LIST_ENTRY(inpcblbgroup) il_list;
+ CK_LIST_ENTRY(inpcblbgroup) il_list;
+ struct epoch_context il_epoch_ctx;
uint16_t il_lport; /* (c) */
u_char il_vflag; /* (c) */
u_char il_pad;
@@ -578,7 +580,6 @@
uint32_t il_inpcnt; /* cur count in il_inp[] (h) */
struct inpcb *il_inp[]; /* (h) */
};
-LIST_HEAD(inpcblbgrouphead, inpcblbgroup);
#define INP_LOCK_INIT(inp, d, t) \
rw_init_flags(&(inp)->inp_lock, (t), RW_RECURSE | RW_DUPOK)
Index: sys/netinet/in_pcb.c
===================================================================
--- sys/netinet/in_pcb.c
+++ sys/netinet/in_pcb.c
@@ -235,18 +235,28 @@
grp->il_lport = port;
grp->il_dependladdr = *addr;
grp->il_inpsiz = size;
- LIST_INSERT_HEAD(hdr, grp, il_list);
+ CK_LIST_INSERT_HEAD(hdr, grp, il_list);
return (grp);
}
static void
-in_pcblbgroup_free(struct inpcblbgroup *grp)
+in_pcblbgroup_free_deferred(epoch_context_t ctx)
{
+ struct inpcblbgroup *grp;
- LIST_REMOVE(grp, il_list);
+ grp = __containerof(ctx, struct inpcblbgroup, il_epoch_ctx);
free(grp, M_PCB);
}
+static void
+in_pcblbgroup_free(struct inpcblbgroup *grp)
+{
+
+ CK_LIST_REMOVE(grp, il_list);
+ epoch_call(net_epoch_preempt, &grp->il_epoch_ctx,
+ in_pcblbgroup_free_deferred);
+}
+
static struct inpcblbgroup *
in_pcblbgroup_resize(struct inpcblbgrouphead *hdr,
struct inpcblbgroup *old_grp, int size)
@@ -346,7 +356,7 @@
hdr = &pcbinfo->ipi_lbgrouphashbase[
INP_PCBLBGROUP_PORTHASH(inp->inp_lport,
pcbinfo->ipi_lbgrouphashmask)];
- LIST_FOREACH(grp, hdr, il_list) {
+ CK_LIST_FOREACH(grp, hdr, il_list) {
if (grp->il_vflag == inp->inp_vflag &&
grp->il_lport == inp->inp_lport &&
memcmp(&grp->il_dependladdr,
@@ -410,7 +420,7 @@
INP_PCBLBGROUP_PORTHASH(inp->inp_lport,
pcbinfo->ipi_lbgrouphashmask)];
- LIST_FOREACH(grp, hdr, il_list) {
+ CK_LIST_FOREACH(grp, hdr, il_list) {
for (i = 0; i < grp->il_inpcnt; ++i) {
if (grp->il_inp[i] != inp)
continue;
@@ -1973,7 +1983,7 @@
* - Load balanced group does not contain IPv4 mapped INET6 wild sockets
*/
local_wild = NULL;
- LIST_FOREACH(grp, hdr, il_list) {
+ CK_LIST_FOREACH(grp, hdr, il_list) {
#ifdef INET6
if (!(grp->il_vflag & INP_IPV4))
continue;
Index: sys/netinet6/in6_pcb.c
===================================================================
--- sys/netinet6/in6_pcb.c
+++ sys/netinet6/in6_pcb.c
@@ -889,7 +889,7 @@
* - Load balanced group does not contain jailed sockets.
* - Load balanced does not contain IPv4 mapped INET6 wild sockets.
*/
- LIST_FOREACH(grp, hdr, il_list) {
+ CK_LIST_FOREACH(grp, hdr, il_list) {
#ifdef INET
if (!(grp->il_vflag & INP_IPV6))
continue;

File Metadata

Mime Type
text/plain
Expires
Fri, Apr 10, 12:58 PM (7 h, 26 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
31227650
Default Alt Text
D17031.id47667.diff (3 KB)

Event Timeline