All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Benoît Canet" <benoit.canet@irqsave.net>
To: Kevin Wolf <kwolf@redhat.com>
Cc: "Benoît Canet" <benoit.canet@irqsave.net>,
	qemu-devel@nongnu.org, stefanha@redhat.com
Subject: Re: [Qemu-devel] [RFC V8 03/13] quorum: Add quorum_aio_writev and its dependencies.
Date: Mon, 30 Sep 2013 14:54:26 +0200	[thread overview]
Message-ID: <20130930125426.GA3318@irqsave.net> (raw)
In-Reply-To: <20130927100307.GI2440@dhcp-200-207.str.redhat.com>

Le Friday 27 Sep 2013 à 12:03:07 (+0200), Kevin Wolf a écrit :
> Am 26.09.2013 um 18:29 hat Benoît Canet geschrieben:
> > Le Friday 08 Feb 2013 à 11:38:38 (+0100), Kevin Wolf a écrit :
> > > Am 28.01.2013 18:07, schrieb Benoît Canet:
> > > > Signed-off-by: Benoit Canet <benoit@irqsave.net>
> > > > ---
> > > >  block/quorum.c |  111 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> > > >  1 file changed, 111 insertions(+)
> > > > 
> > > > diff --git a/block/quorum.c b/block/quorum.c
> > > > index d8fffbe..5d8470b 100644
> > > > --- a/block/quorum.c
> > > > +++ b/block/quorum.c
> > > > @@ -52,11 +52,122 @@ struct QuorumAIOCB {
> > > >      int vote_ret;
> > > >  };
> > > >  
> > > > +static void quorum_aio_cancel(BlockDriverAIOCB *blockacb)
> > > > +{
> > > > +    QuorumAIOCB *acb = container_of(blockacb, QuorumAIOCB, common);
> > > > +    bool finished = false;
> > > > +
> > > > +    /* Wait for the request to finish */
> > > > +    acb->finished = &finished;
> > > > +    while (!finished) {
> > > > +        qemu_aio_wait();
> > > > +    }
> > > > +}
> > > > +
> > > > +static AIOCBInfo quorum_aiocb_info = {
> > > > +    .aiocb_size         = sizeof(QuorumAIOCB),
> > > > +    .cancel             = quorum_aio_cancel,
> > > > +};
> > > > +
> > > > +static void quorum_aio_bh(void *opaque)
> > > > +{
> > > > +    QuorumAIOCB *acb = opaque;
> > > > +    BDRVQuorumState *s = acb->bqs;
> > > > +    int ret;
> > > > +
> > > > +    ret = s->threshold <= acb->success_count ? 0 : -EIO;
> > > 
> > > It would be very much preferable if you stored the actual error code
> > > instead of turning everything into -EIO.
> > > 
> > > > +
> > > > +    qemu_bh_delete(acb->bh);
> > > > +    acb->common.cb(acb->common.opaque, ret);
> > > > +    if (acb->finished) {
> > > > +        *acb->finished = true;
> > > > +    }
> > > > +    g_free(acb->aios);
> > > > +    qemu_aio_release(acb);
> > > > +}
> > > 
> > > Move this down so that it's next to the function using the bottom half.
> > > 
> > > > +
> > > > +static QuorumAIOCB *quorum_aio_get(BDRVQuorumState *s,
> > > > +                                   BlockDriverState *bs,
> > > > +                                   QEMUIOVector *qiov,
> > > > +                                   uint64_t sector_num,
> > > > +                                   int nb_sectors,
> > > > +                                   BlockDriverCompletionFunc *cb,
> > > > +                                   void *opaque)
> > > > +{
> > > > +    QuorumAIOCB *acb = qemu_aio_get(&quorum_aiocb_info, bs, cb, opaque);
> > > > +    int i;
> > > > +
> > > > +    acb->aios = g_new0(QuorumSingleAIOCB, s->total);
> > > > +
> > > > +    acb->bqs = s;
> > > > +    acb->qiov = qiov;
> > > > +    acb->bh = NULL;
> > > > +    acb->count = 0;
> > > > +    acb->success_count = 0;
> > > > +    acb->sector_num = sector_num;
> > > > +    acb->nb_sectors = nb_sectors;
> > > > +    acb->vote = NULL;
> > > > +    acb->vote_ret = 0;
> > > > +    acb->finished = NULL;
> > > > +
> > > > +    for (i = 0; i < s->total; i++) {
> > > > +        acb->aios[i].buf = NULL;
> > > > +        acb->aios[i].ret = 0;
> > > > +        acb->aios[i].parent = acb;
> > > > +    }
> > > 
> > > Would you mind to reorder the initialisation of the fields according to
> > > the order that is used in the struct definition?
> > > 
> > > > +
> > > > +    return acb;
> > > > +}
> > > > +
> > > > +static void quorum_aio_cb(void *opaque, int ret)
> > > > +{
> > > > +    QuorumSingleAIOCB *sacb = opaque;
> > > > +    QuorumAIOCB *acb = sacb->parent;
> > > > +    BDRVQuorumState *s = acb->bqs;
> > > > +
> > > > +    sacb->ret = ret;
> > > > +    acb->count++;
> > > > +    if (ret == 0) {
> > > > +        acb->success_count++;
> > > > +    }
> > > > +    assert(acb->count <= s->total);
> > > > +    assert(acb->success_count <= s->total);
> > > > +    if (acb->count < s->total) {
> > > > +        return;
> > > > +    }
> > > > +
> > > > +    acb->bh = qemu_bh_new(quorum_aio_bh, acb);
> > > > +    qemu_bh_schedule(acb->bh);
> > > 
> > > What's the reason for using a bottom half here? Worth a comment?
> > > 
> > > multiwrite_cb() in block.c doesn't use one to achieve something similar.
> > > Is it buggy when you need one here?
> > > 
> > 
> > I tried the code without bh and it doesn't work.
> 
> It's long ago tbat I wrote that comment, but the remark about
> multiwrite_cb() concerns me. Do you know _why_ it doesn't work without
> the BH, and whether the same problem affects multiwrite_cb()? I'd prefer
> if we understood what we're doing over just basing the code on
> experiments.

Tried to do the conversion again. It seems to works fine.

Best regards

Benoît
> 
> Kevin

  reply	other threads:[~2013-09-30 12:54 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <1359392845-15905-1-git-send-email-benoit@irqsave.net>
     [not found] ` <1359392845-15905-4-git-send-email-benoit@irqsave.net>
     [not found]   ` <5114D5AE.6070901@redhat.com>
2013-09-26 15:25     ` [Qemu-devel] [RFC V8 03/13] quorum: Add quorum_aio_writev and its dependencies Benoît Canet
2013-09-26 16:16     ` Benoît Canet
2013-09-27  9:59       ` Kevin Wolf
2013-09-26 16:29     ` Benoît Canet
2013-09-27 10:03       ` Kevin Wolf
2013-09-30 12:54         ` Benoît Canet [this message]
     [not found] ` <1359392845-15905-7-git-send-email-benoit@irqsave.net>
     [not found]   ` <5114EA67.5000308@redhat.com>
2013-09-26 16:46     ` [Qemu-devel] [RFC V8 06/13] quorum: Add quorum mechanism Benoît Canet
2013-09-27 10:05       ` Kevin Wolf
2013-09-30 12:58     ` Benoît Canet

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=20130930125426.GA3318@irqsave.net \
    --to=benoit.canet@irqsave.net \
    --cc=kwolf@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@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.