Received: by 2002:a25:1506:0:0:0:0:0 with SMTP id 6csp349731ybv; Wed, 19 Feb 2020 23:06:01 -0800 (PST) X-Google-Smtp-Source: APXvYqw/ZiV0Q1Z9KG4fCs7X5UJ+NHcIXuIpNiGLCvv03vS9DWCRHIW0EKbcDQsUlc0V1dVJ92og X-Received: by 2002:a9d:7757:: with SMTP id t23mr23920839otl.315.1582182361273; Wed, 19 Feb 2020 23:06:01 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1582182361; cv=none; d=google.com; s=arc-20160816; b=YiNVkqzALVOwZCB2uxilwlYi+2uO7TueyNUfEOBKZ6gemfe59ntiNInk+oTAcbHBjt ifu6TC41use2QlLvZeL/s2Hqp8jZKygryifJ4+A1jSjYR/bDNnUsJ1dnWPHvAK9FZTi+ GVNvrodMEVd2CfVbSTR0h6r7hDgo2q8/nODFclgoBDQbVt8ncgoprDFDf9ya9sN1+r82 gLfaI2mRGv4V4S/A9izK2amHMwJuAdh/byuwZlySmKRtrasptns6ckoM1+KC26zIJ38G GZ1cwpulwE1j3C8wzghIqS5JpXsI0O0TQpfDhE0INORbAgH4I3k31DuJsHklNVhhWfsp 5TrQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date:dkim-signature; bh=x9la8FY0wFPFkKJ/BbMsC9Q5fV/uDtNl9dyibYDxM6U=; b=dRpVZJJZci7vpIJlthM7BGmUyVLfhNW2yjvr08PRq014NfVM/6V9RYXuucCcE976H6 uvG0hnbWkqE1+sCJfdCPsG2RQUR5ZIkAjFdkfiP6VK0RnJ52RZ+paRHEymSQTI97+E5H d8qw6XmQxerf+/9rlB6/8L0sQBKI6kL2nAkB9Mbf0VF9ZIxWHuV7+QJ+QBYwOR2Wdxgx JMyVXQiA+7okX6jaC63TpV6gfwF+eN13Z4zbiVJ+OMvz15LUoinDzWeAyrTP7UbfmR/R LHcqvvpaWkGdJtF0uDOHOY0yDv868M2qr4XDADNrkyo0XVIPsPHuEmgb9D0hgi4P785g qSWQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=a+pMHRCf; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id m19si10057644oig.91.2020.02.19.23.05.48; Wed, 19 Feb 2020 23:06:01 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=a+pMHRCf; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726637AbgBTHEe (ORCPT + 99 others); Thu, 20 Feb 2020 02:04:34 -0500 Received: from us-smtp-delivery-1.mimecast.com ([207.211.31.120]:56276 "EHLO us-smtp-1.mimecast.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726342AbgBTHEe (ORCPT ); Thu, 20 Feb 2020 02:04:34 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1582182272; 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: in-reply-to:in-reply-to:references:references; bh=x9la8FY0wFPFkKJ/BbMsC9Q5fV/uDtNl9dyibYDxM6U=; b=a+pMHRCf5BAkaVErDCjC/I8BQerJSScIhzCa5VAA+MalPxEKRQNCuHMBk/zB+wzpX+0MZD ugJIJcxdf7CEv/+yIvBtxJszc0FcPUr5/Q+KxIjO/Ib6HKJkbFAHGjzFehUekz3lzWYmQ6 5iGRKJLhsnVsKqHMzscwspz8iIg4eu0= 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-191-Wqfz3nBXMlyro59BFww8DA-1; Thu, 20 Feb 2020 02:04:28 -0500 X-MC-Unique: Wqfz3nBXMlyro59BFww8DA-1 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id C647A800D48; Thu, 20 Feb 2020 07:04:26 +0000 (UTC) Received: from localhost (ovpn-12-32.pek2.redhat.com [10.72.12.32]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 19BA78C060; Thu, 20 Feb 2020 07:04:22 +0000 (UTC) Date: Thu, 20 Feb 2020 15:04:20 +0800 From: Baoquan He To: Wei Yang Cc: linux-kernel@vger.kernel.org, linux-mm@kvack.org, akpm@linux-foundation.org, david@redhat.com, osalvador@suse.de, dan.j.williams@intel.com, mhocko@suse.com, rppt@linux.ibm.com, robin.murphy@arm.com Subject: Re: [PATCH v2 6/7] mm/sparse.c: move subsection_map related codes together Message-ID: <20200220070420.GD4937@MiWiFi-R3L-srv> References: <20200220043316.19668-1-bhe@redhat.com> <20200220043316.19668-7-bhe@redhat.com> <20200220061832.GE32521@richard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20200220061832.GE32521@richard> User-Agent: Mutt/1.10.1 (2018-07-13) X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 02/20/20 at 02:18pm, Wei Yang wrote: > On Thu, Feb 20, 2020 at 12:33:15PM +0800, Baoquan He wrote: > >No functional change. > > > > Those functions are introduced in your previous patches. > > Is it possible to define them close to each other at the very beginning? Thanks for reviewing. Do you mean to discard this patch and keep it as they are in the patch 4/7? If yes, it's fine to me to drop it as you suggested. To me, I prefer to put all subsection map handling codes together. > > >Signed-off-by: Baoquan He > >--- > > mm/sparse.c | 172 +++++++++++++++++++++++++--------------------------- > > 1 file changed, 84 insertions(+), 88 deletions(-) > > > >diff --git a/mm/sparse.c b/mm/sparse.c > >index 14bff0b44e7c..053d6c2e5c1f 100644 > >--- a/mm/sparse.c > >+++ b/mm/sparse.c > >@@ -244,10 +244,94 @@ void __init subsection_map_init(unsigned long pfn, unsigned long nr_pages) > > nr_pages -= pfns; > > } > > } > >+ > >+/** > >+ * clear_subsection_map - Clear subsection map of one memory region > >+ * > >+ * @pfn - start pfn of the memory range > >+ * @nr_pages - number of pfns to add in the region > >+ * > >+ * This is only intended for hotplug, and clear the related subsection > >+ * map inside one section. > >+ * > >+ * Return: > >+ * * -EINVAL - Section already deactived. > >+ * * 0 - Subsection map is emptied. > >+ * * 1 - Subsection map is not empty. > >+ */ > >+static int clear_subsection_map(unsigned long pfn, unsigned long nr_pages) > >+{ > >+ DECLARE_BITMAP(map, SUBSECTIONS_PER_SECTION) = { 0 }; > >+ DECLARE_BITMAP(tmp, SUBSECTIONS_PER_SECTION) = { 0 }; > >+ struct mem_section *ms = __pfn_to_section(pfn); > >+ unsigned long *subsection_map = ms->usage > >+ ? &ms->usage->subsection_map[0] : NULL; > >+ > >+ subsection_mask_set(map, pfn, nr_pages); > >+ if (subsection_map) > >+ bitmap_and(tmp, map, subsection_map, SUBSECTIONS_PER_SECTION); > >+ > >+ if (WARN(!subsection_map || !bitmap_equal(tmp, map, SUBSECTIONS_PER_SECTION), > >+ "section already deactivated (%#lx + %ld)\n", > >+ pfn, nr_pages)) > >+ return -EINVAL; > >+ > >+ bitmap_xor(subsection_map, map, subsection_map, SUBSECTIONS_PER_SECTION); > >+ > >+ if (bitmap_empty(subsection_map, SUBSECTIONS_PER_SECTION)) > >+ return 0; > >+ > >+ return 1; > >+} > >+ > >+/** > >+ * fill_subsection_map - fill subsection map of a memory region > >+ * @pfn - start pfn of the memory range > >+ * @nr_pages - number of pfns to add in the region > >+ * > >+ * This fills the related subsection map inside one section, and only > >+ * intended for hotplug. > >+ * > >+ * Return: > >+ * * 0 - On success. > >+ * * -EINVAL - Invalid memory region. > >+ * * -EEXIST - Subsection map has been set. > >+ */ > >+static int fill_subsection_map(unsigned long pfn, unsigned long nr_pages) > >+{ > >+ struct mem_section *ms = __pfn_to_section(pfn); > >+ DECLARE_BITMAP(map, SUBSECTIONS_PER_SECTION) = { 0 }; > >+ unsigned long *subsection_map; > >+ int rc = 0; > >+ > >+ subsection_mask_set(map, pfn, nr_pages); > >+ > >+ subsection_map = &ms->usage->subsection_map[0]; > >+ > >+ if (bitmap_empty(map, SUBSECTIONS_PER_SECTION)) > >+ rc = -EINVAL; > >+ else if (bitmap_intersects(map, subsection_map, SUBSECTIONS_PER_SECTION)) > >+ rc = -EEXIST; > >+ else > >+ bitmap_or(subsection_map, map, subsection_map, > >+ SUBSECTIONS_PER_SECTION); > >+ > >+ return rc; > >+} > > #else > > void __init subsection_map_init(unsigned long pfn, unsigned long nr_pages) > > { > > } > >+ > >+static int clear_subsection_map(unsigned long pfn, unsigned long nr_pages) > >+{ > >+ return 0; > >+} > >+ > >+static int fill_subsection_map(unsigned long pfn, unsigned long nr_pages) > >+{ > >+ return 0; > >+} > > #endif > > > > /* Record a memory area against a node. */ > >@@ -732,52 +816,6 @@ static void free_map_bootmem(struct page *memmap) > > } > > #endif /* CONFIG_SPARSEMEM_VMEMMAP */ > > > >-#ifdef CONFIG_SPARSEMEM_VMEMMAP > >-/** > >- * clear_subsection_map - Clear subsection map of one memory region > >- * > >- * @pfn - start pfn of the memory range > >- * @nr_pages - number of pfns to add in the region > >- * > >- * This is only intended for hotplug, and clear the related subsection > >- * map inside one section. > >- * > >- * Return: > >- * * -EINVAL - Section already deactived. > >- * * 0 - Subsection map is emptied. > >- * * 1 - Subsection map is not empty. > >- */ > >-static int clear_subsection_map(unsigned long pfn, unsigned long nr_pages) > >-{ > >- DECLARE_BITMAP(map, SUBSECTIONS_PER_SECTION) = { 0 }; > >- DECLARE_BITMAP(tmp, SUBSECTIONS_PER_SECTION) = { 0 }; > >- struct mem_section *ms = __pfn_to_section(pfn); > >- unsigned long *subsection_map = ms->usage > >- ? &ms->usage->subsection_map[0] : NULL; > >- > >- subsection_mask_set(map, pfn, nr_pages); > >- if (subsection_map) > >- bitmap_and(tmp, map, subsection_map, SUBSECTIONS_PER_SECTION); > >- > >- if (WARN(!subsection_map || !bitmap_equal(tmp, map, SUBSECTIONS_PER_SECTION), > >- "section already deactivated (%#lx + %ld)\n", > >- pfn, nr_pages)) > >- return -EINVAL; > >- > >- bitmap_xor(subsection_map, map, subsection_map, SUBSECTIONS_PER_SECTION); > >- > >- if (bitmap_empty(subsection_map, SUBSECTIONS_PER_SECTION)) > >- return 0; > >- > >- return 1; > >-} > >-#else > >-static int clear_subsection_map(unsigned long pfn, unsigned long nr_pages) > >-{ > >- return 0; > >-} > >-#endif > >- > > /* > > * To deactivate a memory region, there are 3 cases to handle across > > * two configurations (SPARSEMEM_VMEMMAP={y,n}): > >@@ -833,48 +871,6 @@ static void section_deactivate(unsigned long pfn, unsigned long nr_pages, > > ms->section_mem_map = (unsigned long)NULL; > > } > > > >-#ifdef CONFIG_SPARSEMEM_VMEMMAP > >-/** > >- * fill_subsection_map - fill subsection map of a memory region > >- * @pfn - start pfn of the memory range > >- * @nr_pages - number of pfns to add in the region > >- * > >- * This fills the related subsection map inside one section, and only > >- * intended for hotplug. > >- * > >- * Return: > >- * * 0 - On success. > >- * * -EINVAL - Invalid memory region. > >- * * -EEXIST - Subsection map has been set. > >- */ > >-static int fill_subsection_map(unsigned long pfn, unsigned long nr_pages) > >-{ > >- struct mem_section *ms = __pfn_to_section(pfn); > >- DECLARE_BITMAP(map, SUBSECTIONS_PER_SECTION) = { 0 }; > >- unsigned long *subsection_map; > >- int rc = 0; > >- > >- subsection_mask_set(map, pfn, nr_pages); > >- > >- subsection_map = &ms->usage->subsection_map[0]; > >- > >- if (bitmap_empty(map, SUBSECTIONS_PER_SECTION)) > >- rc = -EINVAL; > >- else if (bitmap_intersects(map, subsection_map, SUBSECTIONS_PER_SECTION)) > >- rc = -EEXIST; > >- else > >- bitmap_or(subsection_map, map, subsection_map, > >- SUBSECTIONS_PER_SECTION); > >- > >- return rc; > >-} > >-#else > >-static int fill_subsection_map(unsigned long pfn, unsigned long nr_pages) > >-{ > >- return 0; > >-} > >-#endif > >- > > static struct page * __meminit section_activate(int nid, unsigned long pfn, > > unsigned long nr_pages, struct vmem_altmap *altmap) > > { > >-- > >2.17.2 > > -- > Wei Yang > Help you, Help me >