From: "Edgecombe, Rick P" <rick.p.edgecombe@intel.com>
To: "npiggin@gmail.com" <npiggin@gmail.com>,
"linux-mm@kvack.org" <linux-mm@kvack.org>,
"akpm@linux-foundation.org" <akpm@linux-foundation.org>
Cc: "linuxppc-dev@lists.ozlabs.org" <linuxppc-dev@lists.ozlabs.org>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"linux-arch@vger.kernel.org" <linux-arch@vger.kernel.org>,
"lizefan@huawei.com" <lizefan@huawei.com>,
"Jonathan.Cameron@Huawei.com" <Jonathan.Cameron@Huawei.com>,
"christophe.leroy@csgroup.eu" <christophe.leroy@csgroup.eu>,
"hch@infradead.org" <hch@infradead.org>
Subject: Re: [PATCH v8 11/12] mm/vmalloc: Hugepage vmalloc mappings
Date: Mon, 30 Nov 2020 20:21:31 +0000 [thread overview]
Message-ID: <e9d3a50e1b18f9ea1cdfdc221bef75db19273417.camel@intel.com> (raw)
In-Reply-To: <20201128152559.999540-12-npiggin@gmail.com>
On Sun, 2020-11-29 at 01:25 +1000, Nicholas Piggin wrote:
> Support huge page vmalloc mappings. Config option
> HAVE_ARCH_HUGE_VMALLOC
> enables support on architectures that define HAVE_ARCH_HUGE_VMAP and
> supports PMD sized vmap mappings.
>
> vmalloc will attempt to allocate PMD-sized pages if allocating PMD
> size
> or larger, and fall back to small pages if that was unsuccessful.
>
> Allocations that do not use PAGE_KERNEL prot are not permitted to use
> huge pages, because not all callers expect this (e.g., module
> allocations vs strict module rwx).
Several architectures (x86, arm64, others?) allocate modules initially
with PAGE_KERNEL and so I think this test will not exclude module
allocations in those cases.
[snip]
> @@ -2400,6 +2453,7 @@ static inline void set_area_direct_map(const
> struct vm_struct *area,
> {
> int i;
>
> + /* HUGE_VMALLOC passes small pages to set_direct_map */
> for (i = 0; i < area->nr_pages; i++)
> if (page_address(area->pages[i]))
> set_direct_map(area->pages[i]);
> @@ -2433,11 +2487,12 @@ static void vm_remove_mappings(struct
> vm_struct *area, int deallocate_pages)
> * map. Find the start and end range of the direct mappings to
> make sure
> * the vm_unmap_aliases() flush includes the direct map.
> */
> - for (i = 0; i < area->nr_pages; i++) {
> + for (i = 0; i < area->nr_pages; i += 1U << area->page_order) {
> unsigned long addr = (unsigned long)page_address(area-
> >pages[i]);
> if (addr) {
> + unsigned long page_size = PAGE_SIZE << area-
> >page_order;
> start = min(addr, start);
> - end = max(addr + PAGE_SIZE, end);
> + end = max(addr + page_size, end);
> flush_dmap = 1;
> }
> }
The logic around this is a bit tangled. The reset of the direct map has
to succeed, but if the set_direct_map_() functions require a split they
could fail. For x86, set_memory_ro() calls on a vmalloc alias will
mirror the page size and permission on the direct map and so the direct
map will be broken to 4k pages if it's a RO vmalloc allocation.
But after this, module vmalloc()'s could have large pages which would
result in large RO pages on the direct map. Then it could possibly fail
when trying to reset a 4k page out of a large RO direct map mapping.
I think either module allocations need to be actually excluded from
having large pages (seems like you might have seen other issues as
well?), or another option could be to use the changes here:
https://lore.kernel.org/lkml/20201125092208.12544-4-rppt@kernel.org/
to reset the direct map for a large page range at a time for large
vmalloc pages.
next prev parent reply other threads:[~2020-11-30 20:21 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-11-28 15:25 [PATCH v8 00/12] huge vmalloc mappings Nicholas Piggin
2020-11-28 15:25 ` [PATCH v8 01/12] mm/vmalloc: fix vmalloc_to_page for huge vmap mappings Nicholas Piggin
2020-11-28 15:25 ` [PATCH v8 02/12] mm: apply_to_pte_range warn and fail if a large pte is encountered Nicholas Piggin
2020-11-28 15:25 ` [PATCH v8 03/12] mm/vmalloc: rename vmap_*_range vmap_pages_*_range Nicholas Piggin
2020-11-28 15:25 ` [PATCH v8 04/12] mm/ioremap: rename ioremap_*_range to vmap_*_range Nicholas Piggin
2020-11-28 15:25 ` [PATCH v8 05/12] mm: HUGE_VMAP arch support cleanup Nicholas Piggin
2020-12-01 14:21 ` Catalin Marinas
2020-11-28 15:25 ` [PATCH v8 06/12] powerpc: inline huge vmap supported functions Nicholas Piggin
2020-11-28 15:25 ` [PATCH v8 07/12] arm64: " Nicholas Piggin
2020-11-28 15:25 ` [PATCH v8 08/12] x86: " Nicholas Piggin
2020-11-28 15:25 ` [PATCH v8 09/12] mm: Move vmap_range from mm/ioremap.c to mm/vmalloc.c Nicholas Piggin
2020-11-28 15:25 ` [PATCH v8 10/12] mm/vmalloc: add vmap_range_noflush variant Nicholas Piggin
2020-11-28 15:25 ` [PATCH v8 11/12] mm/vmalloc: Hugepage vmalloc mappings Nicholas Piggin
2020-11-28 17:07 ` kernel test robot
2020-11-28 17:41 ` kernel test robot
2020-11-30 20:21 ` Edgecombe, Rick P [this message]
2020-11-30 21:42 ` Edgecombe, Rick P
2020-12-04 8:12 ` Nicholas Piggin
2020-12-04 18:33 ` Edgecombe, Rick P
2020-12-05 4:49 ` Nicholas Piggin
2020-11-28 15:25 ` [PATCH v8 12/12] powerpc/64s/radix: Enable huge " Nicholas Piggin
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=e9d3a50e1b18f9ea1cdfdc221bef75db19273417.camel@intel.com \
--to=rick.p.edgecombe@intel.com \
--cc=Jonathan.Cameron@Huawei.com \
--cc=akpm@linux-foundation.org \
--cc=christophe.leroy@csgroup.eu \
--cc=hch@infradead.org \
--cc=linux-arch@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=lizefan@huawei.com \
--cc=npiggin@gmail.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).