On Wed, Jun 22, 2016 at 01:58:25PM +0200, Simon Mages wrote: > 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.
You read that RFC wrong. I see no reason to increase the socketbuffer size to such a huge value. A change like this is currently not acceptable. > 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. > Are you sure that all drivers are able to handle memory with physical addresses that are more than 32bit long? I doubt this. I think a lot more is needed than this diff to make this work even just for amd64. > > 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 > -- :wq Claudio