From: Edward Shishkin <edward.shishkin@gmail.com>
To: Ivan Shapovalov <intelfx100@gmail.com>
Cc: reiserfs-devel@vger.kernel.org
Subject: Re: reiser4: discard implementation, part 2: FITRIM ioctl aka batch mode
Date: Mon, 30 Jun 2014 14:19:33 +0200 [thread overview]
Message-ID: <53B155D5.4070700@gmail.com> (raw)
In-Reply-To: <1706370.uJ3CLsN3j1@intelfx-laptop>
Hi Ivan,
I think that everything should be quite simple.
Let the FITRIM ioctl spawn a process, which scans all the bitmap blocks
and puts the free-space-extents to the deferred delete_set. At the same
time, we mark them as "busy" in the WORKING bitmap to make sure that
nobody will touch them (the post_commit_hook will make them clean
again). Basically, that's all: our transaction manager and the discard
code will do all the other work :)
Details
First, the trim process reads up a bitmap node and puts it to the
transaction (see try_capture() and friends). Then we go from left to
right in the region of blocks covered by the bitmap node and handle
the "free extents". In every such iteration we lock the bitmap node,
locate the free extent, mark it dirty in the WORKING bitmap, put the
respective entry to the deferred delete_set and unlock the bitmap node.
NOTE that commit of atoms spawned by the trim process will be unusual:
no dirty jnodes, hence, no flush, no IOs (as RELOCATE and OVERWRITE
sets are empty). Only issuing discard requests.. Of course, this is
only in the case when other processes spawning dirty jnodes didn't
join our atom (they can do it perfectly, as we lock bitmaps only per a
free extent handling).
There can be potential problems around the "unusual" commits (false
positives in the debugging code, etc.), but I hope they are minor..
Thanks,
Edward.
On 06/30/2014 11:35 AM, Ivan Shapovalov wrote:
> Hi,
>
> I've started to think about implementing the second part of discard support,
> namely "batch mode" (FITRIM ioctl). And it seems like I don't yet quite
> understand how to do it.
>
> It had been suggested to reuse existing transaction and discard machinery for
> this feature: create a transaction, allocate+deallocate all possible blocks
> and then force-commit it.
>
> However, the algorithms of discard_atom() are very inoptimal for discarding
> large amounts of known free space -- a bitmap check is performed for every
> single discard unit. Repeatedly calling reiser4_alloc_blocks() to allocate
> every possible block also seems inefficient. And this will still miss those
> 10% of reserved space, IIUC.
>
> So the best way I can imagine is to introduce a new space allocator method,
> "iterate free space", and discard all reported extents (blkdev_issue_discard()
> will take care of aligning them properly).
>
> With such method, a question arises: how to prevent bitmap modifications
> and disk writes to free space when such iteration is in progress?
>
> Thanks,
next prev parent reply other threads:[~2014-06-30 12:19 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-06-30 9:35 reiser4: discard implementation, part 2: FITRIM ioctl aka batch mode Ivan Shapovalov
2014-06-30 12:19 ` Edward Shishkin [this message]
2014-06-30 13:24 ` Ivan Shapovalov
2014-06-30 23:59 ` Edward Shishkin
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=53B155D5.4070700@gmail.com \
--to=edward.shishkin@gmail.com \
--cc=intelfx100@gmail.com \
--cc=reiserfs-devel@vger.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 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.