From patchwork Wed Aug 7 18:17:19 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gregor Haas X-Patchwork-Id: 1970194 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; secure) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20210309 header.b=WF/ab9+h; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20230601 header.b=H4R2LhG0; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.infradead.org (client-ip=2607:7c80:54:3::133; helo=bombadil.infradead.org; envelope-from=opensbi-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=patchwork.ozlabs.org) Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:3::133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4WfJLk1sKgz1yfh for ; Thu, 8 Aug 2024 04:17:48 +1000 (AEST) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=4pLTOXlpkP2/X+D9qET147DV5vNeLZL0UU2aVDerNNE=; b=WF/ab9+hckMLis 91brwu2uIgKC8civChl3ElGD6ivtwA6GwNGo86o8uc7Rv3ltz8zu7sGCz/ge1jtdvV1upCMihBQTO 7V5B3/7adz+Gwi8qrfKg/exbn2YkoLJQOvCXeR0jBvohx05/bTErUFIQYb/+YB2MC73xE8uYDtikT w/DYI+JF/UFFB+gJwhLSR75C7oSZei08gnPttRX6+Hxvv1VYrU6/mj5t0J8LmFs84uEJkxti5P5HF XxJEp12rq5xvXqk8tnS6ryvvNuSNc1nZP8tsGHozZZxCbzcQ4qf6aUhJYlMVgkt+vCvOLyhyf35u7 7Jns/6CNTkj/3WzUhxcA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1sblEC-00000005vBJ-0Jxf; Wed, 07 Aug 2024 18:17:40 +0000 Received: from mail-pl1-x62d.google.com ([2607:f8b0:4864:20::62d]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1sblE7-00000005v8W-2n3V for opensbi@lists.infradead.org; Wed, 07 Aug 2024 18:17:38 +0000 Received: by mail-pl1-x62d.google.com with SMTP id d9443c01a7336-1ff4fa918afso1609305ad.1 for ; Wed, 07 Aug 2024 11:17:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1723054654; x=1723659454; darn=lists.infradead.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=AN2ZqpqFM1VU7U4iuStXvSnOddlDjKa10OG+Dx3Ez8A=; b=H4R2LhG0Kj/NBTvE0dfgEp1embGTPKQCMxGych2DcWYOJxoziVtEG2rJOLXuJGQSPK Iclts8jL/rpUiRBXyXxrZ3Ym+nJTuPtpuYBrRSQbUhk6JEtRjegOoti+euSf6FvWZ4ph d1dcDIFtXWCfI15VCej4Fr+IX9YK0AcGG3je6RyGCejv585zwyWltQp4y77nk2M/OIPz M8RsF2El3vzBsEMt/g2pGi8UrGakiYP9CYZt0el+5DL53/0bavqcz2xawZwbCirGXMIG Kf2Llf0TOp2UfiUCOih0lRpaVwbi7U2PPALHIn7FaTHXzxUzQl6I239EeGveDSAM0ZOy vZ0A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1723054654; x=1723659454; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=AN2ZqpqFM1VU7U4iuStXvSnOddlDjKa10OG+Dx3Ez8A=; b=f7ehYdP5y0PqzGiQr3yYS3rHO5xDS9ulPB2+A8v2tfMtZjy2fPOzv9FQl3ZBhMw+wc sHW9LvnFDp8HjP+SYipreyt4XXrJCiwFPXfIGyJk1Ch43AAD1tiu54fKEvN1SpwFgx39 T5sTa4mI0XkgZT8QlbaxgMGU7Gqd2DelGImnsS+uSScSNvpbxlMEA/tmxmEpIprA5+SE 5TbLXsGjnoSR0cFMbhbXuKiSLPWVBy66XvyTqaeh3OQz42ezIIO9OoroKj3cqXXZopUB O74ba6DC4NYQqpZK1MGhNTYmVJbXrRIiGxytEFhD/81gOc1D9kvgZDwtwSh+f3c1uXlb knHA== X-Gm-Message-State: AOJu0YwvQ9lOfnd2ulUVqbUPI+jrzZxu+MES5JkfLPx898Wie7pQli8a EFBPSwkuLXzRGTWBlJZh83VbHdqf+JS7edv7C7TigR2XB+DHvZiEBVzHrrTq X-Google-Smtp-Source: AGHT+IFy6PHc7AYJ6KF5FX/ROv0XHBnn+wj5sDClTaRA63bJCBnq1LcdupdwUnzUKHQz0Gu1soabMQ== X-Received: by 2002:a17:902:e892:b0:1fb:34ef:4467 with SMTP id d9443c01a7336-1ff573bff21mr170385235ad.43.1723054654362; Wed, 07 Aug 2024 11:17:34 -0700 (PDT) Received: from localhost ([136.27.11.53]) by smtp.gmail.com with UTF8SMTPSA id d9443c01a7336-1ff58f53efcsm110091645ad.82.2024.08.07.11.17.34 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 07 Aug 2024 11:17:34 -0700 (PDT) From: Gregor Haas To: opensbi@lists.infradead.org Cc: atishp@rivosinc.com, anup@brainfault.org, Gregor Haas Subject: [PATCH v3 3/3] lib: sbi: Implement aligned memory allocators Date: Wed, 7 Aug 2024 11:17:19 -0700 Message-ID: <20240807181719.244099-4-gregorhaas1997@gmail.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240807181719.244099-1-gregorhaas1997@gmail.com> References: <20240807181719.244099-1-gregorhaas1997@gmail.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240807_111735_735867_ECE2B04B X-CRM114-Status: GOOD ( 16.67 ) X-Spam-Score: -1.8 (-) X-Spam-Report: Spam detection software, running on the system "bombadil.infradead.org", has NOT identified this incoming email as spam. The original message has been attached to this so you can view it or label similar future email. If you have any questions, see the administrator of that system for details. Content preview: This change adds a simple implementation of sbi_memalign(), for future use in allocating aligned memory for SMMTT tables. Signed-off-by: Gregor Haas --- include/sbi/sbi_heap.h | 9 +++++ lib/sbi/sbi_heap.c | 81 ++++++++++++++++++++++++++++++++++++++---- 2 files changed, 84 insertions(+), 6 deletions(-) Content analysis details: (-1.8 points, 5.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at https://www.dnswl.org/, no trust [2607:f8b0:4864:20:0:0:0:62d listed in] [list.dnswl.org] -0.0 SPF_PASS SPF: sender matches SPF record 0.0 SPF_HELO_NONE SPF: HELO does not publish an SPF Record -0.1 DKIM_VALID_EF Message has a valid DKIM or DK signature from envelope-from domain -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1% [score: 0.0000] 0.2 FREEMAIL_ENVFROM_END_DIGIT Envelope-from freemail username ends in digit [gregorhaas1997(at)gmail.com] 0.0 FREEMAIL_FROM Sender email is commonly abused enduser mail provider [gregorhaas1997(at)gmail.com] X-BeenThere: opensbi@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "opensbi" Errors-To: opensbi-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org This change adds a simple implementation of sbi_memalign(), for future use in allocating aligned memory for SMMTT tables. Signed-off-by: Gregor Haas --- include/sbi/sbi_heap.h | 9 +++++ lib/sbi/sbi_heap.c | 81 ++++++++++++++++++++++++++++++++++++++---- 2 files changed, 84 insertions(+), 6 deletions(-) diff --git a/include/sbi/sbi_heap.h b/include/sbi/sbi_heap.h index 9a67090..2103aef 100644 --- a/include/sbi/sbi_heap.h +++ b/include/sbi/sbi_heap.h @@ -31,6 +31,15 @@ static inline void *sbi_malloc(size_t size) return sbi_malloc_from(&global_hpctrl, size); } +/** Allocate aligned from heap area */ +void *sbi_memalign_from(struct sbi_heap_control *hpctrl, size_t alignment, + size_t size); + +static inline void *sbi_memalign(size_t alignment, size_t size) +{ + return sbi_memalign_from(&global_hpctrl, alignment, size); +} + /** Zero allocate from heap area */ void *sbi_zalloc_from(struct sbi_heap_control *hpctrl, size_t size); diff --git a/lib/sbi/sbi_heap.c b/lib/sbi/sbi_heap.c index cc4893d..ea73b54 100644 --- a/lib/sbi/sbi_heap.c +++ b/lib/sbi/sbi_heap.c @@ -37,27 +37,70 @@ struct sbi_heap_control { struct sbi_heap_control global_hpctrl; -void *sbi_malloc_from(struct sbi_heap_control *hpctrl, size_t size) +static void *alloc_with_align(struct sbi_heap_control *hpctrl, + size_t align, size_t size) { void *ret = NULL; - struct heap_node *n, *np; + struct heap_node *n, *np, *rem; + uint64_t lowest_aligned; + size_t pad; if (!size) return NULL; - size += HEAP_ALLOC_ALIGN - 1; - size &= ~((unsigned long)HEAP_ALLOC_ALIGN - 1); + size += align - 1; + size &= ~((unsigned long)align - 1); spin_lock(&hpctrl->lock); np = NULL; sbi_list_for_each_entry(n, &hpctrl->free_space_list, head) { - if (size <= n->size) { + lowest_aligned = ROUNDUP(n->addr, align); + pad = lowest_aligned - n->addr; + + if (size + pad <= n->size) { np = n; break; } } - if (np) { + if (!np) { + goto out; + } + + if (pad) { + if (sbi_list_empty(&hpctrl->free_node_list)) { + goto out; + } + + n = sbi_list_first_entry(&hpctrl->free_node_list, + struct heap_node, head); + sbi_list_del(&n->head); + + if ((size + pad < np->size) && + !sbi_list_empty(&hpctrl->free_node_list)) { + rem = sbi_list_first_entry(&hpctrl->free_node_list, + struct heap_node, head); + sbi_list_del(&rem->head); + rem->addr = np->addr + (size + pad); + rem->size = np->size - (size + pad); + sbi_list_add_tail(&rem->head, + &hpctrl->free_space_list); + + n->addr = lowest_aligned; + n->size = size; + np->size = pad; + sbi_list_add_tail(&n->head, &hpctrl->used_space_list); + ret = (void *)n->addr; + } else if (size + pad == np->size) { + n->addr = lowest_aligned; + n->size = size; + np->size = pad; + ret = (void *)n->addr; + } else { + // Can't allocate, return n + sbi_list_add(&n->head, &hpctrl->free_node_list); + } + } else { if ((size < np->size) && !sbi_list_empty(&hpctrl->free_node_list)) { n = sbi_list_first_entry(&hpctrl->free_node_list, @@ -76,11 +119,37 @@ void *sbi_malloc_from(struct sbi_heap_control *hpctrl, size_t size) } } +out: spin_unlock(&hpctrl->lock); return ret; } +void *sbi_malloc_from(struct sbi_heap_control *hpctrl, size_t size) +{ + return alloc_with_align(hpctrl, HEAP_ALLOC_ALIGN, size); +} + +void *sbi_memalign_from(struct sbi_heap_control *hpctrl, size_t alignment, + size_t size) +{ + if(alignment < HEAP_ALLOC_ALIGN) { + alignment = HEAP_ALLOC_ALIGN; + } + + // Make sure alignment is power of two + if((alignment & (alignment - 1)) != 0) { + return NULL; + } + + // Make sure size is multiple of alignment + if(size % alignment != 0) { + return NULL; + } + + return alloc_with_align(hpctrl, alignment, size); +} + void *sbi_zalloc_from(struct sbi_heap_control *hpctrl, size_t size) { void *ret = sbi_malloc_from(hpctrl, size);