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=-14.6 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, NICE_REPLY_A,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_SANE_1 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 F166CC10DAA for ; Wed, 9 Sep 2020 08:32:09 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 6AEAE21D7A for ; Wed, 9 Sep 2020 08:32:09 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="iODLecKz" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 6AEAE21D7A 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 C92646B006E; Wed, 9 Sep 2020 04:32:08 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id C43726B0071; Wed, 9 Sep 2020 04:32:08 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id ABB838E0001; Wed, 9 Sep 2020 04:32:08 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0112.hostedemail.com [216.40.44.112]) by kanga.kvack.org (Postfix) with ESMTP id 940606B006E for ; Wed, 9 Sep 2020 04:32:08 -0400 (EDT) Received: from smtpin12.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay02.hostedemail.com (Postfix) with ESMTP id 4AB2A3624 for ; Wed, 9 Sep 2020 08:32:08 +0000 (UTC) X-FDA: 77242855536.12.fifth73_2704315270dc Received: from filter.hostedemail.com (10.5.16.251.rfc1918.com [10.5.16.251]) by smtpin12.hostedemail.com (Postfix) with ESMTP id 1988118012605 for ; Wed, 9 Sep 2020 08:32:08 +0000 (UTC) X-HE-Tag: fifth73_2704315270dc X-Filterd-Recvd-Size: 15144 Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [207.211.31.120]) by imf35.hostedemail.com (Postfix) with ESMTP for ; Wed, 9 Sep 2020 08:32:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1599640326; 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: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:autocrypt:autocrypt; bh=hF3udUfJyZU7QXS3AkpxhoCOvsavCGXQzJ8qfLwCcV4=; b=iODLecKzIscIb4VkPqvopY9HRjqVhSn5uLpHDL7nAQpv1VN+M4D4+By0+SvdAGa3rJB7KY JerdmyOwyXMG9jW0ZwL8gvD/WeBPCARz0AMIy3rLuKoGxVm6X+UAI+jOOHgOlEeQsk8nuz +a5QmEA0Dp8rdvirD//+StdlKig+QFk= 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-183-N9-gdB6aOXaEPpTQ5zsiKA-1; Wed, 09 Sep 2020 04:32:04 -0400 X-MC-Unique: N9-gdB6aOXaEPpTQ5zsiKA-1 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 44D6218BA28C; Wed, 9 Sep 2020 08:32:03 +0000 (UTC) Received: from [10.36.113.90] (ovpn-113-90.ams2.redhat.com [10.36.113.90]) by smtp.corp.redhat.com (Postfix) with ESMTP id C68BA10013D0; Wed, 9 Sep 2020 08:32:00 +0000 (UTC) Subject: Re: [PATCH] mm: don't rely on system state to detect hot-plug operations To: Laurent Dufour , Greg Kroah-Hartman Cc: akpm@linux-foundation.org, salvador@suse.de, rafael@kernel.org, nathanl@linux.ibm.com, mhocko@kernel.org, cheloha@linux.ibm.com, stable@vger.kernel.org, Linux-MM References: <5cbd92e1-c00a-4253-0119-c872bfa0f2bc@redhat.com> <20200908170835.85440-1-ldufour@linux.ibm.com> <20200908173113.GB218801@kroah.com> <7390116a-bfa9-9ad2-70fa-01be68035b7e@linux.ibm.com> From: David Hildenbrand Autocrypt: addr=david@redhat.com; prefer-encrypt=mutual; keydata= mQINBFXLn5EBEAC+zYvAFJxCBY9Tr1xZgcESmxVNI/0ffzE/ZQOiHJl6mGkmA1R7/uUpiCjJ dBrn+lhhOYjjNefFQou6478faXE6o2AhmebqT4KiQoUQFV4R7y1KMEKoSyy8hQaK1umALTdL QZLQMzNE74ap+GDK0wnacPQFpcG1AE9RMq3aeErY5tujekBS32jfC/7AnH7I0v1v1TbbK3Gp XNeiN4QroO+5qaSr0ID2sz5jtBLRb15RMre27E1ImpaIv2Jw8NJgW0k/D1RyKCwaTsgRdwuK Kx/Y91XuSBdz0uOyU/S8kM1+ag0wvsGlpBVxRR/xw/E8M7TEwuCZQArqqTCmkG6HGcXFT0V9 PXFNNgV5jXMQRwU0O/ztJIQqsE5LsUomE//bLwzj9IVsaQpKDqW6TAPjcdBDPLHvriq7kGjt WhVhdl0qEYB8lkBEU7V2Yb+SYhmhpDrti9Fq1EsmhiHSkxJcGREoMK/63r9WLZYI3+4W2rAc UucZa4OT27U5ZISjNg3Ev0rxU5UH2/pT4wJCfxwocmqaRr6UYmrtZmND89X0KigoFD/XSeVv jwBRNjPAubK9/k5NoRrYqztM9W6sJqrH8+UWZ1Idd/DdmogJh0gNC0+N42Za9yBRURfIdKSb B3JfpUqcWwE7vUaYrHG1nw54pLUoPG6sAA7Mehl3nd4pZUALHwARAQABtCREYXZpZCBIaWxk ZW5icmFuZCA8ZGF2aWRAcmVkaGF0LmNvbT6JAlgEEwEIAEICGwMGCwkIBwMCBhUIAgkKCwQW AgMBAh4BAheAAhkBFiEEG9nKrXNcTDpGDfzKTd4Q9wD/g1oFAl8Ox4kFCRKpKXgACgkQTd4Q 9wD/g1oHcA//a6Tj7SBNjFNM1iNhWUo1lxAja0lpSodSnB2g4FCZ4R61SBR4l/psBL73xktp rDHrx4aSpwkRP6Epu6mLvhlfjmkRG4OynJ5HG1gfv7RJJfnUdUM1z5kdS8JBrOhMJS2c/gPf wv1TGRq2XdMPnfY2o0CxRqpcLkx4vBODvJGl2mQyJF/gPepdDfcT8/PY9BJ7FL6Hrq1gnAo4 3Iv9qV0JiT2wmZciNyYQhmA1V6dyTRiQ4YAc31zOo2IM+xisPzeSHgw3ONY/XhYvfZ9r7W1l pNQdc2G+o4Di9NPFHQQhDw3YTRR1opJaTlRDzxYxzU6ZnUUBghxt9cwUWTpfCktkMZiPSDGd KgQBjnweV2jw9UOTxjb4LXqDjmSNkjDdQUOU69jGMUXgihvo4zhYcMX8F5gWdRtMR7DzW/YE BgVcyxNkMIXoY1aYj6npHYiNQesQlqjU6azjbH70/SXKM5tNRplgW8TNprMDuntdvV9wNkFs 9TyM02V5aWxFfI42+aivc4KEw69SE9KXwC7FSf5wXzuTot97N9Phj/Z3+jx443jo2NR34XgF 89cct7wJMjOF7bBefo0fPPZQuIma0Zym71cP61OP/i11ahNye6HGKfxGCOcs5wW9kRQEk8P9 M/k2wt3mt/fCQnuP/mWutNPt95w9wSsUyATLmtNrwccz63W5Ag0EVcufkQEQAOfX3n0g0fZz Bgm/S2zF/kxQKCEKP8ID+Vz8sy2GpDvveBq4H2Y34XWsT1zLJdvqPI4af4ZSMxuerWjXbVWb T6d4odQIG0fKx4F8NccDqbgHeZRNajXeeJ3R7gAzvWvQNLz4piHrO/B4tf8svmRBL0ZB5P5A 2uhdwLU3NZuK22zpNn4is87BPWF8HhY0L5fafgDMOqnf4guJVJPYNPhUFzXUbPqOKOkL8ojk CXxkOFHAbjstSK5Ca3fKquY3rdX3DNo+EL7FvAiw1mUtS+5GeYE+RMnDCsVFm/C7kY8c2d0G NWkB9pJM5+mnIoFNxy7YBcldYATVeOHoY4LyaUWNnAvFYWp08dHWfZo9WCiJMuTfgtH9tc75 7QanMVdPt6fDK8UUXIBLQ2TWr/sQKE9xtFuEmoQGlE1l6bGaDnnMLcYu+Asp3kDT0w4zYGsx 5r6XQVRH4+5N6eHZiaeYtFOujp5n+pjBaQK7wUUjDilPQ5QMzIuCL4YjVoylWiBNknvQWBXS lQCWmavOT9sttGQXdPCC5ynI+1ymZC1ORZKANLnRAb0NH/UCzcsstw2TAkFnMEbo9Zu9w7Kv AxBQXWeXhJI9XQssfrf4Gusdqx8nPEpfOqCtbbwJMATbHyqLt7/oz/5deGuwxgb65pWIzufa N7eop7uh+6bezi+rugUI+w6DABEBAAGJAjwEGAEIACYCGwwWIQQb2cqtc1xMOkYN/MpN3hD3 AP+DWgUCXw7HsgUJEqkpoQAKCRBN3hD3AP+DWrrpD/4qS3dyVRxDcDHIlmguXjC1Q5tZTwNB boaBTPHSy/Nksu0eY7x6HfQJ3xajVH32Ms6t1trDQmPx2iP5+7iDsb7OKAb5eOS8h+BEBDeq 3ecsQDv0fFJOA9ag5O3LLNk+3x3q7e0uo06XMaY7UHS341ozXUUI7wC7iKfoUTv03iO9El5f XpNMx/YrIMduZ2+nd9Di7o5+KIwlb2mAB9sTNHdMrXesX8eBL6T9b+MZJk+mZuPxKNVfEQMQ a5SxUEADIPQTPNvBewdeI80yeOCrN+Zzwy/Mrx9EPeu59Y5vSJOx/z6OUImD/GhX7Xvkt3kq Er5KTrJz3++B6SH9pum9PuoE/k+nntJkNMmQpR4MCBaV/J9gIOPGodDKnjdng+mXliF3Ptu6 3oxc2RCyGzTlxyMwuc2U5Q7KtUNTdDe8T0uE+9b8BLMVQDDfJjqY0VVqSUwImzTDLX9S4g/8 kC4HRcclk8hpyhY2jKGluZO0awwTIMgVEzmTyBphDg/Gx7dZU1Xf8HFuE+UZ5UDHDTnwgv7E th6RC9+WrhDNspZ9fJjKWRbveQgUFCpe1sa77LAw+XFrKmBHXp9ZVIe90RMe2tRL06BGiRZr jPrnvUsUUsjRoRNJjKKA/REq+sAnhkNPPZ/NNMjaZ5b8Tovi8C0tmxiCHaQYqj7G2rgnT0kt WNyWQQ== Organization: Red Hat GmbH Message-ID: Date: Wed, 9 Sep 2020 10:31:59 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.11.0 MIME-Version: 1.0 In-Reply-To: <7390116a-bfa9-9ad2-70fa-01be68035b7e@linux.ibm.com> Content-Type: text/plain; charset=utf-8 Content-Language: en-US X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 X-Rspamd-Queue-Id: 1988118012605 X-Spamd-Result: default: False [0.00 / 100.00] X-Rspamd-Server: rspam02 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: On 09.09.20 10:26, Laurent Dufour wrote: > Le 08/09/2020 =C3=A0 19:40, David Hildenbrand a =C3=A9crit=C2=A0: >> On 08.09.20 19:31, Greg Kroah-Hartman wrote: >>> On Tue, Sep 08, 2020 at 07:08:35PM +0200, Laurent Dufour wrote: >>>> In register_mem_sect_under_node() the system_state=E2=80=99s value i= s checked to >>>> detect whether the operation the call is made during boot time or du= ring an >>>> hot-plug operation. Unfortunately, that check is wrong on some >>>> architecture, and may lead to sections being registered under multip= le >>>> nodes if node's memory ranges are interleaved. >>>> >>>> This can be seen on PowerPC LPAR after multiple memory hot-plug and >>>> hot-unplug operations are done. At the next reboot the node's memory= ranges >>>> can be interleaved and since the call to link_mem_sections() is made= in >>>> topology_init() while the system is in the SYSTEM_SCHEDULING state, = the >>>> node's id is not checked, and the sections registered multiple times= . In >>>> that case, the system is able to boot but later hot-plug operation m= ay lead >>>> to this panic because the node's links are correctly broken: >>>> >>>> ------------[ cut here ]------------ >>>> kernel BUG at /Users/laurent/src/linux-ppc/mm/memory_hotplug.c:1084! >>>> Oops: Exception in kernel mode, sig: 5 [#1] >>>> LE PAGE_SIZE=3D64K MMU=3DHash SMP NR_CPUS=3D2048 NUMA pSeries >>>> Modules linked in: rpadlpar_io rpaphp pseries_rng rng_core vmx_crypt= o gf128mul binfmt_misc ip_tables x_tables xfs libcrc32c crc32c_vpmsum aut= ofs4 >>>> CPU: 8 PID: 10256 Comm: drmgr Not tainted 5.9.0-rc1+ #25 >>>> NIP: c000000000403f34 LR: c000000000403f2c CTR: 0000000000000000 >>>> REGS: c0000004876e3660 TRAP: 0700 Not tainted (5.9.0-rc1+) >>>> MSR: 800000000282b033 CR: 240004= 48 XER: 20040000 >>>> CFAR: c000000000846d20 IRQMASK: 0 >>>> GPR00: c000000000403f2c c0000004876e38f0 c0000000012f6f00 ffffffffff= ffffef >>>> GPR04: 0000000000000227 c0000004805ae680 0000000000000000 0000000488= 6f0000 >>>> GPR08: 0000000000000226 0000000000000003 0000000000000002 ffffffffff= fffffd >>>> GPR12: 0000000088000484 c00000001ec96280 0000000000000000 0000000000= 000000 >>>> GPR16: 0000000000000000 0000000000000000 0000000000000004 0000000000= 000003 >>>> GPR20: c00000047814ffe0 c0000007ffff7c08 0000000000000010 c000000001= 3332c8 >>>> GPR24: 0000000000000000 c0000000011f6cc0 0000000000000000 0000000000= 000000 >>>> GPR28: ffffffffffffffef 0000000000000001 0000000150000000 0000000010= 000000 >>>> NIP [c000000000403f34] add_memory_resource+0x244/0x340 >>>> LR [c000000000403f2c] add_memory_resource+0x23c/0x340 >>>> Call Trace: >>>> [c0000004876e38f0] [c000000000403f2c] add_memory_resource+0x23c/0x34= 0 (unreliable) >>>> [c0000004876e39c0] [c00000000040408c] __add_memory+0x5c/0xf0 >>>> [c0000004876e39f0] [c0000000000e2b94] dlpar_add_lmb+0x1b4/0x500 >>>> [c0000004876e3ad0] [c0000000000e3888] dlpar_memory+0x1f8/0xb80 >>>> [c0000004876e3b60] [c0000000000dc0d0] handle_dlpar_errorlog+0xc0/0x1= 90 >>>> [c0000004876e3bd0] [c0000000000dc398] dlpar_store+0x198/0x4a0 >>>> [c0000004876e3c90] [c00000000072e630] kobj_attr_store+0x30/0x50 >>>> [c0000004876e3cb0] [c00000000051f954] sysfs_kf_write+0x64/0x90 >>>> [c0000004876e3cd0] [c00000000051ee40] kernfs_fop_write+0x1b0/0x290 >>>> [c0000004876e3d20] [c000000000438dd8] vfs_write+0xe8/0x290 >>>> [c0000004876e3d70] [c0000000004391ac] ksys_write+0xdc/0x130 >>>> [c0000004876e3dc0] [c000000000034e40] system_call_exception+0x160/0x= 270 >>>> [c0000004876e3e20] [c00000000000d740] system_call_common+0xf0/0x27c >>>> Instruction dump: >>>> 48442e35 60000000 0b030000 3cbe0001 7fa3eb78 7bc48402 38a5fffe 7ca5f= a14 >>>> 78a58402 48442db1 60000000 7c7c1b78 <0b030000> 7f23cb78 4bda371d 600= 00000 >>>> ---[ end trace 562fd6c109cd0fb2 ]--- >>>> >>>> This patch addresses the root cause by not relying on the system_sta= te >>>> value to detect whether the call is due to a hot-plug operation or n= ot. An >>>> additional parameter is added to link_mem_sections() to tell the con= text of >>>> the call and this parameter is propagated to register_mem_sect_under= _node() >>>> throuugh the walk_memory_blocks()'s call. >>>> >>>> Fixes: 4fbce633910e ("mm/memory_hotplug.c: make register_mem_sect_un= der_node() a callback of walk_memory_range()") >>>> Signed-off-by: Laurent Dufour >>>> Cc: stable@vger.kernel.org >>>> Cc: Greg Kroah-Hartman >>>> Cc: "Rafael J. Wysocki" >>>> Cc: Andrew Morton >>>> --- >>>> drivers/base/node.c | 20 +++++++++++++++----- >>>> include/linux/node.h | 6 +++--- >>>> mm/memory_hotplug.c | 3 ++- >>>> 3 files changed, 20 insertions(+), 9 deletions(-) >>>> >>>> diff --git a/drivers/base/node.c b/drivers/base/node.c >>>> index 508b80f6329b..27f828eeb531 100644 >>>> --- a/drivers/base/node.c >>>> +++ b/drivers/base/node.c >>>> @@ -762,14 +762,19 @@ static int __ref get_nid_for_pfn(unsigned long= pfn) >>>> } >>>> =20 >>>> /* register memory section under specified node if it spans that n= ode */ >>>> +struct rmsun_args { >>>> + int nid; >>>> + bool hotadd; >>>> +}; >>>> static int register_mem_sect_under_node(struct memory_block *mem_b= lk, >>>> - void *arg) >>>> + void *args) >>>> { >>>> unsigned long memory_block_pfns =3D memory_block_size_bytes() / P= AGE_SIZE; >>>> unsigned long start_pfn =3D section_nr_to_pfn(mem_blk->start_sect= ion_nr); >>>> unsigned long end_pfn =3D start_pfn + memory_block_pfns - 1; >>>> - int ret, nid =3D *(int *)arg; >>>> + int ret, nid =3D ((struct rmsun_args *)args)->nid; >>>> unsigned long pfn; >>>> + bool hotadd =3D ((struct rmsun_args *)args)->hotadd; >>>> =20 >>>> for (pfn =3D start_pfn; pfn <=3D end_pfn; pfn++) { >>>> int page_nid; >>>> @@ -789,7 +794,7 @@ static int register_mem_sect_under_node(struct m= emory_block *mem_blk, >>>> * case, during hotplug we know that all pages in the memory >>>> * block belong to the same node. >>>> */ >>>> - if (system_state =3D=3D SYSTEM_BOOTING) { >>>> + if (!hotadd) { >>>> page_nid =3D get_nid_for_pfn(pfn); >>>> if (page_nid < 0) >>>> continue; >>>> @@ -832,10 +837,15 @@ void unregister_memory_block_under_nodes(struc= t memory_block *mem_blk) >>>> kobject_name(&node_devices[mem_blk->nid]->dev.kobj)); >>>> } >>>> =20 >>>> -int link_mem_sections(int nid, unsigned long start_pfn, unsigned lo= ng end_pfn) >>>> +int link_mem_sections(int nid, unsigned long start_pfn, unsigned lo= ng end_pfn, >>>> + bool hotadd) >>>> { >>>> + struct rmsun_args args; >>>> + >>>> + args.nid =3D nid; >>>> + args.hotadd =3D hotadd; >>>> return walk_memory_blocks(PFN_PHYS(start_pfn), >>>> - PFN_PHYS(end_pfn - start_pfn), (void *)&nid, >>>> + PFN_PHYS(end_pfn - start_pfn), (void *)&args, >>>> register_mem_sect_under_node); >>>> } >>>> =20 >>>> diff --git a/include/linux/node.h b/include/linux/node.h >>>> index 4866f32a02d8..6df9a4548650 100644 >>>> --- a/include/linux/node.h >>>> +++ b/include/linux/node.h >>>> @@ -100,10 +100,10 @@ typedef void (*node_registration_func_t)(stru= ct node *); >>>> =20 >>>> #if defined(CONFIG_MEMORY_HOTPLUG_SPARSE) && defined(CONFIG_NUMA) >>>> extern int link_mem_sections(int nid, unsigned long start_pfn, >>>> - unsigned long end_pfn); >>>> + unsigned long end_pfn, bool hotadd); >>>> #else >>>> static inline int link_mem_sections(int nid, unsigned long start_p= fn, >>>> - unsigned long end_pfn) >>>> + unsigned long end_pfn, bool hotadd) >>> >>> Adding a random boolean flag to a function is a horrible way to do >>> anything. >>> >>> Now you need to look up what that flag means every time you run acros= s a >>> caller, breaking your reading of what is happening. >>> >>> Make this two different functions please, that describe what they do, >>> and have them call a common "helper function" that does the work with >>> the flag if you really want to do this type of thing. >>> >>> link_mem_sections() and link_mem_sections_hotadd()? >>> >>> But not this way, please no. >> >> For memmap_init_zone() we solved it via an enum with MEMMAP_HOTPLUG vs >> MEMMAP_EARLY. Maybe we can generalize, because it tries to tackle >> roughly the same thing. >=20 > Thanks Dacid, I like this idea. >=20 > However, I think I'll not reuse the memmap_context enum, but introduce = a new one=20 > specific to the link operation, to be more explicit, something like: >=20 > /* > * When a hotplug operation is done, all pages in the memory block bel= ong to the > * same node, so there is no need to do such a check in that case. > */ > enum linkmem_context { > LINKMEM_NO_CHECK_NODE_ID, > LINKMEM_CHECK_NODE_ID, > } >=20 > I'm bad at naming so feel free to argue. >=20 "context" does not really fit the two cases that rather tell you what to do (like a single flag). I would have renamed "enum memmap_context" to something like "enum mp_context" ("memory plug") and used MP_CONTEXT_EARLY / MP_CONTEXT_HOTPLUG Instead of using fairly specific "LINKMEM_*_CHECK_NODE_ID" ... I am, also bad at naming, so ... :) --=20 Thanks, David / dhildenb