mmap stacks, makes it possible to align them

This commit is contained in:
pooka 2007-10-26 13:51:14 +00:00
parent 16ea8193e3
commit cb50a739c3
4 changed files with 30 additions and 15 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: callcontext.c,v 1.10 2007/10/21 19:25:58 pooka Exp $ */
/* $NetBSD: callcontext.c,v 1.11 2007/10/26 13:51:14 pooka Exp $ */
/*
* Copyright (c) 2006 Antti Kantee. All Rights Reserved.
@ -27,10 +27,11 @@
#include <sys/cdefs.h>
#if !defined(lint)
__RCSID("$NetBSD: callcontext.c,v 1.10 2007/10/21 19:25:58 pooka Exp $");
__RCSID("$NetBSD: callcontext.c,v 1.11 2007/10/26 13:51:14 pooka Exp $");
#endif /* !lint */
#include <sys/types.h>
#include <sys/mman.h>
#include <assert.h>
#include <errno.h>
@ -127,7 +128,9 @@ struct puffs_cc *
puffs_cc_create(struct puffs_usermount *pu)
{
struct puffs_cc *volatile pcc;
size_t stacksize = 1<<pu->pu_cc_stackshift;
stack_t *st;
void *sp;
pcc = malloc(sizeof(struct puffs_cc));
if (!pcc)
@ -150,12 +153,14 @@ puffs_cc_create(struct puffs_usermount *pu)
/* allocate stack for execution */
st = &pcc->pcc_uc.uc_stack;
st->ss_sp = pcc->pcc_stack = malloc(pu->pu_cc_stacksize);
if (st->ss_sp == NULL) {
sp = mmap(NULL, stacksize, PROT_READ|PROT_WRITE,
MAP_ANON|MAP_PRIVATE|MAP_ALIGNED(pu->pu_cc_stackshift), -1, 0);
if (sp == MAP_FAILED) {
free(pcc);
return NULL;
}
st->ss_size = pu->pu_cc_stacksize;
st->ss_sp = pcc->pcc_stack = sp;
st->ss_size = stacksize;
st->ss_flags = 0;
/*
@ -186,7 +191,9 @@ puffs_cc_setcaller(struct puffs_cc *pcc, pid_t pid, lwpid_t lid)
void
puffs_cc_destroy(struct puffs_cc *pcc)
{
struct puffs_usermount *pu = pcc->pcc_pu;
size_t stacksize = 1<<pu->pu_cc_stackshift;
free(pcc->pcc_stack);
munmap(pcc->pcc_stack, stacksize);
free(pcc);
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: puffs.c,v 1.68 2007/10/25 10:59:45 pooka Exp $ */
/* $NetBSD: puffs.c,v 1.69 2007/10/26 13:51:14 pooka Exp $ */
/*
* Copyright (c) 2005, 2006, 2007 Antti Kantee. All Rights Reserved.
@ -31,7 +31,7 @@
#include <sys/cdefs.h>
#if !defined(lint)
__RCSID("$NetBSD: puffs.c,v 1.68 2007/10/25 10:59:45 pooka Exp $");
__RCSID("$NetBSD: puffs.c,v 1.69 2007/10/26 13:51:14 pooka Exp $");
#endif /* !lint */
#include <sys/param.h>
@ -147,8 +147,16 @@ puffs_getstate(struct puffs_usermount *pu)
void
puffs_setstacksize(struct puffs_usermount *pu, size_t ss)
{
pu->pu_cc_stacksize = ss;
int stackshift;
assert(puffs_getstate(pu) == PUFFS_STATE_BEFOREMOUNT);
stackshift = -1;
while (ss) {
ss >>= 1;
stackshift++;
}
pu->pu_cc_stackshift = stackshift;
assert(1<<stackshift == ss);
}
struct puffs_pathobj *
@ -412,7 +420,7 @@ _puffs_init(int develv, struct puffs_ops *pops, const char *mntfromname,
free(pops); /* XXX */
pu->pu_privdata = priv;
pu->pu_cc_stacksize = PUFFS_CC_STACKSIZE_DEFAULT;
pu->pu_cc_stackshift = PUFFS_CC_STACKSHIFT_DEFAULT;
LIST_INIT(&pu->pu_pnodelst);
LIST_INIT(&pu->pu_framectrl.fb_ios);
LIST_INIT(&pu->pu_ccnukelst);

View File

@ -1,4 +1,4 @@
/* $NetBSD: puffs.h,v 1.89 2007/10/21 19:25:58 pooka Exp $ */
/* $NetBSD: puffs.h,v 1.90 2007/10/26 13:51:14 pooka Exp $ */
/*
* Copyright (c) 2005, 2006, 2007 Antti Kantee. All Rights Reserved.
@ -116,7 +116,7 @@ struct puffs_usermount;
/*
* Magic constants
*/
#define PUFFS_CC_STACKSIZE_DEFAULT (1024*1024)
#define PUFFS_CC_STACKSHIFT_DEFAULT 18
struct puffs_cn {
struct puffs_kcn *pcn_pkcnp; /* kernel input */

View File

@ -1,4 +1,4 @@
/* $NetBSD: puffs_priv.h,v 1.26 2007/10/25 10:59:45 pooka Exp $ */
/* $NetBSD: puffs_priv.h,v 1.27 2007/10/26 13:51:15 pooka Exp $ */
/*
* Copyright (c) 2006 Antti Kantee. All Rights Reserved.
@ -97,7 +97,7 @@ struct puffs_usermount {
size_t pu_maxreqlen;
uint32_t pu_flags;
size_t pu_cc_stacksize;
int pu_cc_stackshift;
int pu_kq;
int pu_state;