On Wed, 2019-01-30 at 17:50 -0500, Douglas Gilbert wrote:
> On 2019-01-30 3:23 p.m., Bart Van Assche wrote:
> > On Tue, 2019-01-22 at 15:47 -0500, Douglas Gilbert wrote:
> > > On 2019-01-22 1:25 p.m., Bart Van Assche wrote:
> > > > The default behavior of the SCSI core is to set the block layer request
> > > > queue parameter max_segment_size to 64 KB. That means that elements of
> > > > scatterlists are limited to 64 KB. Since RDMA adapters support larger
> > > > sizes, increase max_segment_size for the SRP initiator.
> > > > 
> > > > Notes:
> > > > - The SCSI max_segment_size parameter was introduced in kernel v5.0. See
> > > >     also commit 50c2e9107f17 ("scsi: introduce a max_segment_size
> > > >     host_template parameters").
> > > > - Some other block drivers already set max_segment_size to UINT_MAX,
> > > >     e.g. nbd and rbd.
> > > 
> > > In my sg v4 driver rewrite one of options within the SG_SET_GET_EXTENDED
> > > ioctl is to allow the user to modify this value. It is a #define to
> > > 32 KB in the production sg v3 driver.
> > 
> > Hi Doug,
> > 
> > This functionality seems useful to me. But it is not clear to me how it
> > will be guaranteed that the value set by the user won't exceed the largest
> > max_segment_size value supported by the driver?
> 
> The sg v4 driver exists and its code can be found at:
>     http://sg.danny.cz/sg/sg_v40.html
> 
> And the code there takes the min(<given_sgat_sz>, <following_function>) as
> the element size. That function is:
> 
> static int
> max_sectors_bytes(struct request_queue *q)
> {
>          unsigned int max_sectors = queue_max_sectors(q);
> 
>          max_sectors = min_t(unsigned int, max_sectors, INT_MAX >> 9);
>          return max_sectors << 9;
> }
> 
> Also <given_sgat_sz> is rounded up to PAGE_SIZE and rejected if it is not
> a power of 2. Does that look correct?

Hi Doug,

Have you noticed that my patch affects max_segment_size and that your patch
refers to the max_sectors limit? From the Linux kernel header file blkdev.h:

static inline unsigned int queue_max_sectors(struct request_queue *q)
{
        return q->limits.max_sectors;
}
[ ... ]
static inline unsigned int queue_max_segment_size(struct request_queue *q)
{
        return q->limits.max_segment_size;
}

Thanks,

Bart.

Reply via email to