Re: [PATCH] sg: retrofit SG_FLAG_Q_AT_TAIL flag

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, 22 Mar 2010 10:07:02 +0200
Boaz Harrosh <bharrosh@xxxxxxxxxxx> wrote:

> On 03/21/2010 07:56 PM, Douglas Gilbert wrote:
> > Boaz,
> > Thanks for the review.
> > 
> > Now I decided to check the SG_IO ioctl used directly
> > against block devices and it calls:
> >     blk_execute_rq(q, bd_disk, rq, 0);
> > 
> > The last argument is 'at_head' so it has been queuing
> > at_tail for some time. How is that for compatibility??
> > 
> > That almost suggests there should be a
> >    #define SG_FLAG_Q_AT_HEAD 0x20
> > 
> > added to sg.h to cover all the bases.
> > 
> > Doug Gilbert
> > 
> > 
> 
> OK I dug up the original patch and actually It was the same
> with bsg. See the commit log:
> 
> commit 05378940caf979a8655c18b18a17213dcfa52412
> Author: Boaz Harrosh <bharrosh@xxxxxxxxxxx>
> Date:   Tue Mar 24 12:23:40 2009 +0100
> 
>     bsg: add support for tail queuing
>     
>     Currently inherited from sg.c bsg will submit asynchronous request
>      at the head-of-the-queue, (using "at_head" set in the call to
>      blk_execute_rq_nowait()). This is bad in situation where the queues
>      are full, requests will execute out of order, and can cause
>      starvation of the first submitted requests.
>     
>     The sg_io_v4->flags member is used and a bit is allocated to denote the
>     Q_AT_TAIL. Zero is to queue at_head as before, to be compatible with old
>     code at the write/read path. SG_IO code path behavior was changed so to
>     be the same as write/read behavior. SG_IO was very rarely used and breaking
>     compatibility with it is OK at this stage.
>     
>     sg_io_hdr at sg.h also has a flags member and uses 3 bits from the first
>     nibble and one bit from the last nibble. Even though none of these bits
>     are supported by bsg, The second nibble is allocated for use by bsg. Just
>     in case.
>     
>     Signed-off-by: Boaz Harrosh <bharrosh@xxxxxxxxxxx>
>     CC: Douglas Gilbert <dgilbert@xxxxxxxxxxxx>
>     Signed-off-by: Jens Axboe <jens.axboe@xxxxxxxxxx>
> 
> 
> (See second paragraph)
> So bsg had the same compatibility problem between SG_IO and "write".
> What happened is that I found a nasty bug in bsg's SG_IO, just at the
> same time, which proves that SG_IO was never used, (since it would just
> crash), so I decided that it would be cost-less to just break compatibility
> with some thing that never work, for the sake of simple API sameness.
> 
> I do realize now that I have made it hard for sg and SG_IO to comply to new
> API but retain back compatibility. (Sorry)
> 
> Here is my suggestion:
> - Allocate 2 bits at flags, [mask 0x30]
> - Have an enum for these two flags with this meaning:
>   Q_AT_API_COMPATIBLE = 0,
> 	This means for sg and SG_IO to keep their old behaviour. 
> 	sg.c 		- at_head
> 	SG_IO to device - at_tail
> 	bsg both cases  - it is at_head.
>   Q_AT_TAIL = 1,
> 	This means at_tail for all APIs
>   Q_AT_HEAD = 2,
> 	This means at_head for all APIs
>   Q_AT_RESERVED = 3,
> 	Should not be used
> 
> So this is effectively your idea as well but just elaborated on
> more.
> 
> If we do that I think we should maybe join headers, by moving
> common defines to sg.h and #include sg.h from bsg.h.

I don't see any point of adding this feature to sg with such hacky
flags. Why can't we leave sg alone? Just use bsg for things that sg
aren't designed for.
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]
  Powered by Linux