From cb50a739c3a726b5a1ff3b90472a4eb2bc86caff Mon Sep 17 00:00:00 2001 From: pooka Date: Fri, 26 Oct 2007 13:51:14 +0000 Subject: [PATCH] mmap stacks, makes it possible to align them --- lib/libpuffs/callcontext.c | 19 +++++++++++++------ lib/libpuffs/puffs.c | 18 +++++++++++++----- lib/libpuffs/puffs.h | 4 ++-- lib/libpuffs/puffs_priv.h | 4 ++-- 4 files changed, 30 insertions(+), 15 deletions(-) diff --git a/lib/libpuffs/callcontext.c b/lib/libpuffs/callcontext.c index e586698ac115..5a769bcb36d7 100644 --- a/lib/libpuffs/callcontext.c +++ b/lib/libpuffs/callcontext.c @@ -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 #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 +#include #include #include @@ -127,7 +128,9 @@ struct puffs_cc * puffs_cc_create(struct puffs_usermount *pu) { struct puffs_cc *volatile pcc; + size_t stacksize = 1<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_cc_stackshift; - free(pcc->pcc_stack); + munmap(pcc->pcc_stack, stacksize); free(pcc); } diff --git a/lib/libpuffs/puffs.c b/lib/libpuffs/puffs.c index 07b03de97e7d..ec0cfa20f8cd 100644 --- a/lib/libpuffs/puffs.c +++ b/lib/libpuffs/puffs.c @@ -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 #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 @@ -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<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); diff --git a/lib/libpuffs/puffs.h b/lib/libpuffs/puffs.h index eeec03743d50..a182310a101f 100644 --- a/lib/libpuffs/puffs.h +++ b/lib/libpuffs/puffs.h @@ -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 */ diff --git a/lib/libpuffs/puffs_priv.h b/lib/libpuffs/puffs_priv.h index 0cd2c0e4dcab..2ea6964359ed 100644 --- a/lib/libpuffs/puffs_priv.h +++ b/lib/libpuffs/puffs_priv.h @@ -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;