LKML Archive on lore.kernel.org
help / color / mirror / Atom feed
From: Arun KS <arunks.linux@gmail.com>
To: Maciej Bielski <m.bielski@virtualopensystems.com>
Cc: Andrea Reale <ar@linux.vnet.ibm.com>,
	"linux-arm-kernel@lists.infradead.org" 
	<linux-arm-kernel@lists.infradead.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	linux-mm@kvack.org, arunks@qti.qualcomm.com,
	mark.rutland@arm.com, scott.branden@broadcom.com,
	will.deacon@arm.com, qiuxishi@huawei.com,
	Catalin Marinas <catalin.marinas@arm.com>,
	mhocko@suse.com, realean2@ie.ibm.com
Subject: Re: [PATCH v2 1/5] mm: memory_hotplug: Memory hotplug (add) support for arm64
Date: Sun, 26 Nov 2017 12:28:01 +0530	[thread overview]
Message-ID: <CAKZGPAMByPKcEmWf_QMm6k4WomH8ZJjjj3YNyBU617DZN1VwMQ@mail.gmail.com> (raw)
In-Reply-To: <20171124105308.GA10023@tpad>

On Fri, Nov 24, 2017 at 4:23 PM, Maciej Bielski
<m.bielski@virtualopensystems.com> wrote:
> On Fri, Nov 24, 2017 at 09:42:33AM +0000, Andrea Reale wrote:
>> Hi Arun,
>>
>>
>> On Fri 24 Nov 2017, 11:25, Arun KS wrote:
>> > On Thu, Nov 23, 2017 at 4:43 PM, Maciej Bielski
>> > <m.bielski@virtualopensystems.com> wrote:
>> >> [ ...]
>> > > Introduces memory hotplug functionality (hot-add) for arm64.
>> > > @@ -615,6 +616,44 @@ void __init paging_init(void)
>> > >                       SWAPPER_DIR_SIZE - PAGE_SIZE);
>> > >  }
>> > >
>> > > +#ifdef CONFIG_MEMORY_HOTPLUG
>> > > +
>> > > +/*
>> > > + * hotplug_paging() is used by memory hotplug to build new page tables
>> > > + * for hot added memory.
>> > > + */
>> > > +
>> > > +struct mem_range {
>> > > +       phys_addr_t base;
>> > > +       phys_addr_t size;
>> > > +};
>> > > +
>> > > +static int __hotplug_paging(void *data)
>> > > +{
>> > > +       int flags = 0;
>> > > +       struct mem_range *section = data;
>> > > +
>> > > +       if (debug_pagealloc_enabled())
>> > > +               flags = NO_BLOCK_MAPPINGS | NO_CONT_MAPPINGS;
>> > > +
>> > > +       __create_pgd_mapping(swapper_pg_dir, section->base,
>> > > +                       __phys_to_virt(section->base), section->size,
>> > > +                       PAGE_KERNEL, pgd_pgtable_alloc, flags);
>> >
>> > Hello Andrea,
>> >
>> > __hotplug_paging runs on stop_machine context.
>> > cpu stop callbacks must not sleep.
>> > https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/kernel/stop_machine.c?h=v4.14#n479
>> >
>> > __create_pgd_mapping uses pgd_pgtable_alloc. which does
>> > __get_free_page(PGALLOC_GFP)
>> > https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/arch/arm64/mm/mmu.c?h=v4.14#n342
>> >
>> > PGALLOC_GFP has GFP_KERNEL which inturn has __GFP_RECLAIM
>> >
>> > #define PGALLOC_GFP     (GFP_KERNEL | __GFP_NOTRACK | __GFP_ZERO)
>> > #define GFP_KERNEL      (__GFP_RECLAIM | __GFP_IO | __GFP_FS)
>> >
>> > Now, prepare_alloc_pages() called by __alloc_pages_nodemask checks for
>> >
>> > might_sleep_if(gfp_mask & __GFP_DIRECT_RECLAIM);
>> >
>> > https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/mm/page_alloc.c?h=v4.14#n4150
>> >
>> > and then BUG()
>>
>> Well spotted, thanks for reporting the problem. One possible solution
>> would be to revert back to building the updated page tables on a copy
>> pgdir (as it was done in v1 of this patchset) and then replacing swapper
>> atomically with stop_machine.
>>
>> Actually, I am not sure if stop_machine is strictly needed,
>> if we modify the swapper pgdir live: for example, in x86_64
>> kernel_physical_mapping_init, atomicity is ensured by spin-locking on
>> init_mm.page_table_lock.
>> https://elixir.free-electrons.com/linux/v4.14/source/arch/x86/mm/init_64.c#L684
>> I'll spend some time investigating whoever else could be working
>> concurrently on the swapper pgdir.
>>
>> Any suggestion or pointer is very welcome.
>
> Hi Andrea, Arun,
>
> Alternative approach could be implementing pgd_pgtable_alloc_nosleep() and
> pointing this to hotplug_paging(). Subsequently, it could use different flags,
> eg:
>
> #define PGALLOC_GFP_NORECLAIM   (__GFP_IO | __GFP_FS | __GFP_NOTRACK | __GFP_ZERO)

This solves the problem with __get_free_page.

But pgd_pgtable_alloc() ->  pgtable_page_ctor() -> ptlock_alloc() and
then kmem_cache_alloc(page_ptl_cachep, GFP_KERNEL)
Same BUG again.

Regards,
Arun

>
> Is this unefficient approach in any way?
> Do we like the fact that the memory-attaching thread can go to sleep?
>
> BR,
>
>>
>> Thanks,
>> Andrea
>>
>> > I was testing on 4.4 kernel, but cross checked with 4.14 as well.
>> >
>> > Regards,
>> > Arun
>> >
>> >
>> > > +
>> > > +       return 0;
>> > > +}
>> > > +
>> > > +inline void hotplug_paging(phys_addr_t start, phys_addr_t size)
>> > > +{
>> > > +       struct mem_range section = {
>> > > +               .base = start,
>> > > +               .size = size,
>> > > +       };
>> > > +
>> > > +       stop_machine(__hotplug_paging, &section, NULL);
>> > > +}
>> > > +#endif /* CONFIG_MEMORY_HOTPLUG */
>> > > +
>> > >  /*
>> > >   * Check whether a kernel address is valid (derived from arch/x86/).
>> > >   */
>> > > --
>> > > 2.7.4
>> > >
>> >
>>
>
> --
> Maciej Bielski

  reply	other threads:[~2017-11-26  6:58 UTC|newest]

