All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] zbd: Restore check_swd()
@ 2018-09-27  2:16 Damien Le Moal
  2018-09-28  3:41 ` Bart Van Assche
  2018-09-28  3:53 ` Jens Axboe
  0 siblings, 2 replies; 8+ messages in thread
From: Damien Le Moal @ 2018-09-27  2:16 UTC (permalink / raw)
  To: fio, Jens Axboe; +Cc: Bart Van Assche

As check_swd() is useful for debugging, revert its removal done with
commit d60be7d51cbb ("zbd: Remove unused function and variable").

Fixes: d60be7d51cbb ("zbd: Remove unused function and variable")
Suggested-by: Bart Van Assche <bvanassche@acm.org>
Signed-off-by: Damien Le Moal <damien.lemoal@wdc.com>
---
 zbd.c | 28 ++++++++++++++++++++++++++++
 1 file changed, 28 insertions(+)

diff --git a/zbd.c b/zbd.c
index 9c525875..0b7159a0 100644
--- a/zbd.c
+++ b/zbd.c
@@ -726,6 +726,32 @@ static bool zbd_dec_and_reset_write_cnt(const struct thread_data *td,
 	return write_cnt == 0;
 }
 
+/*
+ * For debugging:
+ * Check whether the value of zbd_info.sectors_with_data is correct.
+ */
+static void check_swd(const struct thread_data *td, const struct fio_file *f)
+{
+#if 0
+	struct fio_zone_info *zb, *ze, *z;
+	uint64_t swd;
+
+	zb = &f->zbd_info->zone_info[zbd_zone_idx(f, f->file_offset)];
+	ze = &f->zbd_info->zone_info[zbd_zone_idx(f, f->file_offset +
+						  f->io_size)];
+	swd = 0;
+	for (z = zb; z < ze; z++) {
+		pthread_mutex_lock(&z->mutex);
+		swd += z->wp - z->start;
+	}
+	pthread_mutex_lock(&f->zbd_info->mutex);
+	assert(f->zbd_info->sectors_with_data == swd);
+	pthread_mutex_unlock(&f->zbd_info->mutex);
+	for (z = zb; z < ze; z++)
+		pthread_mutex_unlock(&z->mutex);
+#endif
+}
+
 void zbd_file_reset(struct thread_data *td, struct fio_file *f)
 {
 	struct fio_zone_info *zb, *ze, *z;
@@ -1202,6 +1228,7 @@ enum io_u_action zbd_adjust_block(struct thread_data *td, struct io_u *io_u)
 		}
 		/* Check whether the zone reset threshold has been exceeded */
 		if (td->o.zrf.u.f) {
+			check_swd(td, f);
 			if (f->zbd_info->sectors_with_data >=
 			    f->io_size * td->o.zrt.u.f &&
 			    zbd_dec_and_reset_write_cnt(td, f)) {
@@ -1222,6 +1249,7 @@ enum io_u_action zbd_adjust_block(struct thread_data *td, struct io_u *io_u)
 			zb->reset_zone = 0;
 			if (zbd_reset_zone(td, f, zb) < 0)
 				goto eof;
+			check_swd(td, f);
 		}
 		/* Make writes occur at the write pointer */
 		assert(!zbd_zone_full(f, zb, min_bs));
-- 
2.17.1



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

* Re: [PATCH] zbd: Restore check_swd()
  2018-09-27  2:16 [PATCH] zbd: Restore check_swd() Damien Le Moal
@ 2018-09-28  3:41 ` Bart Van Assche
  2018-09-28  3:53 ` Jens Axboe
  1 sibling, 0 replies; 8+ messages in thread
From: Bart Van Assche @ 2018-09-28  3:41 UTC (permalink / raw)
  To: Damien Le Moal, fio, Jens Axboe

On 9/26/18 7:16 PM, Damien Le Moal wrote:
> As check_swd() is useful for debugging, revert its removal done with
> commit d60be7d51cbb ("zbd: Remove unused function and variable").

Thanks!

Reviewed-by: Bart Van Assche <bvanassche@acm.org>


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

* Re: [PATCH] zbd: Restore check_swd()
  2018-09-27  2:16 [PATCH] zbd: Restore check_swd() Damien Le Moal
  2018-09-28  3:41 ` Bart Van Assche
@ 2018-09-28  3:53 ` Jens Axboe
  2018-09-28  4:04   ` Damien Le Moal
  1 sibling, 1 reply; 8+ messages in thread
From: Jens Axboe @ 2018-09-28  3:53 UTC (permalink / raw)
  To: Damien Le Moal, fio; +Cc: Bart Van Assche

On 9/26/18 8:16 PM, Damien Le Moal wrote:
> As check_swd() is useful for debugging, revert its removal done with
> commit d60be7d51cbb ("zbd: Remove unused function and variable").

The problem with dead code is that it's often forgotten when
other changes are made, and then it doesn't even compile or
work anymore.

I'd be happier if this was dependent on some debug static
bool instead, ala:

static bool zbd_debug;

And then have check_swd() do

if (!zbd_debug)
    return;

instead of hiding everything behind an #if 0.

-- 
Jens Axboe



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

* Re: [PATCH] zbd: Restore check_swd()
  2018-09-28  3:53 ` Jens Axboe
@ 2018-09-28  4:04   ` Damien Le Moal
  2018-09-28  5:48     ` Damien Le Moal
  0 siblings, 1 reply; 8+ messages in thread
From: Damien Le Moal @ 2018-09-28  4:04 UTC (permalink / raw)
  To: Jens Axboe, fio; +Cc: Bart Van Assche

Jens,

On 2018/09/28 12:53, Jens Axboe wrote:
> On 9/26/18 8:16 PM, Damien Le Moal wrote:
>> As check_swd() is useful for debugging, revert its removal done with
>> commit d60be7d51cbb ("zbd: Remove unused function and variable").
> 
> The problem with dead code is that it's often forgotten when
> other changes are made, and then it doesn't even compile or
> work anymore.
> 
> I'd be happier if this was dependent on some debug static
> bool instead, ala:
> 
> static bool zbd_debug;
> 
> And then have check_swd() do
> 
> if (!zbd_debug)
>     return;
> 
> instead of hiding everything behind an #if 0.

OK. No problem. I will update and send a v2.

(and another patch to fix the incorrect comments signaled by Bart)

Thanks !


-- 
Damien Le Moal
Western Digital Research


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

* Re: [PATCH] zbd: Restore check_swd()
  2018-09-28  4:04   ` Damien Le Moal
@ 2018-09-28  5:48     ` Damien Le Moal
  2018-09-28 14:54       ` Jens Axboe
  0 siblings, 1 reply; 8+ messages in thread
From: Damien Le Moal @ 2018-09-28  5:48 UTC (permalink / raw)
  To: Jens Axboe, fio; +Cc: Bart Van Assche

Jens,

On 2018/09/28 13:04, Damien Le Moal wrote:
> Jens,
> 
> On 2018/09/28 12:53, Jens Axboe wrote:
>> On 9/26/18 8:16 PM, Damien Le Moal wrote:
>>> As check_swd() is useful for debugging, revert its removal done with
>>> commit d60be7d51cbb ("zbd: Remove unused function and variable").
>>
>> The problem with dead code is that it's often forgotten when
>> other changes are made, and then it doesn't even compile or
>> work anymore.
>>
>> I'd be happier if this was dependent on some debug static
>> bool instead, ala:
>>
>> static bool zbd_debug;
>>
>> And then have check_swd() do
>>
>> if (!zbd_debug)
>>     return;
>>
>> instead of hiding everything behind an #if 0.
> 
> OK. No problem. I will update and send a v2.
> 
> (and another patch to fix the incorrect comments signaled by Bart)
> 
> Thanks !

Not sending a fix after all: with check_swd() enabled, I am getting a deadlock
between check_swd() and zbd_file_reset() on a zone mutex in test 29 when running
against regular nullb.

That needs to be investigated. But I do not have the time to do so right away.

Bart,

If you can, please also look at it ? I do not see anything obviously wrong. It
may be a very subtle race.

Best regards.

-- 
Damien Le Moal
Western Digital Research


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

* Re: [PATCH] zbd: Restore check_swd()
  2018-09-28  5:48     ` Damien Le Moal
@ 2018-09-28 14:54       ` Jens Axboe
  2018-09-28 20:25         ` Bart Van Assche
  0 siblings, 1 reply; 8+ messages in thread
From: Jens Axboe @ 2018-09-28 14:54 UTC (permalink / raw)
  To: Damien Le Moal, fio; +Cc: Bart Van Assche

On 9/27/18 11:48 PM, Damien Le Moal wrote:
> Jens,
> 
> On 2018/09/28 13:04, Damien Le Moal wrote:
>> Jens,
>>
>> On 2018/09/28 12:53, Jens Axboe wrote:
>>> On 9/26/18 8:16 PM, Damien Le Moal wrote:
>>>> As check_swd() is useful for debugging, revert its removal done with
>>>> commit d60be7d51cbb ("zbd: Remove unused function and variable").
>>>
>>> The problem with dead code is that it's often forgotten when
>>> other changes are made, and then it doesn't even compile or
>>> work anymore.
>>>
>>> I'd be happier if this was dependent on some debug static
>>> bool instead, ala:
>>>
>>> static bool zbd_debug;
>>>
>>> And then have check_swd() do
>>>
>>> if (!zbd_debug)
>>>     return;
>>>
>>> instead of hiding everything behind an #if 0.
>>
>> OK. No problem. I will update and send a v2.
>>
>> (and another patch to fix the incorrect comments signaled by Bart)
>>
>> Thanks !
> 
> Not sending a fix after all: with check_swd() enabled, I am getting a deadlock
> between check_swd() and zbd_file_reset() on a zone mutex in test 29 when running
> against regular nullb.
> 
> That needs to be investigated. But I do not have the time to do so right away.
> 
> Bart,
> 
> If you can, please also look at it ? I do not see anything obviously wrong. It
> may be a very subtle race.

+	for (z = zb; z < ze; z++) {
+		pthread_mutex_lock(&z->mutex);
+		swd += z->wp - z->start;
+	}
+	pthread_mutex_lock(&f->zbd_info->mutex);

Can 'z' ever end up being f->zbd_info? That would surely explain the
deadlock.

-- 
Jens Axboe



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

* Re: [PATCH] zbd: Restore check_swd()
  2018-09-28 14:54       ` Jens Axboe
@ 2018-09-28 20:25         ` Bart Van Assche
  2018-09-28 20:31           ` Jens Axboe
  0 siblings, 1 reply; 8+ messages in thread
From: Bart Van Assche @ 2018-09-28 20:25 UTC (permalink / raw)
  To: Jens Axboe, Damien Le Moal, fio

On Fri, 2018-09-28 at 08:54 -0600, Jens Axboe wrote:
> +	for (z = zb; z < ze; z++) {
> +		pthread_mutex_lock(&z->mutex);
> +		swd += z->wp - z->start;
> +	}
> +	pthread_mutex_lock(&f->zbd_info->mutex);
> 
> Can 'z' ever end up being f->zbd_info? That would surely explain the
> deadlock.

Hi Jens,

f->zbd_info and z have a different type so unless something very weird is going
on &z->mutex can't be identical to &f->zbd_info->mutex.

What I think is going on is traditional lock inversion: check_swd() triggers
lock inversion if it is called while any of the z->mutex objects are held. One
such mutex is held where Damien tried to restore the calls of this function. I
will submit a patch that inserts these calls elsewhere.

Bart.



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

* Re: [PATCH] zbd: Restore check_swd()
  2018-09-28 20:25         ` Bart Van Assche
@ 2018-09-28 20:31           ` Jens Axboe
  0 siblings, 0 replies; 8+ messages in thread
From: Jens Axboe @ 2018-09-28 20:31 UTC (permalink / raw)
  To: Bart Van Assche, Damien Le Moal, fio

On 9/28/18 2:25 PM, Bart Van Assche wrote:
> On Fri, 2018-09-28 at 08:54 -0600, Jens Axboe wrote:
>> +	for (z = zb; z < ze; z++) {
>> +		pthread_mutex_lock(&z->mutex);
>> +		swd += z->wp - z->start;
>> +	}
>> +	pthread_mutex_lock(&f->zbd_info->mutex);
>>
>> Can 'z' ever end up being f->zbd_info? That would surely explain the
>> deadlock.
> 
> Hi Jens,
> 
> f->zbd_info and z have a different type so unless something very weird is going
> on &z->mutex can't be identical to &f->zbd_info->mutex.

Obviously I didn't look too closely :-)

> What I think is going on is traditional lock inversion: check_swd() triggers
> lock inversion if it is called while any of the z->mutex objects are held. One
> such mutex is held where Damien tried to restore the calls of this function. I
> will submit a patch that inserts these calls elsewhere.

That makes sense.

-- 
Jens Axboe



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

end of thread, other threads:[~2018-09-28 20:31 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-09-27  2:16 [PATCH] zbd: Restore check_swd() Damien Le Moal
2018-09-28  3:41 ` Bart Van Assche
2018-09-28  3:53 ` Jens Axboe
2018-09-28  4:04   ` Damien Le Moal
2018-09-28  5:48     ` Damien Le Moal
2018-09-28 14:54       ` Jens Axboe
2018-09-28 20:25         ` Bart Van Assche
2018-09-28 20:31           ` Jens Axboe

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.