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

Reply via email to