From patchwork Fri Feb 24 15:11:25 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Marchand X-Patchwork-Id: 124524 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 7F1BC41D5F; Fri, 24 Feb 2023 16:12:15 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 9CBB041148; Fri, 24 Feb 2023 16:12:05 +0100 (CET) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mails.dpdk.org (Postfix) with ESMTP id 7D32E410F6 for ; Fri, 24 Feb 2023 16:12:03 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1677251522; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=46WTwH0iZm3s0MjED3yPyKn9iluz8WAx2mokaxcg8qQ=; b=ZeRpcEOl6Eaw3qVxBzsPB5MCBqeMZR1TiaEzDIP0AUvhbU3NpMLgtvtl4MA1bGvql5Zlcy rDTnST5W8h6ybAsTRCJ0+UxXKgmfA5dQvy0Byekj/Qn9mLmBRspFFAwuocDE0UNSjg4ntb 4f7fqxNI5diVcFe+S6z9ia8iw4rtkWw= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-392-sCEzoJmkOzih_BGXlt9Paw-1; Fri, 24 Feb 2023 10:11:57 -0500 X-MC-Unique: sCEzoJmkOzih_BGXlt9Paw-1 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id F26CB1871D9B; Fri, 24 Feb 2023 15:11:56 +0000 (UTC) Received: from dmarchan.redhat.com (unknown [10.45.224.55]) by smtp.corp.redhat.com (Postfix) with ESMTP id 7C30E440D8; Fri, 24 Feb 2023 15:11:55 +0000 (UTC) From: David Marchand To: dev@dpdk.org Cc: thomas@monjalon.net, Anatoly Burakov , Bruce Richardson , Dmitry Kozlyuk , Narcisa Ana Maria Vasile , Dmitry Malloy , Pallavi Kadam Subject: [PATCH v2 02/20] mem: rework malloc heap init Date: Fri, 24 Feb 2023 16:11:25 +0100 Message-Id: <20230224151143.3274897-3-david.marchand@redhat.com> In-Reply-To: <20230224151143.3274897-1-david.marchand@redhat.com> References: <20230224081642.2566619-1-david.marchand@redhat.com> <20230224151143.3274897-1-david.marchand@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.1 on 10.11.54.5 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com 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 rte_eal_memory_init() and rte_eal_malloc_heap_init() must be called in a common section taking rte_mcfg_mem_read_lock(). Split rte_eal_malloc_heap_init() in two so that the mem lock is taken in rte_eal_init() making lock checks trivial (once annotated in the next patch). Signed-off-by: David Marchand --- lib/eal/common/eal_common_memory.c | 10 +--------- lib/eal/common/malloc_heap.c | 10 ++++++---- lib/eal/common/malloc_heap.h | 3 +++ lib/eal/freebsd/eal.c | 13 +++++++++++++ lib/eal/linux/eal.c | 13 +++++++++++++ lib/eal/windows/eal.c | 13 +++++++++++++ 6 files changed, 49 insertions(+), 13 deletions(-) diff --git a/lib/eal/common/eal_common_memory.c b/lib/eal/common/eal_common_memory.c index c917b981bc..5e162a1092 100644 --- a/lib/eal/common/eal_common_memory.c +++ b/lib/eal/common/eal_common_memory.c @@ -1078,18 +1078,11 @@ rte_eal_memory_detach(void) int rte_eal_memory_init(void) { - struct rte_mem_config *mcfg = rte_eal_get_configuration()->mem_config; const struct internal_config *internal_conf = eal_get_internal_configuration(); - int retval; - RTE_LOG(DEBUG, EAL, "Setting up physically contiguous memory...\n"); - - if (!mcfg) - return -1; - /* lock mem hotplug here, to prevent races while we init */ - rte_mcfg_mem_read_lock(); + RTE_LOG(DEBUG, EAL, "Setting up physically contiguous memory...\n"); if (rte_eal_memseg_init() < 0) goto fail; @@ -1108,7 +1101,6 @@ rte_eal_memory_init(void) return 0; fail: - rte_mcfg_mem_read_unlock(); return -1; } diff --git a/lib/eal/common/malloc_heap.c b/lib/eal/common/malloc_heap.c index cc84dce672..7498a05ed3 100644 --- a/lib/eal/common/malloc_heap.c +++ b/lib/eal/common/malloc_heap.c @@ -1442,18 +1442,20 @@ rte_eal_malloc_heap_init(void) } } - if (register_mp_requests()) { RTE_LOG(ERR, EAL, "Couldn't register malloc multiprocess actions\n"); - rte_mcfg_mem_read_unlock(); return -1; } - /* unlock mem hotplug here. it's safe for primary as no requests can + return 0; +} + +int rte_eal_malloc_heap_populate(void) +{ + /* mem hotplug is unlocked here. it's safe for primary as no requests can * even come before primary itself is fully initialized, and secondaries * do not need to initialize the heap. */ - rte_mcfg_mem_read_unlock(); /* secondary process does not need to initialize anything */ if (rte_eal_process_type() != RTE_PROC_PRIMARY) diff --git a/lib/eal/common/malloc_heap.h b/lib/eal/common/malloc_heap.h index 3b2fbc0aa0..8f3ab57154 100644 --- a/lib/eal/common/malloc_heap.h +++ b/lib/eal/common/malloc_heap.h @@ -85,6 +85,9 @@ malloc_socket_to_heap_id(unsigned int socket_id); int rte_eal_malloc_heap_init(void); +int +rte_eal_malloc_heap_populate(void); + void rte_eal_malloc_heap_cleanup(void); diff --git a/lib/eal/freebsd/eal.c b/lib/eal/freebsd/eal.c index 7db4239c51..7daf22e314 100644 --- a/lib/eal/freebsd/eal.c +++ b/lib/eal/freebsd/eal.c @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -754,13 +755,25 @@ rte_eal_init(int argc, char **argv) return -1; } + rte_mcfg_mem_read_lock(); + if (rte_eal_memory_init() < 0) { + rte_mcfg_mem_read_unlock(); rte_eal_init_alert("Cannot init memory"); rte_errno = ENOMEM; return -1; } if (rte_eal_malloc_heap_init() < 0) { + rte_mcfg_mem_read_unlock(); + rte_eal_init_alert("Cannot init malloc heap"); + rte_errno = ENODEV; + return -1; + } + + rte_mcfg_mem_read_unlock(); + + if (rte_eal_malloc_heap_populate() < 0) { rte_eal_init_alert("Cannot init malloc heap"); rte_errno = ENODEV; return -1; diff --git a/lib/eal/linux/eal.c b/lib/eal/linux/eal.c index fabafbc39b..7242ee2c9a 100644 --- a/lib/eal/linux/eal.c +++ b/lib/eal/linux/eal.c @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -1197,7 +1198,10 @@ rte_eal_init(int argc, char **argv) return -1; } + rte_mcfg_mem_read_lock(); + if (rte_eal_memory_init() < 0) { + rte_mcfg_mem_read_unlock(); rte_eal_init_alert("Cannot init memory"); rte_errno = ENOMEM; return -1; @@ -1207,6 +1211,15 @@ rte_eal_init(int argc, char **argv) eal_hugedirs_unlock(); if (rte_eal_malloc_heap_init() < 0) { + rte_mcfg_mem_read_unlock(); + rte_eal_init_alert("Cannot init malloc heap"); + rte_errno = ENODEV; + return -1; + } + + rte_mcfg_mem_read_unlock(); + + if (rte_eal_malloc_heap_populate() < 0) { rte_eal_init_alert("Cannot init malloc heap"); rte_errno = ENODEV; return -1; diff --git a/lib/eal/windows/eal.c b/lib/eal/windows/eal.c index e7d405b91c..033825c14c 100644 --- a/lib/eal/windows/eal.c +++ b/lib/eal/windows/eal.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -387,13 +388,25 @@ rte_eal_init(int argc, char **argv) return -1; } + rte_mcfg_mem_read_lock(); + if (rte_eal_memory_init() < 0) { + rte_mcfg_mem_read_unlock(); rte_eal_init_alert("Cannot init memory"); rte_errno = ENOMEM; return -1; } if (rte_eal_malloc_heap_init() < 0) { + rte_mcfg_mem_read_unlock(); + rte_eal_init_alert("Cannot init malloc heap"); + rte_errno = ENODEV; + return -1; + } + + rte_mcfg_mem_read_unlock(); + + if (rte_eal_malloc_heap_populate() < 0) { rte_eal_init_alert("Cannot init malloc heap"); rte_errno = ENODEV; return -1;