All of lore.kernel.org
 help / color / mirror / Atom feed
From: Christophe Saout <christophe@saout.de>
To: Bartlomiej Zolnierkiewicz <B.Zolnierkiewicz@elka.pw.edu.pl>
Cc: linux-ide@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: Possibly wrong BIO usage in ide_multwrite
Date: Sun, 04 Jan 2004 18:30:59 +0100	[thread overview]
Message-ID: <1073237458.6069.31.camel@leto.cs.pocnet.net> (raw)
In-Reply-To: <200401032302.32914.bzolnier@elka.pw.edu.pl>

Am Sa, den 03.01.2004 schrieb Bartlomiej Zolnierkiewicz um 23:02:

> > The way I would prefer is that when someone calls bio_endio the bi_idx
> > and bv_offset just point where the processed data begins.
> 
> Are you aware that this will make partial completions illegal?
> [ No problem for me. ]

Why that? __end_that_request_first already does this (when moving thw
two lines updating bv_offset/bv_len after the call of the bi_end_io
function).

> > Can't another (some local) variable be used as bvec index instead of
> > bi_idx in the original bio? (except from ide_map_buffer using exactly
> > this index...)
> 
> see rq_map_buffer() in include/linux/blkdev.h

Right. I've been going through ide-taskfile.c for the last hours.

The IDE_TASKFILE_IO gets things right (from my point of view) and is
also much cleaner. (I would personally vote for dropping the non
TASKFILE_IO code, it would make my problem go away :D - why is it still
marked as experimental BTW? I've been using it since it was introduced,
without any problems)

BTW: The taskfile code that is used when IDE_TASKFILE_IO is disabled
might partially end requests without knowing the actual status, right?

>      /*
>       * FIXME :: We really can not legally get a new page/bh
>       * regardless, if this is the end of our segment.
>       * BH walking or segment can only be updated after we
>       * have a good  hwif->INB(IDE_STATUS_REG); return.
>       */
>      if (!rq->current_nr_sectors) {
>         if (!DRIVER(drive)->end_request(drive, 1, 0))
>            if (!rq->bio)
>               return ide_stopped;
>      }
>   } while (msect);

Well, there's a FIXME so you know this is not legal, but to make sure.
In ide-disk.c you're walking the segments yourself using the original
bi_idx which avoids this problem but which is my original problem. And
TASKFILE_IO gets things right (from my point of view) and doesn't do
illegal things because it uses the "generic driver walking code" using
cbio/process_that_request_first and co.

So non TASKFILE_IO code has two multout codepaths (taskfile and not)
that are both "awkward" while TASKFILE_IO merges both into a single and
clean version.

> > Still, I see, mcount could go to zero before the bio is finished and we
> > would need to store the bvec index somewhere, I see the problem.
> 
> bvec index and offset

Exactly.

> > What about doing a partial bio completion in multwrite_intr? If there is
> > data left you know you've finished multcount sectors, right?
> 
> Not always, ie. no. of sectors equal to no. of multicount sectors.

Yes, I didn't think about this one.

> > > There are 2 solutions for this problem:
> > >
> > > - Use separate bio lists (rq->cbio) and temporary data
> > >   (rq->nr_cbio_segments and rq->nr_cbio_sectors) for
> > > submission/completion.
> >
> > That would be somewhat similar to what I just proposed, right?
> 
> Right, rq->nr_cbio_segments holds number of bvecs still to be processed
> (no need to change bio->bi_idx) and rq->nr_cbio_sectors number of sectors
> in the bio still to be proccessed (so rq->current_nr_sectors can be number
> of sectors still to do in the current bvec).
> 
> Please note that this method doesn't require copy of struct request
> (using scratch request copy is quite expensive).

Yes. There's a memcpy commented out (#if 0) in ide-taskfile.c which you
don't ned because you "illegaly" let end_request (and so
end_that_request_first) to walk the request for you.

