From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-13.5 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id AABBFC433E0 for ; Wed, 27 Jan 2021 10:18:28 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 058F020723 for ; Wed, 27 Jan 2021 10:18:27 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 058F020723 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id 7B8546B0006; Wed, 27 Jan 2021 05:18:27 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 768C26B0007; Wed, 27 Jan 2021 05:18:27 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 682516B0008; Wed, 27 Jan 2021 05:18:27 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0135.hostedemail.com [216.40.44.135]) by kanga.kvack.org (Postfix) with ESMTP id 4D3816B0006 for ; Wed, 27 Jan 2021 05:18:27 -0500 (EST) Received: from smtpin02.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay05.hostedemail.com (Postfix) with ESMTP id 13FE1181AEF31 for ; Wed, 27 Jan 2021 10:18:27 +0000 (UTC) X-FDA: 77751155454.02.queen47_1c1053927596 Received: from filter.hostedemail.com (10.5.16.251.rfc1918.com [10.5.16.251]) by smtpin02.hostedemail.com (Postfix) with ESMTP id E44D510097AA3 for ; Wed, 27 Jan 2021 10:18:26 +0000 (UTC) X-HE-Tag: queen47_1c1053927596 X-Filterd-Recvd-Size: 6405 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [63.128.21.124]) by imf39.hostedemail.com (Postfix) with ESMTP for ; Wed, 27 Jan 2021 10:18:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1611742705; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=LeueFFtmc2r/D9kvr3PLBuOowgUJrNaT10Vf8WSqmXE=; b=SkNJPyqzBHt/TekK0RcLaZLB93h/8h4wozwJaXqE5naDgtulFREbIBPo56igrfvOALrOfB uJx3EdZRONWYeCxrijYYgUpJoQ+qXKWN768uJDzTKqay9jibGMeygZ7tQ9dwhRHxvR+8Ke q7rZuIrt0W979YvLNrz1mR56+3cNMP4= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-556-msfCqRKCPteJWQSiLSA3uw-1; Wed, 27 Jan 2021 05:18:23 -0500 X-MC-Unique: msfCqRKCPteJWQSiLSA3uw-1 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id E923A9CDA0; Wed, 27 Jan 2021 10:18:21 +0000 (UTC) Received: from t480s.redhat.com (ovpn-114-237.ams2.redhat.com [10.36.114.237]) by smtp.corp.redhat.com (Postfix) with ESMTP id E96E86EF55; Wed, 27 Jan 2021 10:18:19 +0000 (UTC) From: David Hildenbrand To: linux-kernel@vger.kernel.org Cc: linux-mm@kvack.org, David Hildenbrand , Andrew Morton , Thomas Gleixner , "Peter Zijlstra (Intel)" , Mike Rapoport , Oscar Salvador , Michal Hocko , Wei Yang Subject: [PATCH v1 1/2] mm/cma: expose all pages to the buddy if activation of an area fails Date: Wed, 27 Jan 2021 11:18:12 +0100 Message-Id: <20210127101813.6370-2-david@redhat.com> In-Reply-To: <20210127101813.6370-1-david@redhat.com> References: <20210127101813.6370-1-david@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 Content-Transfer-Encoding: quoted-printable X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: Right now, if activation fails, we might already have exposed some pages = to the buddy for CMA use (although they will never get actually used by CMA)= , and some pages won't be exposed to the buddy at all. Let's check for "single zone" early and on error, don't expose any pages for CMA use - instead, expose them to the buddy available for any use. Simply call free_reserved_page() on every single page - easier than going via free_reserved_area(), converting back and forth between pfns and virt addresses. In addition, make sure to fixup totalcma_pages properly. Example: 6 GiB QEMU VM with "... hugetlb_cma=3D2G movablecore=3D20% ...": [ 0.006891] hugetlb_cma: reserve 2048 MiB, up to 2048 MiB per node [ 0.006893] cma: Reserved 2048 MiB at 0x0000000100000000 [ 0.006893] hugetlb_cma: reserved 2048 MiB on node 0 ... [ 0.175433] cma: CMA area hugetlb0 could not be activated Before this patch: # cat /proc/meminfo MemTotal: 5867348 kB MemFree: 5692808 kB MemAvailable: 5542516 kB ... CmaTotal: 2097152 kB CmaFree: 1884160 kB After this patch: # cat /proc/meminfo MemTotal: 6077308 kB MemFree: 5904208 kB MemAvailable: 5747968 kB ... CmaTotal: 0 kB CmaFree: 0 kB Note: cma_init_reserved_mem() makes sure that we always cover full pageblocks / MAX_ORDER - 1 pages. Cc: Andrew Morton Cc: Thomas Gleixner Cc: "Peter Zijlstra (Intel)" Cc: Mike Rapoport Cc: Oscar Salvador Cc: Michal Hocko Cc: Wei Yang Signed-off-by: David Hildenbrand --- mm/cma.c | 43 +++++++++++++++++++++---------------------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/mm/cma.c b/mm/cma.c index 0ba69cd16aeb..23d4a97c834a 100644 --- a/mm/cma.c +++ b/mm/cma.c @@ -94,34 +94,29 @@ static void cma_clear_bitmap(struct cma *cma, unsigne= d long pfn, =20 static void __init cma_activate_area(struct cma *cma) { - unsigned long base_pfn =3D cma->base_pfn, pfn =3D base_pfn; - unsigned i =3D cma->count >> pageblock_order; + unsigned long base_pfn =3D cma->base_pfn, pfn; struct zone *zone; =20 cma->bitmap =3D bitmap_zalloc(cma_bitmap_maxno(cma), GFP_KERNEL); if (!cma->bitmap) goto out_error; =20 - WARN_ON_ONCE(!pfn_valid(pfn)); - zone =3D page_zone(pfn_to_page(pfn)); - - do { - unsigned j; - - base_pfn =3D pfn; - for (j =3D pageblock_nr_pages; j; --j, pfn++) { - WARN_ON_ONCE(!pfn_valid(pfn)); - /* - * alloc_contig_range requires the pfn range - * specified to be in the same zone. Make this - * simple by forcing the entire CMA resv range - * to be in the same zone. - */ - if (page_zone(pfn_to_page(pfn)) !=3D zone) - goto not_in_zone; - } - init_cma_reserved_pageblock(pfn_to_page(base_pfn)); - } while (--i); + /* + * alloc_contig_range() requires the pfn range specified to be in the + * same zone. Simplify by forcing the entire CMA resv range to be in th= e + * same zone. + */ + WARN_ON_ONCE(!pfn_valid(base_pfn)); + zone =3D page_zone(pfn_to_page(base_pfn)); + for (pfn =3D base_pfn + 1; pfn < base_pfn + cma->count; pfn++) { + WARN_ON_ONCE(!pfn_valid(pfn)); + if (page_zone(pfn_to_page(pfn)) !=3D zone) + goto not_in_zone; + } + + for (pfn =3D base_pfn; pfn < base_pfn + cma->count; + pfn +=3D pageblock_nr_pages) + init_cma_reserved_pageblock(pfn_to_page(pfn)); =20 mutex_init(&cma->lock); =20 @@ -135,6 +130,10 @@ static void __init cma_activate_area(struct cma *cma= ) not_in_zone: bitmap_free(cma->bitmap); out_error: + /* Expose all pages to the buddy, they are useless for CMA. */ + for (pfn =3D base_pfn; pfn < base_pfn + cma->count; pfn++) + free_reserved_page(pfn_to_page(pfn)); + totalcma_pages -=3D cma->count; cma->count =3D 0; pr_err("CMA area %s could not be activated\n", cma->name); return; --=20 2.29.2