{"id":807092,"url":"http://patchwork.ozlabs.org/api/1.2/patches/807092/?format=json","web_url":"http://patchwork.ozlabs.org/project/glibc/patch/1504013662-1367-1-git-send-email-adhemerval.zanella@linaro.org/","project":{"id":41,"url":"http://patchwork.ozlabs.org/api/1.2/projects/41/?format=json","name":"GNU C Library","link_name":"glibc","list_id":"libc-alpha.sourceware.org","list_email":"libc-alpha@sourceware.org","web_url":"","scm_url":"","webscm_url":"","list_archive_url":"","list_archive_url_format":"","commit_url_format":""},"msgid":"<1504013662-1367-1-git-send-email-adhemerval.zanella@linaro.org>","list_archive_url":null,"date":"2017-08-29T13:34:22","name":"ia64: Fix thread stack allocation permission set (BZ #21672)","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"e21e15f4b38ce84953f15d430409400b7adfeb9f","submitter":{"id":66065,"url":"http://patchwork.ozlabs.org/api/1.2/people/66065/?format=json","name":"Adhemerval Zanella Netto","email":"adhemerval.zanella@linaro.org"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/glibc/patch/1504013662-1367-1-git-send-email-adhemerval.zanella@linaro.org/mbox/","series":[{"id":370,"url":"http://patchwork.ozlabs.org/api/1.2/series/370/?format=json","web_url":"http://patchwork.ozlabs.org/project/glibc/list/?series=370","date":"2017-08-29T13:34:22","name":"ia64: Fix thread stack allocation permission set (BZ #21672)","version":1,"mbox":"http://patchwork.ozlabs.org/series/370/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/807092/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/807092/checks/","tags":{},"related":[],"headers":{"Return-Path":"<libc-alpha-return-83814-incoming=patchwork.ozlabs.org@sourceware.org>","X-Original-To":"incoming@patchwork.ozlabs.org","Delivered-To":["patchwork-incoming@bilbo.ozlabs.org","mailing list libc-alpha@sourceware.org"],"Authentication-Results":["ozlabs.org;\n\tspf=pass (mailfrom) smtp.mailfrom=sourceware.org\n\t(client-ip=209.132.180.131; helo=sourceware.org;\n\tenvelope-from=libc-alpha-return-83814-incoming=patchwork.ozlabs.org@sourceware.org;\n\treceiver=<UNKNOWN>)","ozlabs.org; dkim=pass (1024-bit key;\n\tsecure) header.d=sourceware.org header.i=@sourceware.org\n\theader.b=\"qdvQDfu7\"; dkim-atps=neutral","sourceware.org; auth=none"],"Received":["from sourceware.org (server1.sourceware.org [209.132.180.131])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256\n\tbits)) (No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPS id 3xhV4B3Pjqz9t3F\n\tfor <incoming@patchwork.ozlabs.org>;\n\tTue, 29 Aug 2017 23:34:50 +1000 (AEST)","(qmail 126892 invoked by alias); 29 Aug 2017 13:34:43 -0000","(qmail 126776 invoked by uid 89); 29 Aug 2017 13:34:41 -0000"],"DomainKey-Signature":"a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id\n\t:list-unsubscribe:list-subscribe:list-archive:list-post\n\t:list-help:sender:from:to:cc:subject:date:message-id; q=dns; s=\n\tdefault; b=KcP3UqnPZFPT/KIPwv/JCcTP7i661Fi9of6pchTaD/lpCCs/84ixf\n\tABb8FFQoJkIZGQIaP2piPt1GX/oxrR+wB5obSptHCnsnZ03qKgLo1qnWG9NLl3xD\n\tqW4SHEdWwYEI5hYiCdE+3OH3ANDszj2F+2vgTl1YW1IXsSPxpOQGss=","DKIM-Signature":"v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id\n\t:list-unsubscribe:list-subscribe:list-archive:list-post\n\t:list-help:sender:from:to:cc:subject:date:message-id; s=default;\n\tbh=+gE4elJrAW8R6QABex++RugfytA=; b=qdvQDfu7A6qnJhTvuBLH5jqmhSoU\n\t4VNEZtP97D/dwr2UAZ0XUwnlUj2ytrrdVif+krb7wEtTBc5+ix1jxke+B8DSa3dJ\n\t6N/pO8DZcH95WpoIerAvtG5uFSbKCvyU6+gYNgKnK2nUL33mB7talfm0cGDr9BCM\n\tu2GvE1dCiO7sDwE=","Mailing-List":"contact libc-alpha-help@sourceware.org; run by ezmlm","Precedence":"bulk","List-Id":"<libc-alpha.sourceware.org>","List-Unsubscribe":"<mailto:libc-alpha-unsubscribe-incoming=patchwork.ozlabs.org@sourceware.org>","List-Subscribe":"<mailto:libc-alpha-subscribe@sourceware.org>","List-Archive":"<http://sourceware.org/ml/libc-alpha/>","List-Post":"<mailto:libc-alpha@sourceware.org>","List-Help":"<mailto:libc-alpha-help@sourceware.org>,\n\t<http://sourceware.org/ml/#faqs>","Sender":"libc-alpha-owner@sourceware.org","X-Virus-Found":"No","X-Spam-SWARE-Status":"No, score=-26.4 required=5.0 tests=BAYES_00, GIT_PATCH_0,\n\tGIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE,\n\tRCVD_IN_SORBS_SPAM,\n\tSPF_PASS autolearn=ham version=3.3.2 spammy=advertise,\n\tH*m:1367, H*MI:1367","X-HELO":"mail-qk0-f171.google.com","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:from:to:cc:subject:date:message-id;\n\tbh=XPPKTbnvFfGb8ldan6nZRmClDOejqrAaYTcAz0GgrsU=;\n\tb=f7jDlHq+FZf36AmoJOu0m6kVjwfe4ewOgwHF5MTdKVmWSGPdJmykBsURjDOUQNmFIZ\n\tLS69XiuzwnyqOgPlh/BrfdBByDcCAJiz2rY7V/sJNbAvOxjnfkUa2O9aaaqQFF0IxpRz\n\tEBcARJkjyflv/PW8BaRj1L4hCfsDNv5UNBOggiZHZ18bqX5fyu2Y6Eh3FqL6WbxE0rK0\n\tguwT33CJfUQgXCGLD9M8kR/aWCj9eKSe9v0w8DiL0zX+9Gz+xphkwu0vuf122SZy5JA9\n\tfQEr8Nil6kIHQ6kJyLToKb5AvBRPM2rz4ubq9pZzTpwC3VCD9CES8Fn3lfXPWzMp+tzj\n\tvnRg==","X-Gm-Message-State":"AHYfb5gHfo4mdIWRXGm/wtmK4OYzOaxAoVHDm5OoDM+0KBAmKUsNswKQ\n\tbDFR3aTBGzMXf6CibAPXGA==","X-Google-Smtp-Source":"ADKCNb4htzydEOvcBrT5nTkIBpERl6XTCIc3X94XcyHpNqqctnHe6RyjR01T3AatAHMvFc0i9P+CJg==","X-Received":"by 10.55.121.130 with SMTP id u124mr5867860qkc.13.1504013669285; \n\tTue, 29 Aug 2017 06:34:29 -0700 (PDT)","From":"Adhemerval Zanella <adhemerval.zanella@linaro.org>","To":"libc-alpha@sourceware.org","Cc":"Sergei Trofimovich <slyfox@gentoo.org>","Subject":"[PATCH] ia64: Fix thread stack allocation permission set (BZ #21672)","Date":"Tue, 29 Aug 2017 10:34:22 -0300","Message-Id":"<1504013662-1367-1-git-send-email-adhemerval.zanella@linaro.org>"},"content":"This patch fixes ia64 failures on thread exit by madvise the required\narea taking in consideration its disjoing stacks\n(NEED_SEPARATE_REGISTER_STACK).  Also the snippet that setup the\nmadvise call to advertise kernel the area won't be used anymore in\nnear future is reallocated in allocatestack.c (for consistency to\nput all stack management function in one place).\n\nChecked on x86_64-linux-gnu and i686-linux-gnu for sanity (since\nit is not expected code changes for architecture that do not\ndefine NEED_SEPARATE_REGISTER_STACK) and also got a report that\nit fixes ia64-linux-gnu failures from Sergei Trofimovich\n<slyfox@gentoo.org>.\n\n\t[BZ #21672]\n\t* nptl/allocatestack.c [_STACK_GROWS_DOWN] (setup_stack_prot):\n\tSet to use !NEED_SEPARATE_REGISTER_STACK as well.\n\t(advise_stack_range): New function.\n\t* nptl/pthread_create.c (START_THREAD_DEFN): Move logic to mark\n\tstack non required to advise_stack_range at allocatestack.c\n---\n ChangeLog             |  9 +++++++++\n nptl/allocatestack.c  | 29 ++++++++++++++++++++++++++++-\n nptl/pthread_create.c | 27 ++-------------------------\n 3 files changed, 39 insertions(+), 26 deletions(-)","diff":"diff --git a/nptl/allocatestack.c b/nptl/allocatestack.c\nindex 6d1bcaa..8766deb 100644\n--- a/nptl/allocatestack.c\n+++ b/nptl/allocatestack.c\n@@ -356,7 +356,7 @@ setup_stack_prot (char *mem, size_t size, char *guard, size_t guardsize,\n \t\t  const int prot)\n {\n   char *guardend = guard + guardsize;\n-#if _STACK_GROWS_DOWN\n+#if _STACK_GROWS_DOWN && !defined(NEED_SEPARATE_REGISTER_STACK)\n   /* As defined at guard_position, for architectures with downward stack\n      the guard page is always at start of the allocated area.  */\n   if (__mprotect (guardend, size - guardsize, prot) != 0)\n@@ -372,6 +372,33 @@ setup_stack_prot (char *mem, size_t size, char *guard, size_t guardsize,\n   return 0;\n }\n \n+/* Mark the memory of the stack as usable to the kernel.  It frees everything\n+   except for the space used for the TCB itself.  */\n+static inline void\n+__always_inline\n+advise_stack_range (void *mem, size_t size, uintptr_t pd, size_t guardsize)\n+{\n+  uintptr_t sp = (uintptr_t) CURRENT_STACK_FRAME;\n+  size_t pagesize_m1 = __getpagesize () - 1;\n+#if _STACK_GROWS_DOWN && !defined(NEED_SEPARATE_REGISTER_STACK)\n+  size_t freesize = (sp - (uintptr_t) mem) & ~pagesize_m1;\n+  assert (freesize < size);\n+  if (freesize > PTHREAD_STACK_MIN)\n+    __madvise (mem, freesize - PTHREAD_STACK_MIN, MADV_DONTNEED);\n+#else\n+  /* Page aligned start of memory to free (higher than or equal\n+     to current sp plus the minimum stack size).  */\n+  uintptr_t freeblock = (sp + PTHREAD_STACK_MIN + pagesize_m1) & ~pagesize_m1;\n+  uintptr_t free_end = (pd - guardsize) & ~pagesize_m1;\n+  if (free_end > freeblock)\n+    {\n+      size_t freesize = free_end - freeblock;\n+      assert (freesize < size);\n+      __madvise ((void*) freeblock, freesize, MADV_DONTNEED);\n+    }\n+#endif\n+}\n+\n /* Returns a usable stack for a new thread either by allocating a\n    new stack or reusing a cached stack of sufficient size.\n    ATTR must be non-NULL and point to a valid pthread_attr.\ndiff --git a/nptl/pthread_create.c b/nptl/pthread_create.c\nindex 2f8ada3..83b88bf 100644\n--- a/nptl/pthread_create.c\n+++ b/nptl/pthread_create.c\n@@ -551,31 +551,8 @@ START_THREAD_DEFN\n     }\n #endif\n \n-  /* Mark the memory of the stack as usable to the kernel.  We free\n-     everything except for the space used for the TCB itself.  */\n-  size_t pagesize_m1 = __getpagesize () - 1;\n-#ifdef _STACK_GROWS_DOWN\n-  char *sp = CURRENT_STACK_FRAME;\n-  size_t freesize = (sp - (char *) pd->stackblock) & ~pagesize_m1;\n-  assert (freesize < pd->stackblock_size);\n-  if (freesize > PTHREAD_STACK_MIN)\n-    __madvise (pd->stackblock, freesize - PTHREAD_STACK_MIN, MADV_DONTNEED);\n-#else\n-  /* Page aligned start of memory to free (higher than or equal\n-     to current sp plus the minimum stack size).  */\n-  void *freeblock = (void*)((size_t)(CURRENT_STACK_FRAME\n-\t\t\t\t     + PTHREAD_STACK_MIN\n-\t\t\t\t     + pagesize_m1)\n-\t\t\t\t    & ~pagesize_m1);\n-  char *free_end = (char *) (((uintptr_t) pd - pd->guardsize) & ~pagesize_m1);\n-  /* Is there any space to free?  */\n-  if (free_end > (char *)freeblock)\n-    {\n-      size_t freesize = (size_t)(free_end - (char *)freeblock);\n-      assert (freesize < pd->stackblock_size);\n-      __madvise (freeblock, freesize, MADV_DONTNEED);\n-    }\n-#endif\n+  advise_stack_range (pd->stackblock, pd->stackblock_size, (uintptr_t) pd,\n+\t\t      pd->guardsize);\n \n   /* If the thread is detached free the TCB.  */\n   if (IS_DETACHED (pd))\n","prefixes":[]}