Using the cbio & co. mechanism you can let process_that_request_first
walk the code for you ("legally") without needing the copy either.

> > Would you be interested in a small patch (well, if I can come up with
> > one)?
> 
> Sure, but I don't know what you want to change... :-)

I'm not yet sure, either. I don't think that a too invasive version
would be adequate though converting this mess to the cbio method would
be nice. Or would you prefer to see that? I don't think it's worth
starting on that since you said you'de like to see this part of the IDE
layer die in 2.7 anyway. I would really like to see ide_map_buffer die
in favor of rq_map_buffer though. Hmm.
Perhaps I can think of something else. It's really tricky...

> > >   Please look at process_that_request_first() and its usage in TASKFILE
> > > code.
> >
> > I'll do. I already noticed that it used the other fields and obviously
> > doesn't use bi_idx the same way.
> >
> > >   You are then required to do partial bio completion.
> >
> > Yes.
> 
> Actually no, my mistake... s/required/allowed/
> IDE taskfile code doesn't use partial completions.

Not partial completions of bios but partial completion of requests,
right?

Things like

>   while (rq->bio != rq->cbio)
>      if (!DRIVER(drive)->end_request(drive, 1, bio_sectors(rq->bio)))
>         return ide_stopped;

in the interrupt handlers if you know they suceedeed.

Partial bio completions would probably also be possible, I see, but I
don't need to or want to change that.

Okay.

I'm trying to figure something out to avoid my original ++bio->bi_idx
problem.

  reply	other threads:[~2004-01-04 17:30 UTC|newest]

Thread overview: 33+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-01-01 17:18 Possibly wrong BIO usage in ide_multwrite Christophe Saout
2004-01-01 11:27 ` Bartlomiej Zolnierkiewicz
2004-01-02  3:20   ` Christophe Saout
2004-01-02  4:43     ` CPRM ?? " Andre Hedrick
2004-01-02 11:30       ` Jens Axboe
2004-01-03  7:53         ` Andre Hedrick
2004-01-03 10:57           ` Jens Axboe
2004-01-03 19:55             ` Andre Hedrick
2004-01-04 10:42               ` Jens Axboe
2004-01-04 22:02                 ` Andre Hedrick
2004-01-05 10:17                   ` Jens Axboe
2004-01-02 12:45       ` Christophe Saout
2004-01-03  7:51         ` Andre Hedrick
2004-01-03 22:02     ` Bartlomiej Zolnierkiewicz
2004-01-04 17:30       ` Christophe Saout [this message]
2004-01-05 16:12         ` Bartlomiej Zolnierkiewicz
2004-01-05 16:48           ` Christophe Saout
2004-01-05 19:37           ` Frederik Deweerdt
2004-01-05 20:13             ` Bartlomiej Zolnierkiewicz
2004-01-05  3:52       ` Christophe Saout
2004-01-05 17:08         ` Bartlomiej Zolnierkiewicz
2004-01-05 22:51           ` Christophe Saout
2004-01-05 23:59             ` Bartlomiej Zolnierkiewicz
2004-01-06 11:33               ` Christophe Saout
2004-01-06 14:38                 ` Bartlomiej Zolnierkiewicz
2004-01-06 15:21                   ` Christophe Saout
2004-01-05  4:03       ` Christophe Saout
2004-01-05 16:47         ` Bartlomiej Zolnierkiewicz
2004-01-05 16:49           ` Jens Axboe
2004-01-05 17:13             ` Bartlomiej Zolnierkiewicz
2004-01-05 18:16               ` Jens Axboe
2004-01-05 18:27                 ` Bartlomiej Zolnierkiewicz
2004-01-01 23:02 ` Andre Hedrick

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=1073237458.6069.31.camel@leto.cs.pocnet.net \
    --to=christophe@saout.de \
    --cc=B.Zolnierkiewicz@elka.pw.edu.pl \
    --cc=linux-ide@vger.kernel.org \
    --cc=linux-kernel@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.