From patchwork Tue Aug 20 18:09:42 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Oleksandr Tyshchenko X-Patchwork-Id: 11104461 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 98C02112C for ; Tue, 20 Aug 2019 18:11:43 +0000 (UTC) Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 7303E20644 for ; Tue, 20 Aug 2019 18:11:43 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="uJ+BwC+3" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 7303E20644 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1i08aK-00063m-2Q; Tue, 20 Aug 2019 18:10:20 +0000 Received: from us1-rack-iad1.inumbo.com ([172.99.69.81]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1i08aJ-00063M-25 for xen-devel@lists.xenproject.org; Tue, 20 Aug 2019 18:10:19 +0000 X-Inumbo-ID: bfafbea8-c375-11e9-98ec-bc764e2007e4 Received: from mail-lj1-x241.google.com (unknown [2a00:1450:4864:20::241]) by us1-rack-iad1.inumbo.com (Halon) with ESMTPS id bfafbea8-c375-11e9-98ec-bc764e2007e4; Tue, 20 Aug 2019 18:10:11 +0000 (UTC) Received: by mail-lj1-x241.google.com with SMTP id e24so5993311ljg.11 for ; Tue, 20 Aug 2019 11:10:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=y9AVKcSqZC/F4jn1A0WnGjw+JZMNmtNNjli73IO0lO8=; b=uJ+BwC+3dXKkYtPtsK5+1FEyHEYAivq6Vg9h20Qy5mxiiIRuWLRc0snlMOFzRfFUz8 deCyOEvvMdqUnM+7lXmmyw+FM8fFCXTfM55XIty1ObFjdYQCDMBcoCFMLqLfF2NE3nUH +KeujKT8Rjw1PnJAkqkr8rVFe4cJZnaX2Uqx8dbNe8abbQjz+GN90qyxQ1CtlpCUHEsY BAP0M9MmvXiwJyT7uSIAWwwTiU4Yw95wGcqJmUA89WG20+GYqTqQ5A9iEnVUC8HCXq72 nob+W0hMFItmPa0EK/KyOEvVqFcr+IdpfbEY66ayElvt9ui8BBEjCGlMYOxkfMBKfodX pdwg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=y9AVKcSqZC/F4jn1A0WnGjw+JZMNmtNNjli73IO0lO8=; b=i6OOpg96loQq4DxlBnN2lCdqSd2j68x843gowBKmq9S8iKZSoVrPCUg+QcQL+9De0H 8+CElVJ7s29scFI7VkA3DuZuG7mwqwFgcS4DLabGjcIcMN80FBxAtGWVAKfEdHO9ket5 VYStA7d5awCHx4dWBv9a8GZlAr3nQloEoM7r76869h/ee6AHb/Ukz+b6IeMuIDvYw4MJ /Hgg2DwxbR33FV+HNwMY+76rOnanFp018HIrESEmEpHQANJjs7cGf4F50IGqP4x7K8uB FcdAeUm0I9muFa+L7gwbu7geu1aT8ko9t5vq00AYcXQNOCcznQcw9HryGJ8JXzppDicG 4nhQ== X-Gm-Message-State: APjAAAVyd1zy66T82ZdQlFze4SjRWKy4Wc6LqXE6WlZazQVZYys9rzFV zo7r9xPbd6XxVa11/NogomdiAfJY X-Google-Smtp-Source: APXvYqxUK7vcut0K61QwiSbMvDPVIR4DEOClxKLG8imK7QiqyZukGACXBvMh/jT9IeHBYBtS5orTtw== X-Received: by 2002:a2e:8714:: with SMTP id m20mr1031343lji.8.1566324610032; Tue, 20 Aug 2019 11:10:10 -0700 (PDT) Received: from otyshchenko.kyiv.epam.com (ll-22.209.223.85.sovam.net.ua. [85.223.209.22]) by smtp.gmail.com with ESMTPSA id f6sm2900642lja.16.2019.08.20.11.10.08 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 20 Aug 2019 11:10:09 -0700 (PDT) From: Oleksandr Tyshchenko To: xen-devel@lists.xenproject.org Date: Tue, 20 Aug 2019 21:09:42 +0300 Message-Id: <1566324587-3442-4-git-send-email-olekstysh@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1566324587-3442-1-git-send-email-olekstysh@gmail.com> References: <1566324587-3442-1-git-send-email-olekstysh@gmail.com> Subject: [Xen-devel] [PATCH V3 3/8] xen/common: Introduce _xrealloc function X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: sstabellini@kernel.org, Wei Liu , Konrad Rzeszutek Wilk , George Dunlap , Andrew Cooper , Ian Jackson , Tim Deegan , Oleksandr Tyshchenko , julien.grall@arm.com, Jan Beulich , Volodymyr_Babchuk@epam.com MIME-Version: 1.0 Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" From: Oleksandr Tyshchenko This patch introduces type-unsafe function which besides re-allocation handles the following corner cases: 1. if requested size is zero, it will behave like xfree 2. if incoming pointer is not valid (NULL or ZERO_BLOCK_PTR), it will behave like xmalloc If both pointer and size are valid the function will re-allocate and copy only if requested size doesn't fit in already allocated space. Subsequent patch will add type-safe helper macros. Signed-off-by: Oleksandr Tyshchenko CC: Andrew Cooper CC: George Dunlap CC: Ian Jackson CC: Jan Beulich CC: Julien Grall CC: Konrad Rzeszutek Wilk CC: Stefano Stabellini CC: Tim Deegan CC: Wei Liu --- Changes since RFC: - behave like xmalloc if incoming pointer is ZERO_BLOCK_PTR or NULL - return ZERO_BLOCK_PTR after xfree if requested size is zero - add patch description - use allocator internals to recognize current size of the incoming pointer - do not re-allocate and copy if requested size fits in already allocated space ... Original patch was initially posted by Sameer Goel: https://lists.xen.org/archives/html/xen-devel/2017-06/msg00858.html This could be considered as another attempt to add it: https://www.mail-archive.com/kexec@lists.infradead.org/msg21335.html [As it was previously discussed with Julien in IRC] The reason for this patch to be an RFC is that patch itself is not completely correct and I don't fully understand what/how should be done for this patch to be accepted. Or whether community even wants this to go in. So, to avoid bike shedding, the first target is to collect feedback. For everyone who wants more details why this is needed and where used, please see next patch of this thread: "iommu/arm: Add lightweight iommu_fwspec support" In a nutshell, the upcoming "iommu_fwspec" support on ARM is going to use xrealloc to expand an array for device IDs. We really want to have "iommu_fwspec" support which will give us a generic abstract way to add new device to the IOMMU based on the generic IOMMU DT binding. --- xen/common/xmalloc_tlsf.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ xen/include/xen/xmalloc.h | 1 + 2 files changed, 46 insertions(+) diff --git a/xen/common/xmalloc_tlsf.c b/xen/common/xmalloc_tlsf.c index e98ad65..eecae2e 100644 --- a/xen/common/xmalloc_tlsf.c +++ b/xen/common/xmalloc_tlsf.c @@ -598,6 +598,51 @@ void *_xzalloc(unsigned long size, unsigned long align) return p ? memset(p, 0, size) : p; } +void *_xrealloc(void *ptr, unsigned long size, unsigned long align) +{ + unsigned long curr_size, tmp_size; + void *p; + + if ( !size ) + { + xfree(ptr); + return ZERO_BLOCK_PTR; + } + + if ( ptr == NULL || ptr == ZERO_BLOCK_PTR ) + return _xmalloc(size, align); + + if ( !((unsigned long)ptr & (PAGE_SIZE - 1)) ) + curr_size = PFN_ORDER(virt_to_page(ptr)) << PAGE_SHIFT; + else + { + struct bhdr *b; + b = (struct bhdr *)((char *)ptr - BHDR_OVERHEAD); + curr_size = b->size & BLOCK_SIZE_MASK; + } + + ASSERT((align & (align - 1)) == 0); + if ( align < MEM_ALIGN ) + align = MEM_ALIGN; + tmp_size = size + align - MEM_ALIGN; + + if ( tmp_size < PAGE_SIZE ) + tmp_size = ( tmp_size < MIN_BLOCK_SIZE ) ? MIN_BLOCK_SIZE : + ROUNDUP_SIZE(tmp_size); + + if ( tmp_size <= curr_size ) /* fits in current block */ + return ptr; + + p = _xmalloc(size, align); + if ( p ) + { + memcpy(p, ptr, min(curr_size, size)); + xfree(ptr); + } + + return p; +} + void xfree(void *p) { struct bhdr *b; diff --git a/xen/include/xen/xmalloc.h b/xen/include/xen/xmalloc.h index f075d2d..831152f 100644 --- a/xen/include/xen/xmalloc.h +++ b/xen/include/xen/xmalloc.h @@ -51,6 +51,7 @@ extern void xfree(void *); /* Underlying functions */ extern void *_xmalloc(unsigned long size, unsigned long align); extern void *_xzalloc(unsigned long size, unsigned long align); +extern void *_xrealloc(void *ptr, unsigned long size, unsigned long align); static inline void *_xmalloc_array( unsigned long size, unsigned long align, unsigned long num)