From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 41263A0032; Fri, 29 Oct 2021 11:53:23 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 9688C41143; Fri, 29 Oct 2021 11:53:22 +0200 (CEST) Received: from mail-wm1-f41.google.com (mail-wm1-f41.google.com [209.85.128.41]) by mails.dpdk.org (Postfix) with ESMTP id B091C410E1 for ; Fri, 29 Oct 2021 11:53:21 +0200 (CEST) Received: by mail-wm1-f41.google.com with SMTP id z11-20020a1c7e0b000000b0030db7b70b6bso12071293wmc.1 for ; Fri, 29 Oct 2021 02:53:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=6wind.com; s=google; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=5jd6tlQ5rg88M5bA1Ry8FGl9oJ4QhdhDJPPOCFofNHk=; b=BO2P0ndlupQmNPSyR5tWFLMKcn32rgBqpqAHG9criVxHEs7/HDigdQLxl8K7EWUhEc lEzriBlWgFfaBgUvkNE9akFXLL8OL+gfq5/lq+o6RF+rWOwPGSyfueQmpFfsT81PXict vHgYVdjrrBmj+2GUS5DJATzQmQEGSTYsqGX5quntKd5PP93ZsEBIsF4fU0LELpekkm9r o0lMqXagBEiRZt6PbrpV2z5ZNeEFV40cqqR5FFg5w5VWU1IM+vZGOqWSkCRlDIMrZhgH 4MOU7cg6liNYhLHvw9J+p+/n5T6SsAGKhrpUQY1aTAOzr/aKQkncpNwLfqsWKQETBFE8 /kwg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=5jd6tlQ5rg88M5bA1Ry8FGl9oJ4QhdhDJPPOCFofNHk=; b=PwrHaqx0l6w+uiGS5qMQdbCz40fEmmqY6dLpFLaWLGoysxBvL39oY+FAGq2SW2r+Kc pfBai6+cZJcL91HO1vWhNZkzglkxmT+eXbSjC+3d82A7g5scmw4CUF4Ct+OR1/sKhwQx Cvjk4JVykN/elespvXZTdUVL2U1cQ7xSA5Ny3aaGKfTUl2KSs2CGnHqX1IX5cHqshmVo dZ4I4Ga9jRjV3YUKxXBOvhBxzCZsORriyIgbgRkLHTAyryXL7Exhqg87TWFulw11gKLR tcwK1P9aOICqNrUuLRTqcSOIN48iysRZHH7KdiDeIhenJ/IiEt69mMnksKB1iey6w0FK NUaQ== X-Gm-Message-State: AOAM530HWbIjajyHufBbpT+IFHHCu5b6nsGwhIik+UPmA0smJWPxdede VBQCpoG9ty0YX6+wlRB8SmJNH21vxnc6Iw== X-Google-Smtp-Source: ABdhPJwimnIjEcMtRZUisPHcoYD0Cg5ngWILXrPnuKAzRWLQJgctAOf/OWXbaUFc65UwnpkkDNvkPQ== X-Received: by 2002:a05:600c:2214:: with SMTP id z20mr10085753wml.32.1635501201498; Fri, 29 Oct 2021 02:53:21 -0700 (PDT) Received: from gojira.dev.6wind.com (host.78.145.23.62.rev.coltfrance.com. [62.23.145.78]) by smtp.gmail.com with ESMTPSA id h14sm9043418wmq.34.2021.10.29.02.53.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 29 Oct 2021 02:53:21 -0700 (PDT) From: Olivier Matz To: dev@dpdk.org Cc: Anatoly Burakov , Maxime Coquelin , David Marchand , stable@dpdk.org Date: Fri, 29 Oct 2021 11:53:10 +0200 Message-Id: <20211029095310.30785-1-olivier.matz@6wind.com> X-Mailer: git-send-email 2.30.2 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [dpdk-dev] [PATCH] eal/memory: fix unused SIGBUS handler X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Since its introduction in 2018, the SIGBUS handler was never registered, and all related functions were unused. A SIGBUS can be received by the application when accessing to hugepages even if mmap() was successful, This happens especially when running inside containers when there is not enough hugepages. In this case, we need to recover. A similar scheme can be found in eal_memory.c. Fixes: 582bed1e1d1d ("mem: support mapping hugepages at runtime") Cc: stable@dpdk.org Signed-off-by: Olivier Matz --- lib/eal/linux/eal_memalloc.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/lib/eal/linux/eal_memalloc.c b/lib/eal/linux/eal_memalloc.c index 0ec8542283..337f2bc739 100644 --- a/lib/eal/linux/eal_memalloc.c +++ b/lib/eal/linux/eal_memalloc.c @@ -107,7 +107,7 @@ static struct rte_memseg_list local_memsegs[RTE_MAX_MEMSEG_LISTS]; static sigjmp_buf huge_jmpenv; -static void __rte_unused huge_sigbus_handler(int signo __rte_unused) +static void huge_sigbus_handler(int signo __rte_unused) { siglongjmp(huge_jmpenv, 1); } @@ -116,7 +116,7 @@ static void __rte_unused huge_sigbus_handler(int signo __rte_unused) * non-static local variable in the stack frame calling sigsetjmp might be * clobbered by a call to longjmp. */ -static int __rte_unused huge_wrap_sigsetjmp(void) +static int huge_wrap_sigsetjmp(void) { return sigsetjmp(huge_jmpenv, 1); } @@ -124,7 +124,7 @@ static int __rte_unused huge_wrap_sigsetjmp(void) static struct sigaction huge_action_old; static int huge_need_recover; -static void __rte_unused +static void huge_register_sigbus(void) { sigset_t mask; @@ -139,7 +139,7 @@ huge_register_sigbus(void) huge_need_recover = !sigaction(SIGBUS, &action, &huge_action_old); } -static void __rte_unused +static void huge_recover_sigbus(void) { if (huge_need_recover) { @@ -576,6 +576,8 @@ alloc_seg(struct rte_memseg *ms, void *addr, int socket_id, mmap_flags = MAP_SHARED | MAP_POPULATE | MAP_FIXED; } + huge_register_sigbus(); + /* * map the segment, and populate page tables, the kernel fills * this segment with zeros if it's a new page. @@ -651,6 +653,8 @@ alloc_seg(struct rte_memseg *ms, void *addr, int socket_id, __func__); #endif + huge_recover_sigbus(); + ms->addr = addr; ms->hugepage_sz = alloc_sz; ms->len = alloc_sz; @@ -664,6 +668,7 @@ alloc_seg(struct rte_memseg *ms, void *addr, int socket_id, mapped: munmap(addr, alloc_sz); unmapped: + huge_recover_sigbus(); flags = EAL_RESERVE_FORCE_ADDRESS; new_addr = eal_get_virtual_area(addr, &alloc_sz, alloc_sz, 0, flags); if (new_addr != addr) { -- 2.30.2