Page MenuHomeFreeBSD

D49100.diff
No OneTemporary

D49100.diff

diff --git a/sys/netinet/in_pcb.c b/sys/netinet/in_pcb.c
--- a/sys/netinet/in_pcb.c
+++ b/sys/netinet/in_pcb.c
@@ -339,6 +339,7 @@
* lookups until listen() has been called.
*/
LIST_INSERT_HEAD(&grp->il_pending, inp, inp_lbgroup_list);
+ grp->il_pendcnt++;
} else {
grp->il_inp[grp->il_inpcnt] = inp;
@@ -375,6 +376,8 @@
CK_LIST_INSERT_HEAD(hdr, grp, il_list);
LIST_SWAP(&old_grp->il_pending, &grp->il_pending, inpcb,
inp_lbgroup_list);
+ grp->il_pendcnt = old_grp->il_pendcnt;
+ old_grp->il_pendcnt = 0;
in_pcblbgroup_free(old_grp);
return (grp);
}
@@ -435,7 +438,7 @@
return (ENOBUFS);
in_pcblbgroup_insert(grp, inp);
CK_LIST_INSERT_HEAD(hdr, grp, il_list);
- } else if (grp->il_inpcnt == grp->il_inpsiz) {
+ } else if (grp->il_inpcnt + grp->il_pendcnt == grp->il_inpsiz) {
if (grp->il_inpsiz >= INPCBLBGROUP_SIZMAX) {
if (ratecheck(&lastprint, &interval))
printf("lb group port %d, limit reached\n",
@@ -499,6 +502,7 @@
LIST_FOREACH(inp1, &grp->il_pending, inp_lbgroup_list) {
if (inp == inp1) {
LIST_REMOVE(inp, inp_lbgroup_list);
+ grp->il_pendcnt--;
inp->inp_flags &= ~INP_INLBGROUP;
return;
}
@@ -1503,6 +1507,7 @@
INP_HASH_WLOCK(pcbinfo);
grp = in_pcblbgroup_find(inp);
LIST_REMOVE(inp, inp_lbgroup_list);
+ grp->il_pendcnt--;
in_pcblbgroup_insert(grp, inp);
INP_HASH_WUNLOCK(pcbinfo);
}
diff --git a/sys/netinet/in_pcb_var.h b/sys/netinet/in_pcb_var.h
--- a/sys/netinet/in_pcb_var.h
+++ b/sys/netinet/in_pcb_var.h
@@ -82,6 +82,7 @@
#define il6_laddr il_dependladdr.id6_addr
uint32_t il_inpsiz; /* max count in il_inp[] (h) */
uint32_t il_inpcnt; /* cur count in il_inp[] (h) */
+ uint32_t il_pendcnt; /* cur count in il_pending (h) */
struct inpcb *il_inp[]; /* (h) */
};

File Metadata

Mime Type
text/plain
Expires
Sat, Feb 22, 9:32 PM (1 h, 37 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
16780667
Default Alt Text
D49100.diff (1 KB)

Event Timeline