summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2009-03-12 13:45:55 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2009-03-12 13:45:55 +0000
commit3112e9d48546c4c7b13a53224e8907a102ab2b0e (patch)
treefdce54a73f47ef9fe526b7d4fc7e229fdefa6547 /sys
parent0722f1ca8ec3d30c051ac4877dd35145258e3e24 (diff)
Notes
Diffstat (limited to 'sys')
-rw-r--r--sys/kern/sysv_shm.c26
-rw-r--r--sys/sys/param.h2
-rw-r--r--sys/sys/shm.h1
3 files changed, 17 insertions, 12 deletions
diff --git a/sys/kern/sysv_shm.c b/sys/kern/sysv_shm.c
index 574c3dee6a61..921b4fc3e634 100644
--- a/sys/kern/sysv_shm.c
+++ b/sys/kern/sysv_shm.c
@@ -121,7 +121,8 @@ static sy_call_t *shmcalls[] = {
#define SHMSEG_ALLOCATED 0x0800
#define SHMSEG_WANTED 0x1000
-static int shm_last_free, shm_nused, shm_committed, shmalloced;
+static int shm_last_free, shm_nused, shmalloced;
+vm_size_t shm_committed;
static struct shmid_kernel *shmsegs;
struct shmmap_state {
@@ -244,13 +245,13 @@ static void
shm_deallocate_segment(shmseg)
struct shmid_kernel *shmseg;
{
- size_t size;
+ vm_size_t size;
GIANT_REQUIRED;
vm_object_deallocate(shmseg->u.shm_internal);
shmseg->u.shm_internal = NULL;
- size = round_page(shmseg->u.shm_segsz);
+ size = round_page(shmseg->shm_bsegsz);
shm_committed -= btoc(size);
shm_nused--;
shmseg->u.shm_perm.mode = SHMSEG_FREE;
@@ -264,13 +265,13 @@ shm_delete_mapping(struct vmspace *vm, struct shmmap_state *shmmap_s)
{
struct shmid_kernel *shmseg;
int segnum, result;
- size_t size;
+ vm_size_t size;
GIANT_REQUIRED;
segnum = IPCID_TO_IX(shmmap_s->shmid);
shmseg = &shmsegs[segnum];
- size = round_page(shmseg->u.shm_segsz);
+ size = round_page(shmseg->shm_bsegsz);
result = vm_map_remove(&vm->vm_map, shmmap_s->va, shmmap_s->va + size);
if (result != KERN_SUCCESS)
return (EINVAL);
@@ -361,8 +362,8 @@ kern_shmat(td, shmid, shmaddr, shmflg)
mtx_lock(&Giant);
shmmap_s = p->p_vmspace->vm_shm;
if (shmmap_s == NULL) {
- size = shminfo.shmseg * sizeof(struct shmmap_state);
- shmmap_s = malloc(size, M_SHM, M_WAITOK);
+ shmmap_s = malloc(shminfo.shmseg * sizeof(struct shmmap_state),
+ M_SHM, M_WAITOK);
for (i = 0; i < shminfo.shmseg; i++)
shmmap_s[i].shmid = -1;
p->p_vmspace->vm_shm = shmmap_s;
@@ -390,7 +391,7 @@ kern_shmat(td, shmid, shmaddr, shmflg)
error = EMFILE;
goto done2;
}
- size = round_page(shmseg->u.shm_segsz);
+ size = round_page(shmseg->shm_bsegsz);
#ifdef VM_PROT_READ_IS_EXEC
prot = VM_PROT_READ | VM_PROT_EXECUTE;
#else
@@ -422,7 +423,8 @@ kern_shmat(td, shmid, shmaddr, shmflg)
vm_object_reference(shmseg->u.shm_internal);
rv = vm_map_find(&p->p_vmspace->vm_map, shmseg->u.shm_internal,
- 0, &attach_va, size, (flags & MAP_FIXED)?0:1, prot, prot, 0);
+ 0, &attach_va, size, (flags & MAP_FIXED) ? VMFS_NO_SPACE :
+ VMFS_ANY_SPACE, prot, prot, 0);
if (rv != KERN_SUCCESS) {
vm_object_deallocate(shmseg->u.shm_internal);
error = ENOMEM;
@@ -705,7 +707,7 @@ shmget_existing(td, uap, mode, segnum)
if (error != 0)
return (error);
#endif
- if (uap->size && uap->size > shmseg->u.shm_segsz)
+ if (uap->size != 0 && uap->size > shmseg->shm_bsegsz)
return (EINVAL);
td->td_retval[0] = IXSEQ_TO_IPCID(segnum, shmseg->u.shm_perm);
return (0);
@@ -717,7 +719,8 @@ shmget_allocate_segment(td, uap, mode)
struct shmget_args *uap;
int mode;
{
- int i, segnum, shmid, size;
+ int i, segnum, shmid;
+ size_t size;
struct ucred *cred = td->td_ucred;
struct shmid_kernel *shmseg;
vm_object_t shm_object;
@@ -775,6 +778,7 @@ shmget_allocate_segment(td, uap, mode)
shmseg->u.shm_perm.mode = (shmseg->u.shm_perm.mode & SHMSEG_WANTED) |
(mode & ACCESSPERMS) | SHMSEG_ALLOCATED;
shmseg->u.shm_segsz = uap->size;
+ shmseg->shm_bsegsz = uap->size;
shmseg->u.shm_cpid = td->td_proc->p_pid;
shmseg->u.shm_lpid = shmseg->u.shm_nattch = 0;
shmseg->u.shm_atime = shmseg->u.shm_dtime = 0;
diff --git a/sys/sys/param.h b/sys/sys/param.h
index a23d3b941105..17d2a85e70ce 100644
--- a/sys/sys/param.h
+++ b/sys/sys/param.h
@@ -57,7 +57,7 @@
* is created, otherwise 1.
*/
#undef __FreeBSD_version
-#define __FreeBSD_version 701104 /* Master, propagated to newvers */
+#define __FreeBSD_version 701105 /* Master, propagated to newvers */
#ifndef LOCORE
#include <sys/types.h>
diff --git a/sys/sys/shm.h b/sys/sys/shm.h
index 88eaf0624d0f..8bd8b50257a1 100644
--- a/sys/sys/shm.h
+++ b/sys/sys/shm.h
@@ -108,6 +108,7 @@ struct shminfo {
struct shmid_kernel {
struct shmid_ds u;
struct label *label; /* MAC label */
+ size_t shm_bsegsz;
};
extern struct shminfo shminfo;