From: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
To: pw@osc.edu
Cc: fujita.tomonori@lab.ntt.co.jp, linux-scsi@vger.kernel.org,
bharrosh@panasas.com, jens.axboe@oracle.com,
linux-ide@vger.kernel.org
Subject: Re: [PATCH 4/4] block: add large command support
Date: Tue, 15 Apr 2008 07:33:33 +0900 [thread overview]
Message-ID: <20080415073300D.tomof@acm.org> (raw)
In-Reply-To: <20080414144154.GB10288@osc.edu>
On Mon, 14 Apr 2008 10:41:54 -0400
Pete Wyckoff <pw@osc.edu> wrote:
> fujita.tomonori@lab.ntt.co.jp wrote on Mon, 14 Apr 2008 19:50 +0900:
> > This patch changes rq->cmd from the static array to a pointer to
> > support large commands.
> >
> > We rarely handle large commands. So for optimization, a struct request
> > still has a static array for a command. rq_init sets rq->cmd pointer
> > to the static array.
> >
> > Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
> > Cc: Jens Axboe <jens.axboe@oracle.com>
> [..]
> > diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
> > index b3a58ad..5710ae4 100644
> > --- a/include/linux/blkdev.h
> > +++ b/include/linux/blkdev.h
> > @@ -215,8 +215,9 @@ struct request {
> > /*
> > * when request is used as a packet command carrier
> > */
> > - unsigned int cmd_len;
> > - unsigned char cmd[BLK_MAX_CDB];
> > + unsigned short cmd_len;
> > + unsigned char __cmd[BLK_MAX_CDB];
> > + unsigned char *cmd;
> >
> > unsigned int data_len;
> > unsigned int extra_len; /* length of alignment and padding */
> > @@ -812,6 +813,13 @@ static inline void put_dev_sector(Sector p)
> > page_cache_release(p.v);
> > }
> >
> > +static inline void rq_set_cmd(struct request *rq, unsigned char *cmd,
> > + unsigned short cmd_len)
> > +{
> > + rq->cmd = cmd;
> > + rq->cmd_len = cmd_len;
> > +}
>
> Here's one way this will be used, in a patched bsg that understands
> large commands. Complication is the need to copy and hold onto the
> big command across the duration of the request.
>
> Submit time is fairly clean:
>
> /* buf, len from user request */
> rq = blk_get_request(..);
> rq->cmd_len = len;
> if (len > BLK_MAX_CDB) {
> rq->cmd = kmalloc(len);
> if (rq->cmd == NULL)
> goto out;
> }
> copy_from_user(rq->cmd, buf, len);
>
> Completion time needs to know when to free rq->cmd:
>
> if (rq->cmd_len > BLK_MAX_CDB)
> kfree(rq->cmd);
> blk_put_request(rq);
>
> Could use (rq->cmd != rq->__cmd) instead, but nothing had better
> ever touch rq->cmd_len.
>
> I don't think the helper rq_set_cmd() will be very useful, as the
> caller (bsg) must think about allocation of the command buffer if it
> is big.
Yeah, I think so. If you need large command support, you need to know
how to handle it for now. Now only bsg supports large commands. So I
guess that nobody complains about the current interface.
> One option would be to handle allocation/freeing of the big command
> in rq_set_... functions, but I don't think you want to constrain the
> interface like that.
Or, you can change blk_get_request to take the command length
argument. But I don't think that such is the right approach.
> Boaz's concern about big rq->cmd_len still worries me, although I
> think this approach is better and worth solving bugs in drivers as
> they arise. It only matters in the case that someone adds, say, a
> bsg interface to all block devices though. The queuecommand of ub
> shows a good example of how this will break.
Yes, a bsg hook will need to handle large commands. I don't see any
problem about it. All a hook needs to do is just looking at the legnth
and dropping or executing the command. And of course, we are unlikely
to add a bsg device to all the block devices.
As I said, if we want to govern the command length in a common place,
we can have the limit of the command length in request queues. It's
clear than an implicit checking with two lengths, cmd_len and
ext_cdb_len.
I thought about adding the code to check the command length in UB. But
I thought that we were unlikely to create bsg devices for ub. Common
people use USB_STORAGE rather than UB, I guess.
> In sum, this is a cleaner approach, and a bit easier for callers
> with long commands to deal with. And you could get rid of the
> trivial helper.
Yeah, it's a cleaner design, that's main point, I think.
BTW, have you had a chance to try the bsg patches to fix the problems
that you reported? I think that Mike and I analyzed the problem
correctly and the patches works for me, but it would be nice if you
can confirm that they also work for you.
Thanks,
next prev parent reply other threads:[~2008-04-14 22:33 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20080414010112W.tomof@acm.org>
[not found] ` <1208170266-1676-1-git-send-email-fujita.tomonori@lab.ntt.co.jp>
[not found] ` <1208170266-1676-2-git-send-email-fujita.tomonori@lab.ntt.co.jp>
[not found] ` <1208170266-1676-3-git-send-email-fujita.tomonori@lab.ntt.co.jp>
2008-04-14 10:50 ` [PATCH 3/4] block: replace sizeof(rq->cmd) with BLK_MAX_CDB FUJITA Tomonori
2008-04-14 10:50 ` [PATCH 4/4] block: add large command support FUJITA Tomonori
2008-04-14 11:29 ` Jens Axboe
2008-04-14 12:08 ` FUJITA Tomonori
2008-04-15 22:50 ` Bartlomiej Zolnierkiewicz
2008-04-15 22:57 ` FUJITA Tomonori
2008-04-16 0:22 ` Bartlomiej Zolnierkiewicz
2008-04-16 8:33 ` Jens Axboe
2008-04-16 9:08 ` Boaz Harrosh
2008-04-16 9:42 ` Jens Axboe
2008-04-16 22:28 ` Bartlomiej Zolnierkiewicz
2008-04-17 3:59 ` FUJITA Tomonori
2008-04-17 7:07 ` Jens Axboe
2008-04-17 11:55 ` Bartlomiej Zolnierkiewicz
2008-04-17 11:58 ` Bartlomiej Zolnierkiewicz
2008-04-17 12:07 ` FUJITA Tomonori
2008-04-17 4:02 ` FUJITA Tomonori
2008-04-14 14:41 ` Pete Wyckoff
2008-04-14 22:33 ` FUJITA Tomonori [this message]
2008-04-15 13:44 ` Pete Wyckoff
2008-04-15 7:45 ` Boaz Harrosh
2008-04-15 10:05 ` FUJITA Tomonori
2008-04-15 7:29 ` Jens Axboe
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=20080415073300D.tomof@acm.org \
--to=fujita.tomonori@lab.ntt.co.jp \
--cc=bharrosh@panasas.com \
--cc=jens.axboe@oracle.com \
--cc=linux-ide@vger.kernel.org \
--cc=linux-scsi@vger.kernel.org \
--cc=pw@osc.edu \
/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 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).