From: Oscar Salvador <osalvador@suse.de>
To: Muchun Song <songmuchun@bytedance.com>
Cc: corbet@lwn.net, mike.kravetz@oracle.com, tglx@linutronix.de,
mingo@redhat.com, bp@alien8.de, x86@kernel.org, hpa@zytor.com,
dave.hansen@linux.intel.com, luto@kernel.org,
peterz@infradead.org, viro@zeniv.linux.org.uk,
akpm@linux-foundation.org, paulmck@kernel.org,
mchehab+huawei@kernel.org, pawan.kumar.gupta@linux.intel.com,
rdunlap@infradead.org, oneukum@suse.com,
anshuman.khandual@arm.com, jroedel@suse.de,
almasrymina@google.com, rientjes@google.com, willy@infradead.org,
mhocko@suse.com, duanxiongchun@bytedance.com,
linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-mm@kvack.org, linux-fsdevel@vger.kernel.org
Subject: Re: [PATCH v3 09/21] mm/hugetlb: Free the vmemmap pages associated with each hugetlb page
Date: Mon, 9 Nov 2020 19:51:38 +0100 [thread overview]
Message-ID: <20201109185138.GD17356@linux> (raw)
In-Reply-To: <20201108141113.65450-10-songmuchun@bytedance.com>
On Sun, Nov 08, 2020 at 10:11:01PM +0800, Muchun Song wrote:
> +static inline int freed_vmemmap_hpage(struct page *page)
> +{
> + return atomic_read(&page->_mapcount) + 1;
> +}
> +
> +static inline int freed_vmemmap_hpage_inc(struct page *page)
> +{
> + return atomic_inc_return_relaxed(&page->_mapcount) + 1;
> +}
> +
> +static inline int freed_vmemmap_hpage_dec(struct page *page)
> +{
> + return atomic_dec_return_relaxed(&page->_mapcount) + 1;
> +}
Are these relaxed any different that the normal ones on x86_64?
I got confused following the macros.
> +static void __free_huge_page_pte_vmemmap(struct page *reuse, pte_t *ptep,
> + unsigned long start,
> + unsigned int nr_free,
> + struct list_head *free_pages)
> +{
> + /* Make the tail pages are mapped read-only. */
> + pgprot_t pgprot = PAGE_KERNEL_RO;
> + pte_t entry = mk_pte(reuse, pgprot);
> + unsigned long addr;
> + unsigned long end = start + (nr_free << PAGE_SHIFT);
See below.
> +static void __free_huge_page_pmd_vmemmap(struct hstate *h, pmd_t *pmd,
> + unsigned long addr,
> + struct list_head *free_pages)
> +{
> + unsigned long next;
> + unsigned long start = addr + RESERVE_VMEMMAP_NR * PAGE_SIZE;
> + unsigned long end = addr + vmemmap_pages_size_per_hpage(h);
> + struct page *reuse = NULL;
> +
> + addr = start;
> + do {
> + unsigned int nr_pages;
> + pte_t *ptep;
> +
> + ptep = pte_offset_kernel(pmd, addr);
> + if (!reuse)
> + reuse = pte_page(ptep[-1]);
Can we define a proper name for that instead of -1?
e.g: TAIL_PAGE_REUSE or something like that.
> +
> + next = vmemmap_hpage_addr_end(addr, end);
> + nr_pages = (next - addr) >> PAGE_SHIFT;
> + __free_huge_page_pte_vmemmap(reuse, ptep, addr, nr_pages,
> + free_pages);
Why not passing next instead of nr_pages? I think it makes more sense.
As a bonus we can kill the variable.
> +static void split_vmemmap_huge_page(struct hstate *h, struct page *head,
> + pmd_t *pmd)
> +{
> + pgtable_t pgtable;
> + unsigned long start = (unsigned long)head & VMEMMAP_HPAGE_MASK;
> + unsigned long addr = start;
> + unsigned int nr = pgtable_pages_to_prealloc_per_hpage(h);
> +
> + while (nr-- && (pgtable = vmemmap_pgtable_withdraw(head))) {
The same with previous patches, I would scrap "nr" and its use.
> + VM_BUG_ON(freed_vmemmap_hpage(pgtable));
I guess here we want to check whether we already call free_huge_page_vmemmap
on this range?
For this to have happened, the locking should have failed, right?
> +static void free_huge_page_vmemmap(struct hstate *h, struct page *head)
> +{
> + pmd_t *pmd;
> + spinlock_t *ptl;
> + LIST_HEAD(free_pages);
> +
> + if (!free_vmemmap_pages_per_hpage(h))
> + return;
> +
> + pmd = vmemmap_to_pmd(head);
> + ptl = vmemmap_pmd_lock(pmd);
> + if (vmemmap_pmd_huge(pmd)) {
> + VM_BUG_ON(!pgtable_pages_to_prealloc_per_hpage(h));
I think that checking for free_vmemmap_pages_per_hpage is enough.
In the end, pgtable_pages_to_prealloc_per_hpage uses free_vmemmap_pages_per_hpage.
--
Oscar Salvador
SUSE L3
next prev parent reply other threads:[~2020-11-09 18:51 UTC|newest]
Thread overview: 54+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-11-08 14:10 [PATCH v3 00/21] Free some vmemmap pages of hugetlb page Muchun Song
2020-11-08 14:10 ` [PATCH v3 01/21] mm/memory_hotplug: Move bootmem info registration API to bootmem_info.c Muchun Song
2020-11-08 14:10 ` [PATCH v3 02/21] mm/memory_hotplug: Move {get,put}_page_bootmem() " Muchun Song
2020-11-08 14:10 ` [PATCH v3 03/21] mm/hugetlb: Introduce a new config HUGETLB_PAGE_FREE_VMEMMAP Muchun Song
2020-11-09 13:52 ` Oscar Salvador
2020-11-09 14:20 ` [External] " Muchun Song
2020-11-10 19:31 ` Mike Kravetz
2020-11-10 19:50 ` Matthew Wilcox
2020-11-10 20:30 ` Mike Kravetz
2020-11-17 15:35 ` [External] " Muchun Song
2020-11-11 3:28 ` Muchun Song
2020-11-08 14:10 ` [PATCH v3 04/21] mm/hugetlb: Introduce nr_free_vmemmap_pages in the struct hstate Muchun Song
2020-11-09 16:48 ` Oscar Salvador
2020-11-10 2:42 ` [External] " Muchun Song
2020-11-10 19:38 ` Mike Kravetz
2020-11-11 3:22 ` Muchun Song
2020-11-08 14:10 ` [PATCH v3 05/21] mm/hugetlb: Introduce pgtable allocation/freeing helpers Muchun Song
2020-11-09 17:21 ` Oscar Salvador
2020-11-10 3:49 ` [External] " Muchun Song
2020-11-10 5:42 ` Oscar Salvador
2020-11-10 6:08 ` Muchun Song
2020-11-10 6:33 ` Oscar Salvador
2020-11-10 7:10 ` Muchun Song
2020-11-11 0:47 ` Mike Kravetz
2020-11-11 3:41 ` [External] " Muchun Song
2020-11-13 0:35 ` Mike Kravetz
2020-11-13 1:02 ` Mike Kravetz
2020-11-13 4:18 ` Muchun Song
2020-11-08 14:10 ` [PATCH v3 06/21] mm/bootmem_info: Introduce {free,prepare}_vmemmap_page() Muchun Song
2020-11-08 14:10 ` [PATCH v3 07/21] mm/bootmem_info: Combine bootmem info and type into page->freelist Muchun Song
2020-11-08 14:11 ` [PATCH v3 08/21] mm/vmemmap: Initialize page table lock for vmemmap Muchun Song
2020-11-09 18:11 ` Oscar Salvador
2020-11-10 5:17 ` [External] " Muchun Song
2020-11-08 14:11 ` [PATCH v3 09/21] mm/hugetlb: Free the vmemmap pages associated with each hugetlb page Muchun Song
2020-11-09 18:51 ` Oscar Salvador [this message]
2020-11-10 6:40 ` [External] " Muchun Song
2020-11-10 9:48 ` Oscar Salvador
2020-11-10 10:47 ` Muchun Song
2020-11-10 13:52 ` Oscar Salvador
2020-11-10 14:00 ` Muchun Song
2020-11-08 14:11 ` [PATCH v3 10/21] mm/hugetlb: Defer freeing of hugetlb pages Muchun Song
2020-11-08 14:11 ` [PATCH v3 11/21] mm/hugetlb: Allocate the vmemmap pages associated with each hugetlb page Muchun Song
2020-11-08 14:11 ` [PATCH v3 12/21] mm/hugetlb: Introduce remap_huge_page_pmd_vmemmap helper Muchun Song
2020-11-08 14:11 ` [PATCH v3 13/21] mm/hugetlb: Use PG_slab to indicate split pmd Muchun Song
2020-11-08 14:11 ` [PATCH v3 14/21] mm/hugetlb: Support freeing vmemmap pages of gigantic page Muchun Song
2020-11-08 14:11 ` [PATCH v3 15/21] mm/hugetlb: Add a BUILD_BUG_ON to check if struct page size is a power of two Muchun Song
2020-11-08 14:11 ` [PATCH v3 16/21] mm/hugetlb: Set the PageHWPoison to the raw error page Muchun Song
2020-11-08 14:11 ` [PATCH v3 17/21] mm/hugetlb: Flush work when dissolving hugetlb page Muchun Song
2020-11-08 14:11 ` [PATCH v3 18/21] mm/hugetlb: Add a kernel parameter hugetlb_free_vmemmap Muchun Song
2020-11-08 14:11 ` [PATCH v3 19/21] mm/hugetlb: Merge pte to huge pmd only for gigantic page Muchun Song
2020-11-08 14:11 ` [PATCH v3 20/21] mm/hugetlb: Gather discrete indexes of tail page Muchun Song
2020-11-08 14:11 ` [PATCH v3 21/21] mm/hugetlb: Add BUILD_BUG_ON to catch invalid usage of tail struct page Muchun Song
2020-11-10 19:23 ` [PATCH v3 00/21] Free some vmemmap pages of hugetlb page Mike Kravetz
2020-11-11 3:21 ` [External] " Muchun Song
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=20201109185138.GD17356@linux \
--to=osalvador@suse.de \
--cc=akpm@linux-foundation.org \
--cc=almasrymina@google.com \
--cc=anshuman.khandual@arm.com \
--cc=bp@alien8.de \
--cc=corbet@lwn.net \
--cc=dave.hansen@linux.intel.com \
--cc=duanxiongchun@bytedance.com \
--cc=hpa@zytor.com \
--cc=jroedel@suse.de \
--cc=linux-doc@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=luto@kernel.org \
--cc=mchehab+huawei@kernel.org \
--cc=mhocko@suse.com \
--cc=mike.kravetz@oracle.com \
--cc=mingo@redhat.com \
--cc=oneukum@suse.com \
--cc=paulmck@kernel.org \
--cc=pawan.kumar.gupta@linux.intel.com \
--cc=peterz@infradead.org \
--cc=rdunlap@infradead.org \
--cc=rientjes@google.com \
--cc=songmuchun@bytedance.com \
--cc=tglx@linutronix.de \
--cc=viro@zeniv.linux.org.uk \
--cc=willy@infradead.org \
--cc=x86@kernel.org \
/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).