From: Mike Snitzer <snitzer@redhat.com>
To: Mikulas Patocka <mpatocka@redhat.com>
Cc: dm-devel@redhat.com, "Alasdair G. Kergon" <agk@redhat.com>
Subject: Re: [PATCH 7/7] dm-snapshot: use bufio prefetch
Date: Mon, 13 Jan 2014 16:27:19 -0500 [thread overview]
Message-ID: <20140113212719.GB3268@redhat.com> (raw)
In-Reply-To: <alpine.LRH.2.02.1401111231420.4018@file01.intranet.prod.int.rdu2.redhat.com>
On Sat, Jan 11 2014 at 12:32pm -0500,
Mikulas Patocka <mpatocka@redhat.com> wrote:
> This patch modifies dm-snapshot so that it prefetches the buffers when
> loading the exceptions.
>
> The number of buffers read ahead is specified in the DM_PREFETCH_CHUNKS
> macro.
>
> Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
>
> ---
> drivers/md/dm-snap-persistent.c | 23 ++++++++++++++++++++++-
> 1 file changed, 22 insertions(+), 1 deletion(-)
>
> Index: linux-3.13-rc7/drivers/md/dm-snap-persistent.c
> ===================================================================
> --- linux-3.13-rc7.orig/drivers/md/dm-snap-persistent.c 2014-01-11 18:10:34.000000000 +0100
> +++ linux-3.13-rc7/drivers/md/dm-snap-persistent.c 2014-01-11 18:12:53.000000000 +0100
> @@ -18,6 +18,8 @@
> #define DM_MSG_PREFIX "persistent snapshot"
> #define DM_CHUNK_SIZE_DEFAULT_SECTORS 32 /* 16KB */
>
> +#define DM_PREFETCH_CHUNKS 12
> +
The patch header should speak to why 12 is adequate. Your 0th patch
header said we should do further testing to arrive at a good value. I
think a follow-on patch should make the 'prefetch_chunks' configurable.
The dm_exception_store structure has a 4 byte hole before the context
member. Making prefetch_chunks configurable (either from table load or
dm-snapshot module param) would help future-proof this code.
> /*-----------------------------------------------------------------
> * Persistent snapshots, by persistent we mean that the snapshot
> * will survive a reboot.
> @@ -496,6 +498,7 @@ static int read_exceptions(struct pstore
> {
> int r, full = 1;
> struct dm_bufio_client *client;
> + chunk_t prefetch_area = 0;
>
> client = dm_bufio_client_create(dm_snap_cow(ps->store->snap)->bdev,
> ps->store->chunk_size << SECTOR_SHIFT,
> @@ -504,6 +507,8 @@ static int read_exceptions(struct pstore
> if (IS_ERR(client))
> return PTR_ERR(client);
>
> + dm_bufio_set_minimum_buffers(client, DM_PREFETCH_CHUNKS + 1);
> +
> /*
> * Keeping reading chunks and inserting exceptions until
> * we find a partially full area.
> @@ -511,7 +516,23 @@ static int read_exceptions(struct pstore
> for (ps->current_area = 0; full; ps->current_area++) {
> struct dm_buffer *bp;
> void *area;
> - chunk_t chunk = area_location(ps, ps->current_area);
> + chunk_t chunk;
> +
> + if (unlikely(prefetch_area < ps->current_area))
> + prefetch_area = ps->current_area;
> +
> + if (DM_PREFETCH_CHUNKS) do {
> + chunk_t pf_chunk = area_location(ps, prefetch_area);
> + if (unlikely(pf_chunk >= dm_bufio_get_device_size(client)))
> + break;
> + if (unlikely(!dm_bufio_prefetch(client, pf_chunk, 1)))
> + break;
> + prefetch_area++;
> + if (unlikely(!prefetch_area))
> + break;
> + } while (prefetch_area <= ps->current_area + DM_PREFETCH_CHUNKS);
> +
> + chunk = area_location(ps, ps->current_area);
>
> area = dm_bufio_read(client, chunk, &bp);
> if (unlikely(IS_ERR(area))) {
>
I factored this code out to a bufio_prefetch_chunks() method, I'll share
it as v2 in reply to your original patch.
next prev parent reply other threads:[~2014-01-13 21:27 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-01-11 17:28 [PATCH 0/7] dm-snapshot prefetch patches Mikulas Patocka
2014-01-11 17:29 ` [PATCH 1/7] dm-bufio: return success or failure on prefetch Mikulas Patocka
2014-01-11 17:29 ` [PATCH 2/7] dm-bufio: introduce dm_bufio_forget Mikulas Patocka
2014-01-11 17:30 ` [PATCH 3/7] dm-bufio: introduce dm_bufio_set_minimum_buffers Mikulas Patocka
2014-01-11 17:30 ` [PATCH 4/7] dm-snapshot: use GFP_KERNEL when initializing the snapshot Mikulas Patocka
2014-01-11 17:30 ` [PATCH 5/7] dm-snapshot: make ps->area explicit Mikulas Patocka
2014-01-11 17:31 ` [PATCH 6/7] dm-snapshot: use dm-bufio Mikulas Patocka
2014-01-11 17:32 ` [PATCH 7/7] dm-snapshot: use bufio prefetch Mikulas Patocka
2014-01-13 21:27 ` Mike Snitzer [this message]
2014-01-13 22:03 ` Mikulas Patocka
2014-01-13 21:37 ` [PATCH v2 7/7] dm snapshot: " Mike Snitzer
2014-01-13 22:00 ` Mikulas Patocka
2014-01-13 22:56 ` Mike Snitzer
2014-01-13 23:45 ` Mikulas Patocka
2014-01-13 23:59 ` Mike Snitzer
2014-01-14 0:11 ` Mikulas Patocka
2014-01-13 21:21 ` [PATCH 1/7] dm-bufio: return success or failure on prefetch Mike Snitzer
2014-01-14 0:11 ` Mikulas Patocka
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=20140113212719.GB3268@redhat.com \
--to=snitzer@redhat.com \
--cc=agk@redhat.com \
--cc=dm-devel@redhat.com \
--cc=mpatocka@redhat.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.