From: Mikulas Patocka <mpatocka@redhat.com>
To: Dongsheng Yang <dongsheng.yang@linux.dev>
Cc: agk@redhat.com, snitzer@kernel.org, axboe@kernel.dk, hch@lst.de,
dan.j.williams@intel.com, Jonathan.Cameron@Huawei.com,
linux-block@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-cxl@vger.kernel.org, nvdimm@lists.linux.dev,
dm-devel@lists.linux.dev
Subject: Re: [PATCH v2 00/11] dm-pcache – persistent-memory cache for block devices
Date: Mon, 14 Jul 2025 17:43:42 +0200 (CEST) [thread overview]
Message-ID: <1ff2da54-60dd-9719-eb55-386ff32ae421@redhat.com> (raw)
In-Reply-To: <e50ef45e-4c1a-4874-8d5f-9ca86f9a532c@linux.dev>
[-- Attachment #1: Type: text/plain, Size: 3709 bytes --]
On Wed, 9 Jul 2025, Dongsheng Yang wrote:
>
> 在 7/8/2025 4:16 AM, Mikulas Patocka 写道:
> >
> > On Mon, 7 Jul 2025, Dongsheng Yang wrote:
> >
> > > Hi Mikulas,
> > > This is V2 for dm-pcache, please take a look.
> > >
> > > Code:
> > > https://github.com/DataTravelGuide/linux tags/pcache_v2
> > >
> > > Changelogs
> > >
> > > V2 from V1:
> > > - introduce req_alloc() and req_init() in backing_dev.c, then we
> > > can do req_alloc() before holding spinlock and do req_init()
> > > in subtree_walk().
> > > - introduce pre_alloc_key and pre_alloc_req in walk_ctx, that
> > > means we can pre-allocate cache_key or backing_dev_request
> > > before subtree walking.
> > > - use mempool_alloc() with NOIO for the allocation of cache_key
> > > and backing_dev_req.
> > > - some coding style changes from comments of Jonathan.
> > Hi
> >
> > mempool_alloc with GFP_NOIO never fails - so you don't have to check the
> > returned value for NULL and propagate the error upwards.
>
>
> Hi Mikulas:
>
> I noticed that the implementation of mempool_alloc—it waits for 5 seconds
> and retries when allocation fails.
No, this is incorrect observation.
mempool_alloc will add the current process to a wait queue:
prepare_to_wait(&pool->wait, &wait, TASK_UNINTERRUPTIBLE);
then, it will execute the wait:
io_schedule_timeout(5*HZ);
and then remove the current process from a wait queue:
finish_wait(&pool->wait, &wait);
but the io_schedule_timeout function will wait at most 5 seconds - it
doesn't wait exactly 5 seconds. If some other piece of code frees some
data into the mempool, it executes:
wake_up(&pool->wait);
so that the process that is waiting in io_schedule_timeout(5*HZ) is woken
up immediatelly.
See this comment in mempool_alloc:
/*
* FIXME: this should be io_schedule(). The timeout is there as a
* workaround for some DM problems in 2.6.18.
*/
io_schedule_timeout(5*HZ);
- the timeout is actually a workaround for some buggy code in device
mapper where the code allocated more and more entries from the mempool
without freeing them. I fixed this bug many years ago. But people
shouldn't add more buggy code that depends on this timeout.
> With this in mind, I propose that we handle -ENOMEM inside defer_req() using a
> similar mechanism. something like this commit:
>
>
> https://github.com/DataTravelGuide/linux/commit/e6fc2e5012b1fe2312ed7dd02d6fbc2d038962c0
>
>
> Here are two key reasons why:
>
> (1) If we manage -ENOMEM in defer_req(), we don’t need to modify every
> lower-level allocation to use mempool to avoid failures—for example,
>
> cache_key, backing_req, and the kmem.bvecs you mentioned. More importantly,
> there’s no easy way to prevent allocation failure in some places—for instance,
> bio_init_clone() could still return -ENOMEM.
>
> (2) If we use a mempool, it will block and wait indefinitely when memory is
> unavailable, preventing the process from exiting.
Mempool will wait until some other code frees some data into the mempool.
So, as long as your code can make forward progress and finish some
requests and free their data into the mempool, it should work properly.
On the other hand, non-mempool GFP_NOIO allocations can wait indefinitely.
> But with defer_req(), the user can still manually stop the pcache device using
> dmsetup remove, releasing some memory if user want.
>
> What do you think?
I think that you should go back to version 2 (that had mempools) and
change the non-mempool allocation "backing_req->kmem.bvecs =
kmalloc_array(n_vecs, sizeof(struct bio_vec), GFP_NOIO);" to use a
mempool.
> Thanx
>
> Dongsheng
Mikulas
prev parent reply other threads:[~2025-07-14 15:44 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-07-07 6:57 Dongsheng Yang
2025-07-07 6:57 ` [PATCH v2 01/11] dm-pcache: add pcache_internal.h Dongsheng Yang
2025-07-07 6:58 ` [PATCH v2 02/11] dm-pcache: add backing device management Dongsheng Yang
2025-07-07 6:58 ` [PATCH v2 03/11] dm-pcache: add cache device Dongsheng Yang
2025-07-07 6:58 ` [PATCH v2 04/11] dm-pcache: add segment layer Dongsheng Yang
2025-07-07 6:58 ` [PATCH v2 05/11] dm-pcache: add cache_segment Dongsheng Yang
2025-07-07 6:58 ` [PATCH v2 06/11] dm-pcache: add cache_writeback Dongsheng Yang
2025-07-07 6:58 ` [PATCH v2 07/11] dm-pcache: add cache_gc Dongsheng Yang
2025-07-07 6:58 ` [PATCH v2 08/11] dm-pcache: add cache_key Dongsheng Yang
2025-07-07 6:58 ` [PATCH v2 09/11] dm-pcache: add cache_req Dongsheng Yang
2025-07-07 6:58 ` [PATCH v2 10/11] dm-pcache: add cache core Dongsheng Yang
2025-07-07 6:58 ` [PATCH v2 11/11] dm-pcache: initial dm-pcache target Dongsheng Yang
2025-07-07 20:16 ` [PATCH v2 00/11] dm-pcache – persistent-memory cache for block devices Mikulas Patocka
2025-07-07 20:17 ` Mikulas Patocka
2025-07-07 20:17 ` Mikulas Patocka
2025-07-09 9:45 ` Dongsheng Yang
2025-07-10 10:59 ` Dongsheng Yang
2025-07-14 15:43 ` Mikulas Patocka [this message]
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=1ff2da54-60dd-9719-eb55-386ff32ae421@redhat.com \
--to=mpatocka@redhat.com \
--cc=Jonathan.Cameron@Huawei.com \
--cc=agk@redhat.com \
--cc=axboe@kernel.dk \
--cc=dan.j.williams@intel.com \
--cc=dm-devel@lists.linux.dev \
--cc=dongsheng.yang@linux.dev \
--cc=hch@lst.de \
--cc=linux-block@vger.kernel.org \
--cc=linux-cxl@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=nvdimm@lists.linux.dev \
--cc=snitzer@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
all inboxes | Powered by JetHome®