Received: by 2002:a05:6a10:22f:0:0:0:0 with SMTP id 15csp841442pxk; Mon, 31 Aug 2020 02:37:04 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzcT7UAskfybJcwnexDCSwMl+yfPLL57yyNlOZUGjztXHlPgTwX2UhjHKJMw2IQicpXjbHO X-Received: by 2002:a17:906:1f43:: with SMTP id d3mr272355ejk.295.1598866624211; Mon, 31 Aug 2020 02:37:04 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1598866624; cv=none; d=google.com; s=arc-20160816; b=jxelWhtuiNjOywAUAHDu3nGNMaoQkbUzFlFGi5joaBMMZv+X25PPaG6nW5obYRiTzP Vu6Bk34s1KphvxTU20I5K7UZFLY09xMNkpQWKYYGhqRPyEpp3FxDII0GYnYcvGZswuMs gdLS6p2LaUOn9YqaDi1LJ1r5teF4dzWWIA4qkVTJr4XIW8eNnUm71Uwl7U0naG+0H3dt QPJdTKWceBlwSfC6bhEqq17KdCA+f8f+WIqG73ArPkRGmaRVJEeTNguBA9OKFmVOPmwb obqV5zMfeIHC5ohMt/SGyegPFzN79QJatz+f8a7ws59xmb1Gp46+rwzKmp3s2ToiozVJ M7rw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:cc:to:subject :message-id:date:from:in-reply-to:references:mime-version :dkim-signature; bh=HsNtRpi0XGja6Sj9lSJWoznoixc15RWCQVmmU4+oCGQ=; b=meDdN5yugdW7F+kpzSGDC9c2T1Jeu/wMFHbjpuCYyAJKqaUFAFkTG4RY0ZxuYKDAFX gNXTRdm5O4Ag27jr4xX8BB0QYB7pSEmQZTIvu9/A86T4pOWqBKIO57UShdeKKePeB8Hp EJ8gY5rxbD92iwa5P9M7zQfvWJGQYdJY5ioMmO31i73+WnkUg/2KxCHZcKa59UgoJIYw lTy3hjp0VDZA0QYyh1QOxpJ9t1B4Uyg2ud6sVRSZLBdUnCT9YOniaapwNNWV5nBkvPta P7Pq7ZtqYLCfXNhwP2zmwxv7ZqhWy7q0gKUEAT6h7y6lWps44C98MYp3RwtLkO7DNAq+ RgYA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=BkWe+B6D; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id n23si5527588eja.442.2020.08.31.02.36.40; Mon, 31 Aug 2020 02:37:04 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=BkWe+B6D; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726106AbgHaJfw (ORCPT + 99 others); Mon, 31 Aug 2020 05:35:52 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56160 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725915AbgHaJfu (ORCPT ); Mon, 31 Aug 2020 05:35:50 -0400 Received: from mail-io1-xd41.google.com (mail-io1-xd41.google.com [IPv6:2607:f8b0:4864:20::d41]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 146D8C061573; Mon, 31 Aug 2020 02:35:49 -0700 (PDT) Received: by mail-io1-xd41.google.com with SMTP id w20so5191297iom.1; Mon, 31 Aug 2020 02:35:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=HsNtRpi0XGja6Sj9lSJWoznoixc15RWCQVmmU4+oCGQ=; b=BkWe+B6D3lN045gds9IoFYUQ+o2juq6u/5mtP4qMWEZgN4V72MQv52x13zt+0Vagcw PiplKpJDZIg1gJ/K+PqleXk0+ms/PIwH4m04bUTXOP6LZe4mc4lUMCnaFMAZ1Nf7OH5R +TO1BAV2uJm4VdeFkABkZgYtRWdSxBF7MObhl58VcQjVfHSqlwYCoTT8LWmc7Hg5H7zn rFVALNyy0QNyyM9EWLw6uOxE4Uiqo6MEltvqGfVltYm+Lsi1MNLu6dooosPYw/1NDhKj 0s2nGoPPTS/ePGpaVVkCc9/P0ug7/BLTlsgu0GElkFNNztt3JlZyxdTPXMRhtYmxlaLF /55A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=HsNtRpi0XGja6Sj9lSJWoznoixc15RWCQVmmU4+oCGQ=; b=o00SnCss4AugIwNW/hj2acmI4UGAsFIP1R/7tCNXhfk2Z4R4T8hYJBtZgIp2ZMHFml l21CmAnU3YF00Vma3Qbqy7GZDD6xtvdUngeM7dSDatJ6J1fbPtE7DOMcYL1P9RzetKo4 flN4N9ey1jWfK/qdrkOG59RXKi/SIwr73QjSILxWRQ0tzjshDw/SjhEOgsKGMQkTCHcH R6dX3XSttvLFWNfJB8vI19yyp/7dib12KVBfH6VNSDzmvBGwtliT3cNh0dokQ7erwncs 949/oMHciN5bBSih2E7QeulOCDGkh+ZcZqX6DjXlrMz2ADVqbxFk2blfRFFhmQOpqVsh c5kQ== X-Gm-Message-State: AOAM5336UvPqccJ7xOJ+pzb0vMYkCm2IqhZtENgC++nZ0CDm0oAEQGxc IKARigSPQRlWLlbMSfdyK9k4xtBZjk3ujquZbO8= X-Received: by 2002:a6b:b513:: with SMTP id e19mr547960iof.167.1598866548037; Mon, 31 Aug 2020 02:35:48 -0700 (PDT) MIME-Version: 1.0 References: <20200821103431.13481-1-david@redhat.com> <20200821103431.13481-3-david@redhat.com> In-Reply-To: <20200821103431.13481-3-david@redhat.com> From: Pankaj Gupta Date: Mon, 31 Aug 2020 11:35:36 +0200 Message-ID: Subject: Re: [PATCH v1 2/5] kernel/resource: merge_system_ram_resources() to merge resources after hotplug To: David Hildenbrand Cc: LKML , virtualization@lists.linux-foundation.org, Linux MM , linux-hyperv@vger.kernel.org, xen-devel@lists.xenproject.org, Andrew Morton , Michal Hocko , Dan Williams , Jason Gunthorpe , Kees Cook , Ard Biesheuvel , Thomas Gleixner , "K. Y. Srinivasan" , Haiyang Zhang , Stephen Hemminger , Wei Liu , Boris Ostrovsky , Juergen Gross , Stefano Stabellini , =?UTF-8?Q?Roger_Pau_Monn=C3=A9?= , Julien Grall , Baoquan He , Wei Yang Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org > Some add_memory*() users add memory in small, contiguous memory blocks. > Examples include virtio-mem, hyper-v balloon, and the XEN balloon. > > This can quickly result in a lot of memory resources, whereby the actual > resource boundaries are not of interest (e.g., it might be relevant for > DIMMs, exposed via /proc/iomem to user space). We really want to merge > added resources in this scenario where possible. > > Let's provide an interface to trigger merging of applicable child > resources. It will be, for example, used by virtio-mem to trigger > merging of system ram resources it added to its resource container, but > also by XEN and Hyper-V to trigger merging of system ram resources in > iomem_resource. > > Note: We really want to merge after the whole operation succeeded, not > directly when adding a resource to the resource tree (it would break > add_memory_resource() and require splitting resources again when the > operation failed - e.g., due to -ENOMEM). > > Cc: Andrew Morton > Cc: Michal Hocko > Cc: Dan Williams > Cc: Jason Gunthorpe > Cc: Kees Cook > Cc: Ard Biesheuvel > Cc: Thomas Gleixner > Cc: "K. Y. Srinivasan" > Cc: Haiyang Zhang > Cc: Stephen Hemminger > Cc: Wei Liu > Cc: Boris Ostrovsky > Cc: Juergen Gross > Cc: Stefano Stabellini > Cc: Roger Pau Monn=C3=A9 > Cc: Julien Grall > Cc: Pankaj Gupta > Cc: Baoquan He > Cc: Wei Yang > Signed-off-by: David Hildenbrand > --- > include/linux/ioport.h | 3 +++ > kernel/resource.c | 52 ++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 55 insertions(+) > > diff --git a/include/linux/ioport.h b/include/linux/ioport.h > index 52a91f5fa1a36..3bb0020cd6ddc 100644 > --- a/include/linux/ioport.h > +++ b/include/linux/ioport.h > @@ -251,6 +251,9 @@ extern void __release_region(struct resource *, resou= rce_size_t, > extern void release_mem_region_adjustable(struct resource *, resource_si= ze_t, > resource_size_t); > #endif > +#ifdef CONFIG_MEMORY_HOTPLUG > +extern void merge_system_ram_resources(struct resource *res); > +#endif > > /* Wrappers for managed devices */ > struct device; > diff --git a/kernel/resource.c b/kernel/resource.c > index 1dcef5d53d76e..b4e0963edadd2 100644 > --- a/kernel/resource.c > +++ b/kernel/resource.c > @@ -1360,6 +1360,58 @@ void release_mem_region_adjustable(struct resource= *parent, > } > #endif /* CONFIG_MEMORY_HOTREMOVE */ > > +#ifdef CONFIG_MEMORY_HOTPLUG > +static bool system_ram_resources_mergeable(struct resource *r1, > + struct resource *r2) > +{ > + return r1->flags =3D=3D r2->flags && r1->end + 1 =3D=3D r2->start= && > + r1->name =3D=3D r2->name && r1->desc =3D=3D r2->desc && > + !r1->child && !r2->child; > +} > + > +/* > + * merge_system_ram_resources - try to merge contiguous system ram resou= rces > + * @parent: parent resource descriptor > + * > + * This interface is intended for memory hotplug, whereby lots of contig= uous > + * system ram resources are added (e.g., via add_memory*()) by a driver,= and > + * the actual resource boundaries are not of interest (e.g., it might be > + * relevant for DIMMs). Only immediate child resources that are busy and > + * don't have any children are considered. All applicable child resource= s > + * must be immutable during the request. > + * > + * Note: > + * - The caller has to make sure that no pointers to resources that migh= t > + * get merged are held anymore. Callers should only trigger merging of= child > + * resources when they are the only one adding system ram resources to= the > + * parent (besides during boot). > + * - release_mem_region_adjustable() will split on demand on memory hotu= nplug > + */ > +void merge_system_ram_resources(struct resource *parent) > +{ > + const unsigned long flags =3D IORESOURCE_SYSTEM_RAM | IORESOURCE_= BUSY; > + struct resource *cur, *next; > + > + write_lock(&resource_lock); > + > + cur =3D parent->child; > + while (cur && cur->sibling) { > + next =3D cur->sibling; > + if ((cur->flags & flags) =3D=3D flags && Maybe this can be changed to: !(cur->flags & ~flags) > + system_ram_resources_mergeable(cur, next)) { > + cur->end =3D next->end; > + cur->sibling =3D next->sibling; > + free_resource(next); > + next =3D cur->sibling; > + } > + cur =3D next; > + } > + > + write_unlock(&resource_lock); > +} > +EXPORT_SYMBOL(merge_system_ram_resources); > +#endif /* CONFIG_MEMORY_HOTPLUG */ > + > /* > * Managed region resource > */ > -- > 2.26.2 >