Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 30 Jan 2015 00:26:33 +0530
From:      Sibananda Sahu <sibananda.sahu@avagotech.com>
To:        freebsd-scsi@freebsd.org
Subject:   How to send 1MB I/O size in a single I/O request without split
Message-ID:  <f94a31843fde43237d9aa13bbe543ddf@mail.gmail.com>

next in thread | raw e-mail | index | archive | help
Hi All,



Recently we have added large I/O size of 1MB in our LSI controller and for
that we have implemented the same in driver.

But I have observed that the large I/O that an application is able to send
is 128KB in one I/O request.



I used the following command to send 1MB I/O:

# ddpt if=/dev/da0 of=/dev/zero count=1 bs=1M



But I have observed that the number of scatter gather elements per I/O
request always comes 1 and the I/O length comes as 128KB(max).

How can I get an I/O request from an application that will send 256 scatter
gather elements of size 4K each(which makes a single 1MB I/O request).

I have seen this kind of request in LINUX, but in FreeBSD I have received
only 1 sge count and 128KB max I/O length.



mrsas(4) driver reports to CAM layer that it supports 1MB I/O size.

ccb->cpi.maxio = sc->max_num_sge * MRSAS_PAGE_SIZE;         [Final value
that is reported is (256 * 4096)]



After a little investigation I found the following in sys/cam/scsi/scsi_da.c



if (cpi.maxio == 0)

        softc->disk->d_maxsize = DFLTPHYS;  /* traditional default */

else if (cpi.maxio > MAXPHYS)

        softc->disk->d_maxsize = MAXPHYS;   /* for safety */

else

        softc->disk->d_maxsize = cpi.maxio;



So even if the controller supports max I/O size greater than 128KB, it is
restricted to 128KB only.



I have changed the value of MAXPHYS from (128 * 1024) to (1024 * 1024) just
to see if I can get 1MB I/O request to driver and simultaneously whether
the driver can process 1M I/O size or not.

I observed that after this modification I am able to get 1MB I/O request
from the application.

Number of sge is still 1 but the I/O length is now 1MB.



Further information:

Mrsas(4) driver supports UNMAPPED I/O.

I have exercised the same thing with UNMAPPED I/O disabled but the result
was same.





So my primary questions are:

-          How can I send a large I/O size of 1MB in a single I/O request
without any split?

-          Why I am getting always 1 scatter gather element?

-          How can I get more sge count in an I/O request?







Thanks,

Sibananda Sahu

Device driver developer @ AVAGO Technologies.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?f94a31843fde43237d9aa13bbe543ddf>