linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
From: David Hildenbrand <david@redhat.com>
To: "Matthew Wilcox (Oracle)" <willy@infradead.org>, linux-mm@kvack.org
Subject: Re: [PATCH 5/6] slab: Allocate frozen pages
Date: Tue, 31 May 2022 19:15:14 +0200	[thread overview]
Message-ID: <40d658da-6220-e05e-ba0b-d95c82f6bfb3@redhat.com> (raw)
In-Reply-To: <20220531150611.1303156-6-willy@infradead.org>

On 31.05.22 17:06, Matthew Wilcox (Oracle) wrote:
> Since slab does not use the page refcount, it can allocate and
> free frozen pages, saving one atomic operation per free.
> 
> Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
> ---
>  mm/slab.c | 23 +++++++++++------------
>  1 file changed, 11 insertions(+), 12 deletions(-)
> 
> diff --git a/mm/slab.c b/mm/slab.c
> index f8cd00f4ba13..c5c53ed304d1 100644
> --- a/mm/slab.c
> +++ b/mm/slab.c
> @@ -1355,23 +1355,23 @@ slab_out_of_memory(struct kmem_cache *cachep, gfp_t gfpflags, int nodeid)
>  static struct slab *kmem_getpages(struct kmem_cache *cachep, gfp_t flags,
>  								int nodeid)
>  {
> -	struct folio *folio;
> +	struct page *page;
>  	struct slab *slab;
>  
>  	flags |= cachep->allocflags;
>  
> -	folio = (struct folio *) __alloc_pages_node(nodeid, flags, cachep->gfporder);
> -	if (!folio) {
> +	page = __alloc_frozen_pages(flags, cachep->gfporder, nodeid, NULL);
> +	if (!page) {
>  		slab_out_of_memory(cachep, flags, nodeid);
>  		return NULL;
>  	}
>  
> -	slab = folio_slab(folio);
> +	__SetPageSlab(page);
> +	slab = (struct slab *)page;
>  
>  	account_slab(slab, cachep->gfporder, cachep, flags);
> -	__folio_set_slab(folio);
>  	/* Record if ALLOC_NO_WATERMARKS was set when allocating the slab */
> -	if (sk_memalloc_socks() && page_is_pfmemalloc(folio_page(folio, 0)))
> +	if (sk_memalloc_socks() && page_is_pfmemalloc(page))
>  		slab_set_pfmemalloc(slab);
>  
>  	return slab;
> @@ -1383,18 +1383,17 @@ static struct slab *kmem_getpages(struct kmem_cache *cachep, gfp_t flags,
>  static void kmem_freepages(struct kmem_cache *cachep, struct slab *slab)
>  {
>  	int order = cachep->gfporder;
> -	struct folio *folio = slab_folio(slab);
> +	struct page *page = (struct page *)slab;
>  
> -	BUG_ON(!folio_test_slab(folio));
>  	__slab_clear_pfmemalloc(slab);
> -	__folio_clear_slab(folio);
> -	page_mapcount_reset(folio_page(folio, 0));
> -	folio->mapping = NULL;
> +	__ClearPageSlab(page);
> +	page_mapcount_reset(page);
> +	page->mapping = NULL;
>  
>  	if (current->reclaim_state)
>  		current->reclaim_state->reclaimed_slab += 1 << order;
>  	unaccount_slab(slab, order, cachep);
> -	__free_pages(folio_page(folio, 0), order);
> +	free_frozen_pages(page, order);
>  }
>  
>  static void kmem_rcu_free(struct rcu_head *head)

I assume that implies that pages that are actually allocated *from* the
buddy now have a refcount == 0.

IIRC, page isolation code (e.g., !page_ref_count check in
has_unmovable_pages()) assumes that any page with a refcount of 0 is
essentially either already free (buddy) or is on its way of getting
freed (!buddy).

There might be other PFN walker code (like compaction) that makes
similar assumptions that hold for now.

-- 
Thanks,

David / dhildenb



  reply	other threads:[~2022-05-31 17:15 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-05-31 15:06 [PATCH 0/6] Allocate and free frozen pages Matthew Wilcox (Oracle)
2022-05-31 15:06 ` [PATCH 1/6] mm/page_alloc: Remove zone parameter from free_one_page() Matthew Wilcox (Oracle)
2022-05-31 16:59   ` David Hildenbrand
2022-06-01  6:53   ` Miaohe Lin
2022-05-31 15:06 ` [PATCH 2/6] mm/page_alloc: Rename free_the_page() to free_frozen_pages() Matthew Wilcox (Oracle)
2022-05-31 17:02   ` David Hildenbrand
2022-06-01  6:58   ` Miaohe Lin
2022-06-01 12:23     ` Matthew Wilcox
2022-06-02  7:45       ` Miaohe Lin
2022-05-31 15:06 ` [PATCH 3/6] mm/page_alloc: Export free_frozen_pages() instead of free_unref_page() Matthew Wilcox (Oracle)
2022-05-31 17:09   ` David Hildenbrand
2022-05-31 17:11     ` Matthew Wilcox
2022-05-31 15:06 ` [PATCH 4/6] mm/page_alloc: Add alloc_frozen_pages() Matthew Wilcox (Oracle)
2022-05-31 15:06 ` [PATCH 5/6] slab: Allocate frozen pages Matthew Wilcox (Oracle)
2022-05-31 17:15   ` David Hildenbrand [this message]
2022-05-31 17:33     ` Matthew Wilcox
2022-06-01 12:14       ` David Hildenbrand
2022-08-09 10:37         ` Vlastimil Babka (SUSE)
2022-05-31 15:06 ` [PATCH 6/6] slub: " Matthew Wilcox (Oracle)
2022-06-01  3:31 ` [PATCH 0/6] Allocate and free " William Kucharski

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=40d658da-6220-e05e-ba0b-d95c82f6bfb3@redhat.com \
    --to=david@redhat.com \
    --cc=linux-mm@kvack.org \
    --cc=willy@infradead.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).