Thread overview: 49+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-11-23 11:13 [PATCH v2 0/5] Memory hotplug support for arm64 - complete patchset v2 Andrea Reale
2017-11-23 11:13 ` [PATCH v2 1/5] mm: memory_hotplug: Memory hotplug (add) support for arm64 Maciej Bielski
2017-11-24  5:55   ` Arun KS
2017-11-24  9:42     ` Andrea Reale
2017-11-24 10:53       ` Maciej Bielski
2017-11-26  6:58         ` Arun KS [this message]
2017-11-27 15:19   ` Robin Murphy
2017-11-27 16:39     ` Maciej Bielski
2017-11-27 17:11       ` Andrea Reale
2017-11-23 11:14 ` [PATCH v2 2/5] mm: memory_hotplug: Remove assumption on memory state before hotremove Andrea Reale
2017-11-23 22:18   ` Rafael J. Wysocki
2017-11-24 14:39   ` Rafael J. Wysocki
2017-11-24 14:49     ` Andrea Reale
2017-11-24 15:43       ` Michal Hocko
2017-11-24 15:54         ` Andrea Reale
2017-11-24 18:17           ` Michal Hocko
2017-11-29  1:20             ` joeyli
2017-11-30  9:47               ` Michal Hocko
2017-11-27 15:20           ` Robin Murphy
2017-11-27 17:44             ` Andrea Reale
2017-11-29  0:49   ` joeyli
2017-11-29  1:52     ` joeyli
2017-12-04 11:28       ` Andrea Reale
2017-12-04 14:05         ` Rafael J. Wysocki
2017-11-23 11:14 ` [PATCH v2 3/5] mm: memory_hotplug: memblock to track partially removed vmemmap mem Andrea Reale
2017-11-27 15:20   ` Robin Murphy
2017-11-27 17:38     ` Andrea Reale
2017-11-30 14:51   ` Michal Hocko
2017-12-04 11:49     ` Andrea Reale
2017-12-04 12:32       ` Michal Hocko
2017-12-04 12:42         ` Andrea Reale
2017-12-04 12:48           ` Michal Hocko
2017-11-23 11:14 ` [PATCH v2 4/5] mm: memory_hotplug: Add memory hotremove probe device Andrea Reale
2017-11-24 10:35   ` zhong jiang
2017-11-24 10:44     ` Andrea Reale
2017-11-24 12:17       ` zhong jiang
2017-11-24 14:29         ` Andrea Reale
2017-12-04 17:50           ` Reza Arbab
2017-11-27 15:33   ` Robin Murphy
2017-11-27 17:14     ` Andrea Reale
2017-11-30 14:49   ` Michal Hocko
2017-12-04 11:51     ` Andrea Reale
2017-12-04 12:33       ` Michal Hocko
2017-12-04 12:44         ` Andrea Reale
2017-11-23 11:15 ` [PATCH v2 5/5] mm: memory-hotplug: Add memory hot remove support for arm64 Andrea Reale
2017-11-23 16:02 ` [PATCH v2 0/5] Memory hotplug support for arm64 - complete patchset v2 Michal Hocko
2017-11-23 17:33   ` Andrea Reale
2017-11-30 14:57     ` Michal Hocko
2017-12-04 11:34       ` Andrea Reale

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CAKZGPAMByPKcEmWf_QMm6k4WomH8ZJjjj3YNyBU617DZN1VwMQ@mail.gmail.com \
    --to=arunks.linux@gmail.com \
    --cc=ar@linux.vnet.ibm.com \
    --cc=arunks@qti.qualcomm.com \
    --cc=catalin.marinas@arm.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=m.bielski@virtualopensystems.com \
    --cc=mark.rutland@arm.com \
    --cc=mhocko@suse.com \
    --cc=qiuxishi@huawei.com \
    --cc=realean2@ie.ibm.com \
    --cc=scott.branden@broadcom.com \
    --cc=will.deacon@arm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).