Make sysv-style shared memory tuneable params fully runtime adjustable

via sysctl.  It's done pretty simply but it should be quite adequate.
Also move SHMMAXPGS from $machine/include/vmparam.h as the comments that
went with it were wrong... we don't allocate KVM space for the pages so
that comment is bogus..  The only practical limit is how much physical
ram you want to lock up as this stuff isn't paged out or swap backed.
This commit is contained in:
peter 2000-03-30 07:17:05 +00:00
parent 0a57de8840
commit 4ace50a779
12 changed files with 87 additions and 152 deletions

View File

@ -140,10 +140,6 @@
#include <miscfs/procfs/procfs.h>
#include <machine/sigframe.h>
#ifdef SYSVSHM
#include <sys/shm.h>
#endif
#ifdef SYSVMSG
#include <sys/msg.h>
#endif
@ -331,9 +327,6 @@ cpu_startup(dummy)
valloc(callout, struct callout, ncallout);
valloc(callwheel, struct callout_tailq, callwheelsize);
#ifdef SYSVSHM
valloc(shmsegs, struct shmid_ds, shminfo.shmmni);
#endif
#ifdef SYSVSEM
valloc(sema, struct semid_ds, seminfo.semmni);
valloc(sem, struct sem, seminfo.semmns);

View File

@ -94,14 +94,6 @@
#define USRIOSIZE 64
#endif
/*
* PTEs for system V style shared memory.
* This is basically slop for kmempt which we actually allocate (malloc) from.
*/
#ifndef SHMMAXPGS
#define SHMMAXPGS 1024 /* 8mb */
#endif
/*
* Boundary at which to place first MAPMEM segment if not explicitly
* specified. Should be a power of two. This allows some slop for

View File

@ -73,10 +73,6 @@
#include <sys/vmmeter.h>
#include <sys/bus.h>
#ifdef SYSVSHM
#include <sys/shm.h>
#endif
#ifdef SYSVMSG
#include <sys/msg.h>
#endif
@ -329,9 +325,6 @@ cpu_startup(dummy)
valloc(callout, struct callout, ncallout);
valloc(callwheel, struct callout_tailq, callwheelsize);
#ifdef SYSVSHM
valloc(shmsegs, struct shmid_ds, shminfo.shmmni);
#endif
#ifdef SYSVSEM
valloc(sema, struct semid_ds, seminfo.semmni);
valloc(sem, struct sem, seminfo.semmns);

View File

@ -71,13 +71,6 @@
#define USRTEXT (1*PAGE_SIZE) /* base of user text XXX bogus */
/*
* Size of the Shared Memory Pages page table.
*/
#ifndef SHMMAXPGS
#define SHMMAXPGS 1024 /* XXX until we have more kmap space */
#endif
/*
* The time for a process to be blocked before being very swappable.
* This is a number of seconds which the system takes as being a non-trivial

View File

@ -67,6 +67,12 @@ SUIDDIR opt_suiddir.h
SYSVMSG opt_sysvipc.h
SYSVSEM opt_sysvipc.h
SYSVSHM opt_sysvipc.h
SHMALL opt_sysvipc.h
SHMMAX opt_sysvipc.h
SHMMAXPGS opt_sysvipc.h
SHMMIN opt_sysvipc.h
SHMMNI opt_sysvipc.h
SHMSEG opt_sysvipc.h
UCONSOLE
ICMP_BANDLIM
VFS_AIO
@ -142,12 +148,6 @@ SEMMNU opt_param.h
SEMMSL opt_param.h
SEMOPM opt_param.h
SEMUME opt_param.h
SHMALL opt_param.h
SHMMAX opt_param.h
SHMMAXPGS opt_param.h
SHMMIN opt_param.h
SHMMNI opt_param.h
SHMSEG opt_param.h
# Generic SCSI options.
CAM_MAX_HIGHPOWER opt_cam.h

View File

@ -46,10 +46,6 @@
#include <sys/param.h>
#ifdef SYSVSHM
#include <machine/vmparam.h>
#include <sys/shm.h>
#endif
#ifdef SYSVSEM
#include <sys/sem.h>
#endif
@ -90,35 +86,6 @@ int mbuf_wait = 32; /* mbuf sleep time in ticks */
#endif
int nsfbufs = NSFBUFS;
/*
* Values in support of System V compatible shared memory. XXX
*/
#ifdef SYSVSHM
#ifndef SHMMAX
#define SHMMAX (SHMMAXPGS*PAGE_SIZE)
#endif
#ifndef SHMMIN
#define SHMMIN 1
#endif
#ifndef SHMMNI
#define SHMMNI 32 /* <= SHMMMNI in shm.h */
#endif
#ifndef SHMSEG
#define SHMSEG 8
#endif
#ifndef SHMALL
#define SHMALL (SHMMAXPGS)
#endif
struct shminfo shminfo = {
SHMMAX,
SHMMIN,
SHMMNI,
SHMSEG,
SHMALL
};
#endif
/*
* Values in support of System V compatible semaphores.
*/

