From: Danilo Krummrich <dakr@kernel.org>
To: Michal Hocko <mhocko@suse.com>
Cc: cl@linux.com, penberg@kernel.org, rientjes@google.com,
iamjoonsoo.kim@lge.com, akpm@linux-foundation.org,
vbabka@suse.cz, roman.gushchin@linux.dev, 42.hyeyoo@gmail.com,
urezki@gmail.com, hch@infradead.org, kees@kernel.org,
ojeda@kernel.org, wedsonaf@gmail.com, mpe@ellerman.id.au,
chandan.babu@oracle.com, christian.koenig@amd.com,
maz@kernel.org, oliver.upton@linux.dev,
linux-kernel@vger.kernel.org, linux-mm@kvack.org,
rust-for-linux@vger.kernel.org
Subject: Re: [PATCH v2 2/2] mm: kvmalloc: align kvrealloc() with krealloc()
Date: Tue, 23 Jul 2024 15:33:32 +0200 [thread overview]
Message-ID: <Zp-xLOa7NFOt4r1V@pollux> (raw)
In-Reply-To: <Zp-eJ6QTsT0wrlS-@tiehlicka>
On Tue, Jul 23, 2024 at 02:12:23PM +0200, Michal Hocko wrote:
> On Tue 23-07-24 13:55:48, Danilo Krummrich wrote:
> > On Tue, Jul 23, 2024 at 12:55:45PM +0200, Michal Hocko wrote:
> > > On Tue 23-07-24 12:42:17, Danilo Krummrich wrote:
> > > > On Tue, Jul 23, 2024 at 09:50:13AM +0200, Michal Hocko wrote:
> > > > > On Mon 22-07-24 18:29:24, Danilo Krummrich wrote:
> > > [...]
> > > > > > Besides that, implementing kvrealloc() by making use of krealloc() and
> > > > > > vrealloc() provides oppertunities to grow (and shrink) allocations more
> > > > > > efficiently. For instance, vrealloc() can be optimized to allocate and
> > > > > > map additional pages to grow the allocation or unmap and free unused
> > > > > > pages to shrink the allocation.
> > > > >
> > > > > This seems like a change that is independent on the above and should be
> > > > > a patch on its own.
> > > >
> > > > The optimizations you mean? Yes, I intend to do this in a separate series. For
> > > > now, I put TODOs in vrealloc.
> > >
> > > No I mean, that the change of the signature and semantic should be done along with
> > > update to callers and the new implementation of the function itself
> > > should be done in its own patch.
> >
> > Sorry, it seems like you lost me a bit.
> >
> > There is one patch that implements vrealloc() and one patch that does the change
> > of krealloc()'s signature, semantics and the corresponding update to the
> > callers.
> >
> > Isn't that already what you ask for?
>
> No, because this second patch reimplements kvrealloc wo to use krealloc
> and vrealloc fallback. More clear now?
I'm very sorry, but no. The second patch just changes kvrealloc(), how do you
want to split it up?
> > > > > > + if (is_vmalloc_addr(p))
> > > > > > + return vrealloc_noprof(p, size, flags);
> > > > > > +
> > > > > > + n = krealloc_noprof(p, size, kmalloc_gfp_adjust(flags, size));
> > > > > > + if (!n) {
> > > > > > + /* We failed to krealloc(), fall back to kvmalloc(). */
> > > > > > + n = kvmalloc_noprof(size, flags);
> > > > >
> > > > > Why don't you simply use vrealloc_noprof here?
> > > >
> > > > We could do that, but we'd also need to do the same checks kvmalloc() does, i.e.
> > > >
> > > > /*
> > > > * It doesn't really make sense to fallback to vmalloc for sub page
> > > > * requests
> > > > */
> > > > if (ret || size <= PAGE_SIZE)
> > > > return ret;
> > >
> > > With the early !size && p check we wouldn't right?
> >
> > I think that's unrelated. Your proposed early check checks for size == 0 to free
> > and return early. Whereas this check bails out if we fail kmalloc() with
> > size <= PAGE_SIZE, because a subsequent vmalloc() wouldn't make a lot of sense.
>
> It seems we are not on the same page here. Here is what I would like
> kvrealloc to look like in the end:
>
> void *kvrealloc_noprof(const void *p, size_t size, gfp_t flags)
> {
> void *newp;
>
> if (!size && p) {
> kvfree(p);
> return NULL;
> }
>
> if (!is_vmalloc_addr(p))
> newp = krealloc_noprof(p, size, kmalloc_gfp_adjust(flags, size));
>
> if (newp)
> return newp;
>
> return vrealloc_noprof(p, size, flags);
> }
> EXPORT_SYMBOL(kvrealloc_noprof);
This looks weird. The fact that you're passing p to vrealloc_noprof() if
krealloc_noprof() fails, implies that vrealloc_noprof() must be able to deal
with pointers to kmalloc'd memory.
Also, you never migrate from kmalloc memory to vmalloc memory and never free p.
Given the above, do you mean to say that vrealloc_noprof() should do all that?
If so, I strongly disagree here. vrealloc() should only deal with vmalloc
memory.
>
> krealloc_noprof should be extended for the maximum allowed size
krealloc_noprof() already has a maximum allowed size.
> and so does vrealloc_noprof.
Probably, but I don't think this series is the correct scope for this change.
I'd offer to send a separate patch for this though.
> The implementation of the kvrealloc cannot get any
> easier and more straightforward AFAICS. See my point?
> --
> Michal Hocko
> SUSE Labs
>
next prev parent reply other threads:[~2024-07-23 13:33 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-07-22 16:29 [PATCH v2 0/2] Align kvrealloc() with krealloc() Danilo Krummrich
2024-07-22 16:29 ` [PATCH v2 1/2] mm: vmalloc: implement vrealloc() Danilo Krummrich
2024-07-26 14:37 ` Vlastimil Babka
2024-07-26 20:05 ` Danilo Krummrich
2024-07-29 19:08 ` Danilo Krummrich
2024-07-30 1:35 ` Danilo Krummrich
2024-07-30 12:15 ` Vlastimil Babka
2024-07-30 13:14 ` Danilo Krummrich
2024-07-30 13:58 ` Vlastimil Babka
2024-07-30 14:32 ` Danilo Krummrich
2024-09-02 1:36 ` Feng Tang
2024-09-02 7:04 ` Feng Tang
2024-09-02 8:56 ` Vlastimil Babka
2024-09-03 3:18 ` Feng Tang
2024-09-06 7:35 ` Feng Tang
2024-07-22 16:29 ` [PATCH v2 2/2] mm: kvmalloc: align kvrealloc() with krealloc() Danilo Krummrich
2024-07-23 1:43 ` Andrew Morton
2024-07-23 14:05 ` Danilo Krummrich
2024-07-23 7:50 ` Michal Hocko
2024-07-23 10:42 ` Danilo Krummrich
2024-07-23 10:55 ` Michal Hocko
2024-07-23 11:55 ` Danilo Krummrich
2024-07-23 12:12 ` Michal Hocko
2024-07-23 13:33 ` Danilo Krummrich [this message]
2024-07-23 18:53 ` Michal Hocko
2024-07-26 14:38 ` Vlastimil Babka
2024-07-23 18:54 ` [PATCH v2 0/2] Align " Michal Hocko
2024-07-23 18:56 ` Danilo Krummrich
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=Zp-xLOa7NFOt4r1V@pollux \
--to=dakr@kernel.org \
--cc=42.hyeyoo@gmail.com \
--cc=akpm@linux-foundation.org \
--cc=chandan.babu@oracle.com \
--cc=christian.koenig@amd.com \
--cc=cl@linux.com \
--cc=hch@infradead.org \
--cc=iamjoonsoo.kim@lge.com \
--cc=kees@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=maz@kernel.org \
--cc=mhocko@suse.com \
--cc=mpe@ellerman.id.au \
--cc=ojeda@kernel.org \
--cc=oliver.upton@linux.dev \
--cc=penberg@kernel.org \
--cc=rientjes@google.com \
--cc=roman.gushchin@linux.dev \
--cc=rust-for-linux@vger.kernel.org \
--cc=urezki@gmail.com \
--cc=vbabka@suse.cz \
--cc=wedsonaf@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).