From patchwork Tue Jun 28 09:01:25 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Lieven X-Patchwork-Id: 9202309 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 1562160757 for ; Tue, 28 Jun 2016 09:02:53 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 0452F28541 for ; Tue, 28 Jun 2016 09:02:53 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id ED466285FB; Tue, 28 Jun 2016 09:02:52 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,RCVD_IN_DNSWL_HI autolearn=unavailable version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 1973D28541 for ; Tue, 28 Jun 2016 09:02:39 +0000 (UTC) Received: from localhost ([::1]:35163 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bHouk-0006dW-BD for patchwork-qemu-devel@patchwork.kernel.org; Tue, 28 Jun 2016 05:02:38 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34626) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bHou6-0006dD-Nh for qemu-devel@nongnu.org; Tue, 28 Jun 2016 05:01:59 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bHou3-0003Jd-H9 for qemu-devel@nongnu.org; Tue, 28 Jun 2016 05:01:58 -0400 Received: from mx-v6.kamp.de ([2a02:248:0:51::16]:40260 helo=mx01.kamp.de) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bHou3-0003JH-74 for qemu-devel@nongnu.org; Tue, 28 Jun 2016 05:01:55 -0400 Received: (qmail 26204 invoked by uid 89); 28 Jun 2016 09:01:51 -0000 Received: from [195.62.97.28] by client-16-kamp (envelope-from , uid 89) with qmail-scanner-2010/03/19-MF (clamdscan: 0.99.2/21804. hbedv: 8.3.40.44/7.12.99.34. avast: 1.2.2/16062800. spamassassin: 3.4.1. Clear:RC:1(195.62.97.28):. Processed in 0.270944 secs); 28 Jun 2016 09:01:51 -0000 Received: from smtp.kamp.de (HELO submission.kamp.de) ([195.62.97.28]) by mx01.kamp.de with ESMTPS (DHE-RSA-AES256-GCM-SHA384 encrypted); 28 Jun 2016 09:01:48 -0000 X-GL_Whitelist: yes Received: (qmail 29628 invoked from network); 28 Jun 2016 09:01:47 -0000 Received: from lieven-pc.kamp-intra.net (HELO lieven-pc) (relay@kamp.de@::ffff:172.21.12.60) by submission.kamp.de with ESMTPS (DHE-RSA-AES256-GCM-SHA384 encrypted) ESMTPA; 28 Jun 2016 09:01:47 -0000 Received: by lieven-pc (Postfix, from userid 1000) id 3ED7720848; Tue, 28 Jun 2016 11:01:46 +0200 (CEST) From: Peter Lieven To: qemu-devel@nongnu.org Date: Tue, 28 Jun 2016 11:01:25 +0200 Message-Id: <1467104499-27517-2-git-send-email-pl@kamp.de> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1467104499-27517-1-git-send-email-pl@kamp.de> References: <1467104499-27517-1-git-send-email-pl@kamp.de> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2a02:248:0:51::16 Subject: [Qemu-devel] [PATCH 01/15] coroutine-ucontext: mmap stack memory X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, peter.maydell@linaro.org, mst@redhat.com, Peter Lieven , dgilbert@redhat.com, mreitz@redhat.com, kraxel@redhat.com, pbonzini@redhat.com Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP coroutine-ucontext currently allocates stack memory from heap as on most systems the stack size lays below the threshold for mmapping memory. This patch forces mmaping of stacks to avoid large holes on the heap when a coroutine is deleted. It additionally allows us for adding a guard page at the bottom of the stack to avoid overflows. Suggested-by: Peter Maydell Signed-off-by: Peter Lieven --- util/coroutine-ucontext.c | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/util/coroutine-ucontext.c b/util/coroutine-ucontext.c index 2bb7e10..841e7db 100644 --- a/util/coroutine-ucontext.c +++ b/util/coroutine-ucontext.c @@ -80,9 +80,10 @@ static void coroutine_trampoline(int i0, int i1) } } +#define COROUTINE_STACK_SIZE (1 << 20) + Coroutine *qemu_coroutine_new(void) { - const size_t stack_size = 1 << 20; CoroutineUContext *co; ucontext_t old_uc, uc; sigjmp_buf old_env; @@ -101,17 +102,32 @@ Coroutine *qemu_coroutine_new(void) } co = g_malloc0(sizeof(*co)); + +#ifdef MAP_GROWSDOWN + co->stack = mmap(NULL, COROUTINE_STACK_SIZE, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS | MAP_GROWSDOWN, -1, 0); + if (co->stack == MAP_FAILED) { + abort(); + } + /* add a guard page at bottom of the stack */ + if (mmap(co->stack, getpagesize(), PROT_NONE, + MAP_PRIVATE | MAP_ANONYMOUS | MAP_GROWSDOWN, -1, 0) == MAP_FAILED) { + abort(); + } +#else co->stack = g_malloc(stack_size); +#endif + co->base.entry_arg = &old_env; /* stash away our jmp_buf */ uc.uc_link = &old_uc; uc.uc_stack.ss_sp = co->stack; - uc.uc_stack.ss_size = stack_size; + uc.uc_stack.ss_size = COROUTINE_STACK_SIZE; uc.uc_stack.ss_flags = 0; #ifdef CONFIG_VALGRIND_H co->valgrind_stack_id = - VALGRIND_STACK_REGISTER(co->stack, co->stack + stack_size); + VALGRIND_STACK_REGISTER(co->stack, co->stack + COROUTINE_STACK_SIZE); #endif arg.p = co; @@ -149,7 +165,11 @@ void qemu_coroutine_delete(Coroutine *co_) valgrind_stack_deregister(co); #endif +#ifdef MAP_GROWSDOWN + munmap(co->stack, COROUTINE_STACK_SIZE); +#else g_free(co->stack); +#endif g_free(co); }