View File

@ -73,10 +73,6 @@
#include <sys/vmmeter.h>
#include <sys/bus.h>
#ifdef SYSVSHM
#include <sys/shm.h>
#endif
#ifdef SYSVMSG
#include <sys/msg.h>
#endif
@ -329,9 +325,6 @@ cpu_startup(dummy)
valloc(callout, struct callout, ncallout);
valloc(callwheel, struct callout_tailq, callwheelsize);
#ifdef SYSVSHM
valloc(shmsegs, struct shmid_ds, shminfo.shmmni);
#endif
#ifdef SYSVSEM
valloc(sema, struct semid_ds, seminfo.semmni);
valloc(sem, struct sem, seminfo.semmns);

View File

@ -71,13 +71,6 @@
#define USRTEXT (1*PAGE_SIZE) /* base of user text XXX bogus */
/*
* Size of the Shared Memory Pages page table.
*/
#ifndef SHMMAXPGS
#define SHMMAXPGS 1024 /* XXX until we have more kmap space */
#endif
/*
* The time for a process to be blocked before being very swappable.
* This is a number of seconds which the system takes as being a non-trivial

View File

@ -46,10 +46,6 @@
#include <sys/param.h>
#ifdef SYSVSHM
#include <machine/vmparam.h>
#include <sys/shm.h>
#endif
#ifdef SYSVSEM
#include <sys/sem.h>
#endif
@ -90,35 +86,6 @@ int mbuf_wait = 32; /* mbuf sleep time in ticks */
#endif
int nsfbufs = NSFBUFS;
/*
* Values in support of System V compatible shared memory. XXX
*/
#ifdef SYSVSHM
#ifndef SHMMAX
#define SHMMAX (SHMMAXPGS*PAGE_SIZE)
#endif
#ifndef SHMMIN
#define SHMMIN 1
#endif
#ifndef SHMMNI
#define SHMMNI 32 /* <= SHMMMNI in shm.h */
#endif
#ifndef SHMSEG
#define SHMSEG 8
#endif
#ifndef SHMALL
#define SHMALL (SHMMAXPGS)
#endif
struct shminfo shminfo = {
SHMMAX,
SHMMIN,
SHMMNI,
SHMSEG,
SHMALL
};
#endif
/*
* Values in support of System V compatible semaphores.
*/

View File

