On a System where you use the maximum socketbuffer size of 256kbyte you can run out of memory after less then 9k open sockets.
My patch adds a new uvm_constraint for the mbufs with a bigger memory area. I choose this area after reading the comments in sys/arch/amd64/include/pmap.h. This patch further changes the maximum sucketbuffer size from 256k to 1gb as it is described in the rfc1323 S2.3. I tested this diff with the ix, em and urndis driver. I know that this diff only works for amd64 right now, but i wanted to send this diff as a proposal what could be done. Maybe somebody has a different solution for this Problem or can me why this is a bad idea. Index: arch/amd64/amd64/bus_dma.c =================================================================== RCS file: /openbsd/src/sys/arch/amd64/amd64/bus_dma.c,v retrieving revision 1.49 diff -u -p -u -p -r1.49 bus_dma.c --- arch/amd64/amd64/bus_dma.c 17 Dec 2015 17:16:04 -0000 1.49 +++ arch/amd64/amd64/bus_dma.c 22 Jun 2016 11:33:17 -0000 @@ -584,7 +584,7 @@ _bus_dmamap_load_buffer(bus_dma_tag_t t, */ pmap_extract(pmap, vaddr, (paddr_t *)&curaddr); - if (curaddr > dma_constraint.ucr_high) + if (curaddr > mbuf_constraint.ucr_high) panic("Non dma-reachable buffer at curaddr %#lx(raw)", curaddr); Index: arch/amd64/amd64/machdep.c =================================================================== RCS file: /openbsd/src/sys/arch/amd64/amd64/machdep.c,v retrieving revision 1.221 diff -u -p -u -p -r1.221 machdep.c --- arch/amd64/amd64/machdep.c 21 May 2016 00:56:43 -0000 1.221 +++ arch/amd64/amd64/machdep.c 22 Jun 2016 11:33:17 -0000 @@ -202,9 +202,11 @@ struct vm_map *phys_map = NULL; /* UVM constraint ranges. */ struct uvm_constraint_range isa_constraint = { 0x0, 0x00ffffffUL }; struct uvm_constraint_range dma_constraint = { 0x0, 0xffffffffUL }; +struct uvm_constraint_range mbuf_constraint = { 0x0, 0xfffffffffUL }; struct uvm_constraint_range *uvm_md_constraints[] = { &isa_constraint, &dma_constraint, + &mbuf_constraint, NULL, }; Index: kern/uipc_mbuf.c =================================================================== RCS file: /openbsd/src/sys/kern/uipc_mbuf.c,v retrieving revision 1.226 diff -u -p -u -p -r1.226 uipc_mbuf.c --- kern/uipc_mbuf.c 13 Jun 2016 21:24:43 -0000 1.226 +++ kern/uipc_mbuf.c 22 Jun 2016 11:33:18 -0000 @@ -153,7 +153,7 @@ mbinit(void) pool_init(&mbpool, MSIZE, 0, 0, 0, "mbufpl", NULL); pool_setipl(&mbpool, IPL_NET); - pool_set_constraints(&mbpool, &kp_dma_contig); + pool_set_constraints(&mbpool, &kp_mbuf_contig); pool_setlowat(&mbpool, mblowat); pool_init(&mtagpool, PACKET_TAG_MAXSIZE + sizeof(struct m_tag), @@ -166,7 +166,7 @@ mbinit(void) pool_init(&mclpools[i], mclsizes[i], 0, 0, 0, mclnames[i], NULL); pool_setipl(&mclpools[i], IPL_NET); - pool_set_constraints(&mclpools[i], &kp_dma_contig); + pool_set_constraints(&mclpools[i], &kp_mbuf_contig); pool_setlowat(&mclpools[i], mcllowat); } Index: sys/socketvar.h =================================================================== RCS file: /openbsd/src/sys/sys/socketvar.h,v retrieving revision 1.60 diff -u -p -u -p -r1.60 socketvar.h --- sys/socketvar.h 25 Feb 2016 07:39:09 -0000 1.60 +++ sys/socketvar.h 22 Jun 2016 11:33:18 -0000 @@ -112,7 +112,7 @@ struct socket { short sb_flags; /* flags, see below */ u_short sb_timeo; /* timeout for read/write */ } so_rcv, so_snd; -#define SB_MAX (256*1024) /* default for max chars in sockbuf */ +#define SB_MAX (1024*1024*1024)/* default for max chars in sockbuf */ #define SB_LOCK 0x01 /* lock on data queue */ #define SB_WANT 0x02 /* someone is waiting to lock */ #define SB_WAIT 0x04 /* someone is waiting for data/space */ Index: uvm/uvm_extern.h =================================================================== RCS file: /openbsd/src/sys/uvm/uvm_extern.h,v retrieving revision 1.139 diff -u -p -u -p -r1.139 uvm_extern.h --- uvm/uvm_extern.h 5 Jun 2016 08:35:57 -0000 1.139 +++ uvm/uvm_extern.h 22 Jun 2016 11:33:18 -0000 @@ -234,6 +234,7 @@ extern struct uvmexp uvmexp; /* Constraint ranges, set by MD code. */ extern struct uvm_constraint_range isa_constraint; extern struct uvm_constraint_range dma_constraint; +extern struct uvm_constraint_range mbuf_constraint; extern struct uvm_constraint_range no_constraint; extern struct uvm_constraint_range *uvm_md_constraints[]; @@ -398,6 +399,7 @@ extern const struct kmem_pa_mode kp_zero extern const struct kmem_pa_mode kp_dma; extern const struct kmem_pa_mode kp_dma_contig; extern const struct kmem_pa_mode kp_dma_zero; +extern const struct kmem_pa_mode kp_mbuf_contig; extern const struct kmem_pa_mode kp_pageable; extern const struct kmem_pa_mode kp_none; Index: uvm/uvm_km.c =================================================================== RCS file: /openbsd/src/sys/uvm/uvm_km.c,v retrieving revision 1.128 diff -u -p -u -p -r1.128 uvm_km.c --- uvm/uvm_km.c 26 Sep 2015 17:55:00 -0000 1.128 +++ uvm/uvm_km.c 22 Jun 2016 11:33:18 -0000 @@ -1016,6 +1016,11 @@ const struct kmem_pa_mode kp_dma_zero = .kp_zero = 1 }; +const struct kmem_pa_mode kp_mbuf_contig = { + .kp_constraint = &mbuf_constraint, + .kp_maxseg = 1 +}; + const struct kmem_pa_mode kp_zero = { .kp_constraint = &no_constraint, .kp_zero = 1