dm-devel.redhat.com archive mirror
 help / color / mirror / Atom feed
* questions about dm-thin and discard
@ 2012-07-16 17:14 Mikulas Patocka
  2012-07-16 18:01 ` Mike Snitzer
  0 siblings, 1 reply; 4+ messages in thread
From: Mikulas Patocka @ 2012-07-16 17:14 UTC (permalink / raw)
  To: Edward Thornber; +Cc: dm-devel, Mike Snitzer

Hi Joe

I would like to ask you about this code path: In process_discard, there is 
a branch with a comment "This path is hit if people are ignoring 
limits->discard_granularity." It trims the discard request so that it 
doesn't span a block boundary and submits it.

The question is: what if the block is shared? In this case, we can't 
submit discard to the block, because it would damage the other snapshot 
that is sharing this block. Shouldn't there be shomething like this?
if ((!lookup_result.shared) & pool->pf.discard_passdown) {
	remap_and_issue(tc, bio, lookup_result.block);
} else {
	bio_endio(bio, 0) 
} 
... or is it tested elsewhere and am I missing something?


Another question is about setting "ti->discards_supported = 1" in 
pool_ctr. ti->discards_supported means that the target supports discards 
even if the underlying disk doesn't. Since the pool device is passing 
anyth I/O unchanged to the underlying disk, ti->discards_supported 
shouldn't be set. Or is there any other reason why is it set?


Mikulas

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: questions about dm-thin and discard
  2012-07-16 17:14 questions about dm-thin and discard Mikulas Patocka
@ 2012-07-16 18:01 ` Mike Snitzer
  2012-07-16 18:32   ` Mikulas Patocka
  0 siblings, 1 reply; 4+ messages in thread
From: Mike Snitzer @ 2012-07-16 18:01 UTC (permalink / raw)
  To: Mikulas Patocka; +Cc: dm-devel, Edward Thornber

On Mon, Jul 16 2012 at  1:14pm -0400,
Mikulas Patocka <mpatocka@redhat.com> wrote:

> Hi Joe
> 
> I would like to ask you about this code path: In process_discard, there is 
> a branch with a comment "This path is hit if people are ignoring 
> limits->discard_granularity." It trims the discard request so that it 
> doesn't span a block boundary and submits it.
> 
> The question is: what if the block is shared? In this case, we can't 
> submit discard to the block, because it would damage the other snapshot 
> that is sharing this block. Shouldn't there be shomething like this?
> if ((!lookup_result.shared) & pool->pf.discard_passdown) {
> 	remap_and_issue(tc, bio, lookup_result.block);
> } else {
> 	bio_endio(bio, 0) 
> } 
> ... or is it tested elsewhere and am I missing something?

in process_discard:

 m->pass_discard = (!lookup_result.shared) && pool->pf.disard_passdown;

then in process_prepared_discard:

 if (m->pass_discard)
        remap_and_issue(tc, m->bio, m->data_block);
 else
        bio_endio(m->bio, 0);

> Another question is about setting "ti->discards_supported = 1" in 
> pool_ctr. ti->discards_supported means that the target supports discards 
> even if the underlying disk doesn't. Since the pool device is passing 
> anyth I/O unchanged to the underlying disk, ti->discards_supported 
> shouldn't be set. Or is there any other reason why is it set?

The thin device's bios will be remapped to the pool device.

process_prepared_discard's remap_and_issue() will send the bio to the
pool device via generic_make_request().

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: questions about dm-thin and discard
  2012-07-16 18:01 ` Mike Snitzer
@ 2012-07-16 18:32   ` Mikulas Patocka
  2012-07-16 19:51     ` Mike Snitzer
  0 siblings, 1 reply; 4+ messages in thread
From: Mikulas Patocka @ 2012-07-16 18:32 UTC (permalink / raw)
  To: Mike Snitzer; +Cc: dm-devel, Edward Thornber



On Mon, 16 Jul 2012, Mike Snitzer wrote:

> On Mon, Jul 16 2012 at  1:14pm -0400,
> Mikulas Patocka <mpatocka@redhat.com> wrote:
> 
> > Hi Joe
> > 
> > I would like to ask you about this code path: In process_discard, there is 
> > a branch with a comment "This path is hit if people are ignoring 
> > limits->discard_granularity." It trims the discard request so that it 
> > doesn't span a block boundary and submits it.
> > 
> > The question is: what if the block is shared? In this case, we can't 
> > submit discard to the block, because it would damage the other snapshot 
> > that is sharing this block. Shouldn't there be shomething like this?
> > if ((!lookup_result.shared) & pool->pf.discard_passdown) {
> > 	remap_and_issue(tc, bio, lookup_result.block);
> > } else {
> > 	bio_endio(bio, 0) 
> > } 
> > ... or is it tested elsewhere and am I missing something?
> 
> in process_discard:
> 
>  m->pass_discard = (!lookup_result.shared) && pool->pf.disard_passdown;
> 
> then in process_prepared_discard:
> 
>  if (m->pass_discard)
>         remap_and_issue(tc, m->bio, m->data_block);
>  else
>         bio_endio(m->bio, 0);

This is called in process_discard if io_overlaps_block returns true. But 
if io_overlaps_block returns false, this check is not done. There is: 

cell_release_singleton(cell, bio);
cell_release_singleton(cell2, bio); 
remap_and_issue(tc, bio, lookup_result.block);