@ -33,11 +33,13 @@
#include "opt_compat.h"
#include "opt_rlimit.h"
#include "opt_sysvipc.h"
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/sysproto.h>
#include <sys/kernel.h>
#include <sys/sysctl.h>
#include <sys/shm.h>
#include <sys/proc.h>
#include <sys/malloc.h>
@ -54,24 +56,11 @@
#include <vm/vm_page.h>
#include <vm/vm_pager.h>
#ifndef _SYS_SYSPROTO_H_
struct shmat_args;
extern int shmat __P((struct proc *p, struct shmat_args *uap));
struct shmctl_args;
extern int shmctl __P((struct proc *p, struct shmctl_args *uap));
struct shmdt_args;
extern int shmdt __P((struct proc *p, struct shmdt_args *uap));
struct shmget_args;
extern int shmget __P((struct proc *p, struct shmget_args *uap));
#endif
static MALLOC_DEFINE(M_SHM, "shm", "SVID compatible shared memory segments");
static void shminit __P((void *));
SYSINIT(sysv_shm, SI_SUB_SYSV_SHM, SI_ORDER_FIRST, shminit, NULL)
struct oshmctl_args;
static int oshmctl __P((struct proc *p, struct oshmctl_args *uap));
static int shmget_allocate_segment __P((struct proc *p, struct shmget_args *uap, int mode));
static int shmget_existing __P((struct proc *p, struct shmget_args *uap, int mode, int segnum));
@ -87,8 +76,8 @@ static sy_call_t *shmcalls[] = {
#define SHMSEG_ALLOCATED 0x0800
#define SHMSEG_WANTED 0x1000
static int shm_last_free, shm_nused, shm_committed;
struct shmid_ds *shmsegs;
static int shm_last_free, shm_nused, shm_committed, shmalloced;
static struct shmid_ds *shmsegs;
struct shm_handle {
/* vm_offset_t kva; */
@ -104,6 +93,45 @@ static void shm_deallocate_segment __P((struct shmid_ds *));
static int shm_find_segment_by_key __P((key_t));
static struct shmid_ds *shm_find_segment_by_shmid __P((int));
static int shm_delete_mapping __P((struct proc *, struct shmmap_state *));
static void shmrealloc __P((void));
static void shminit __P((void *));
/*
* Tuneable values
*/
#ifndef SHMMAXPGS
#define SHMMAXPGS 1024 /* XXX increase this, it's not in kva! */
#endif
#ifndef SHMMAX
#define SHMMAX (SHMMAXPGS*PAGE_SIZE)
#endif
#ifndef SHMMIN
#define SHMMIN 1
#endif
#ifndef SHMMNI
#define SHMMNI 96
#endif
#ifndef SHMSEG
#define SHMSEG 64
#endif
#ifndef SHMALL
#define SHMALL (SHMMAXPGS)
#endif
struct shminfo shminfo = {
SHMMAX,
SHMMIN,
SHMMNI,
SHMSEG,
SHMALL
};
SYSCTL_DECL(_kern_ipc);
SYSCTL_INT(_kern_ipc, OID_AUTO, shmmax, CTLFLAG_RW, &shminfo.shmmax, 0, "");
SYSCTL_INT(_kern_ipc, OID_AUTO, shmmin, CTLFLAG_RW, &shminfo.shmmin, 0, "");
SYSCTL_INT(_kern_ipc, OID_AUTO, shmmni, CTLFLAG_RD, &shminfo.shmmni, 0, "");
SYSCTL_INT(_kern_ipc, OID_AUTO, shmseg, CTLFLAG_RW, &shminfo.shmseg, 0, "");
SYSCTL_INT(_kern_ipc, OID_AUTO, shmall, CTLFLAG_RW, &shminfo.shmall, 0, "");
static int
shm_find_segment_by_key(key)
@ -111,7 +139,7 @@ shm_find_segment_by_key(key)
{
int i;
for (i = 0; i < shminfo.shmmni; i++)
for (i = 0; i < shmalloced; i++)
if ((shmsegs[i].shm_perm.mode & SHMSEG_ALLOCATED) &&
shmsegs[i].shm_perm.key == key)
return i;
@ -126,7 +154,7 @@ shm_find_segment_by_shmid(shmid)
struct shmid_ds *shmseg;
segnum = IPCID_TO_IX(shmid);
if (segnum < 0 || segnum >= shminfo.shmmni)
if (segnum < 0 || segnum >= shmalloced)
return NULL;
shmseg = &shmsegs[segnum];
if ((shmseg->shm_perm.mode & (SHMSEG_ALLOCATED | SHMSEG_REMOVED))
@ -473,11 +501,12 @@ shmget_allocate_segment(p, uap, mode)
if (shm_committed + btoc(size) > shminfo.shmall)
return ENOMEM;
if (shm_last_free < 0) {
for (i = 0; i < shminfo.shmmni; i++)
shmrealloc(); /* maybe expand the shmsegs[] array */
for (i = 0; i < shmalloced; i++)
if (shmsegs[i].shm_perm.mode & SHMSEG_FREE)
break;
if (i == shminfo.shmmni)
panic("shmseg free count inconsistent");
if (i == shmalloced)
return ENOSPC;
segnum = i;
} else {
segnum = shm_last_free;
@ -600,12 +629,40 @@ shmexit(p)
p->p_vmspace->vm_shm = NULL;
}
void
static void
shmrealloc(void)
{
int i;
struct shmid_ds *newsegs;
if (shmalloced >= shminfo.shmmni)
return;
newsegs = malloc(shminfo.shmmni * sizeof(*newsegs), M_SHM, M_WAITOK);
if (newsegs == NULL)
return;
for (i = 0; i < shmalloced; i++)
bcopy(&shmsegs[i], &newsegs[i], sizeof(newsegs[0]));
for (; i < shminfo.shmmni; i++) {
shmsegs[i].shm_perm.mode = SHMSEG_FREE;
shmsegs[i].shm_perm.seq = 0;
}
free(shmsegs, M_SHM);
shmsegs = newsegs;
shmalloced = shminfo.shmmni;
}
static void
shminit(dummy)
void *dummy;
{
int i;
for (i = 0; i < shminfo.shmmni; i++) {
shmalloced = shminfo.shmmni;
shmsegs = malloc(shmalloced * sizeof(shmsegs[0]), M_SHM, M_WAITOK);
if (shmsegs == NULL)
panic("cannot allocate initial memory for sysvshm");
for (i = 0; i < shmalloced; i++) {
shmsegs[i].shm_perm.mode = SHMSEG_FREE;
shmsegs[i].shm_perm.seq = 0;
}
@ -613,3 +670,4 @@ shminit(dummy)
shm_nused = 0;
shm_committed = 0;
}
SYSINIT(sysv_shm, SI_SUB_SYSV_SHM, SI_ORDER_FIRST, shminit, NULL);

View File

@ -73,10 +73,6 @@
#include <sys/vmmeter.h>
#include <sys/bus.h>
#ifdef SYSVSHM
#include <sys/shm.h>
#endif
#ifdef SYSVMSG
#include <sys/msg.h>
#endif
@ -342,9 +338,6 @@ cpu_startup(dummy)
valloc(callout, struct callout, ncallout);
valloc(callwheel, struct callout_tailq, callwheelsize);
#ifdef SYSVSHM
valloc(shmsegs, struct shmid_ds, shminfo.shmmni);
#endif
#ifdef SYSVSEM
valloc(sema, struct semid_ds, seminfo.semmni);
valloc(sem, struct sem, seminfo.semmns);

View File

@ -73,10 +73,6 @@
#include <sys/vmmeter.h>
#include <sys/bus.h>
#ifdef SYSVSHM
#include <sys/shm.h>
#endif
#ifdef SYSVMSG
#include <sys/msg.h>
#endif
@ -342,9 +338,6 @@ cpu_startup(dummy)
valloc(callout, struct callout, ncallout);
valloc(callwheel, struct callout_tailq, callwheelsize);
#ifdef SYSVSHM
valloc(shmsegs, struct shmid_ds, shminfo.shmmni);
#endif
#ifdef SYSVSEM
valloc(sema, struct semid_ds, seminfo.semmni);
valloc(sem, struct sem, seminfo.semmns);