... remap_and_issue calls remap (which just changes bio->bi_bdev and 
bio->bi_sector) and issue (which calls generic_make_request) - so we issue 
discard to a potentially shared block here.

> > Another question is about setting "ti->discards_supported = 1" in 
> > pool_ctr. ti->discards_supported means that the target supports discards 
> > even if the underlying disk doesn't. Since the pool device is passing 
> > anyth I/O unchanged to the underlying disk, ti->discards_supported 
> > shouldn't be set. Or is there any other reason why is it set?
> 
> The thin device's bios will be remapped to the pool device.
> 
> process_prepared_discard's remap_and_issue() will send the bio to the
> pool device via generic_make_request().

If the underlying device doesn't support discards, there is no poin in 
setting "ti->discards_supported = 1" on the pool device. You should set 
"ti->discards_supported = 1" should be set on the thin device because thin 
supports discards even if the underlying disk doesn't. But pool doesn't 
support discards if the underlying disk doesn't, so it shouldn't be set.

Mikulas

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: questions about dm-thin and discard
  2012-07-16 18:32   ` Mikulas Patocka
@ 2012-07-16 19:51     ` Mike Snitzer
  0 siblings, 0 replies; 4+ messages in thread
From: Mike Snitzer @ 2012-07-16 19:51 UTC (permalink / raw)
  To: Mikulas Patocka; +Cc: dm-devel, Edward Thornber

On Mon, Jul 16 2012 at  2:32pm -0400,
Mikulas Patocka <mpatocka@redhat.com> wrote:

> 
> 
> On Mon, 16 Jul 2012, Mike Snitzer wrote:
> 
> > On Mon, Jul 16 2012 at  1:14pm -0400,
> > Mikulas Patocka <mpatocka@redhat.com> wrote:
> > 
> > > Hi Joe
> > > 
> > > I would like to ask you about this code path: In process_discard, there is 
> > > a branch with a comment "This path is hit if people are ignoring 
> > > limits->discard_granularity." It trims the discard request so that it 
> > > doesn't span a block boundary and submits it.
> > > 
> > > The question is: what if the block is shared? In this case, we can't 
> > > submit discard to the block, because it would damage the other snapshot 
> > > that is sharing this block. Shouldn't there be shomething like this?
> > > if ((!lookup_result.shared) & pool->pf.discard_passdown) {
> > > 	remap_and_issue(tc, bio, lookup_result.block);
> > > } else {
> > > 	bio_endio(bio, 0) 
> > > } 
> > > ... or is it tested elsewhere and am I missing something?
> > 
> > in process_discard:
> > 
> >  m->pass_discard = (!lookup_result.shared) && pool->pf.disard_passdown;
> > 
> > then in process_prepared_discard:
> > 
> >  if (m->pass_discard)
> >         remap_and_issue(tc, m->bio, m->data_block);
> >  else
> >         bio_endio(m->bio, 0);
> 
> This is called in process_discard if io_overlaps_block returns true. But 
> if io_overlaps_block returns false, this check is not done. There is: 
> 
> cell_release_singleton(cell, bio);
> cell_release_singleton(cell2, bio); 
> remap_and_issue(tc, bio, lookup_result.block);
> 
> ... remap_and_issue calls remap (which just changes bio->bi_bdev and 
> bio->bi_sector) and issue (which calls generic_make_request) - so we issue 
> discard to a potentially shared block here.

That is a fair point, it does look like there should be a check for
sharing.  But I could be missing something implicit with the bio prison
code (though I don't think I am).

> > > Another question is about setting "ti->discards_supported = 1" in 
> > > pool_ctr. ti->discards_supported means that the target supports discards 
> > > even if the underlying disk doesn't. Since the pool device is passing 
> > > anyth I/O unchanged to the underlying disk, ti->discards_supported 
> > > shouldn't be set. Or is there any other reason why is it set?
> > 
> > The thin device's bios will be remapped to the pool device.
> > 
> > process_prepared_discard's remap_and_issue() will send the bio to the
> > pool device via generic_make_request().
> 
> If the underlying device doesn't support discards, there is no poin in 
> setting "ti->discards_supported = 1" on the pool device. You should set 
> "ti->discards_supported = 1" should be set on the thin device because thin 
> supports discards even if the underlying disk doesn't. But pool doesn't 
> support discards if the underlying disk doesn't, so it shouldn't be set.

The pool only sets "ti->discards_supported = 1" if (pf.discard_enabled
&& pf.discard_passdown).

The comment provides some insight:
  /*                                                                                    
   * Setting 'discards_supported' circumvents the normal                                                                                    
   * stacking of discard limits (this keeps the pool and                                                                                    
   * thin devices' discard limits consistent).                                                                                    
   */

All being said, there is currently a disconnect on the discard limits
that are imposed for thin/pool devices vs what the underlying
data device's discard limits are.  So "circumvents the normal stacking"
is treated as a feature here but it really is suspect in my view.  I
just haven't circled back to look at this area closer yet.

Mike

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2012-07-16 19:51 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-07-16 17:14 questions about dm-thin and discard Mikulas Patocka
2012-07-16 18:01 ` Mike Snitzer
2012-07-16 18:32   ` Mikulas Patocka
2012-07-16 19:51     ` Mike Snitzer

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).