svn commit: r228939 - head/sys/dev/mps

John Baldwin jhb at freebsd.org
Mon Jan 9 19:21:32 UTC 2012


On Monday, January 09, 2012 2:04:23 pm Garrett Cooper wrote:
> 2012/1/9 Alexander Motin <mav at freebsd.org>:
> > On 09.01.2012 20:54, Maksim Yevmenkin wrote:
> >>
> >> On Wed, Dec 28, 2011 at 2:49 PM, Alexander Motin<mav at freebsd.org>  wrote:
> >>
> >>> Author: mav
> >>> Date: Wed Dec 28 22:49:28 2011
> >>> New Revision: 228939
> >>> URL: http://svn.freebsd.org/changeset/base/228939
> >>>
> >>> Log:
> >>>  Set maximum I/O size for mps(4) to MAXPHYS. Looking into the code, I 
see
> >>>  no reason why it should be limited to 64K of DFLTPHYS. DMA data tag is
> >>> any
> >>>  way set to allow MAXPHYS, S/G lists (chain elements) are sufficient and
> >>>  overflows are also handled. On my tests even 1MB I/Os are working fine.
> >>>
> >>>  Reviewed by:  ken@
> >>>
> >>> Modified:
> >>>  head/sys/dev/mps/mps_sas.c
> >>>
> >>> Modified: head/sys/dev/mps/mps_sas.c
> >>>
> >>> 
==============================================================================
> >>> --- head/sys/dev/mps/mps_sas.c  Wed Dec 28 22:18:53 2011       
 (r228938)
> >>> +++ head/sys/dev/mps/mps_sas.c  Wed Dec 28 22:49:28 2011       
 (r228939)
> >>> @@ -937,6 +937,7 @@ mpssas_action(struct cam_sim *sim, union
> >>>                cpi->transport_version = 0;
> >>>                cpi->protocol = PROTO_SCSI;
> >>>                cpi->protocol_version = SCSI_REV_SPC;
> >>> +               cpi->maxio = MAXPHYS;
> >>>                cpi->ccb_h.status = CAM_REQ_CMP;
> >>>                break;
> >>>        }
> >>
> >>
> >> sorry for the late reply, but can we make in into tunable please? i
> >> have in local tree
> >>
> >> --- mps_sas.c.orig      2011-11-17 02:05:04.000000000 -0800
> >> +++ mps_sas.c   2011-12-28 16:05:10.000000000 -0800
> >> @@ -121,6 +121,11 @@
> >>
> >>  MALLOC_DEFINE(M_MPSSAS, "MPSSAS", "MPS SAS memory");
> >>
> >> +int mps_maxio = MAXPHYS;
> >> +TUNABLE_INT("hw.mps.maxio",&mps_maxio);
> >> +SYSCTL_INT(_hw_mps, OID_AUTO, maxio, CTLFLAG_RD,&mps_maxio, 0,
> >> +       "CAM maxio override\n");
> >> +
> >>  static __inline int mpssas_set_lun(uint8_t *lun, u_int ccblun);
> >>  static struct mpssas_target * mpssas_alloc_target(struct mpssas_softc *,
> >>      struct mpssas_target *);
> >> @@ -938,6 +943,7 @@
> >>
> >>                cpi->protocol = PROTO_SCSI;
> >>                cpi->protocol_version = SCSI_REV_SPC;
> >>                cpi->ccb_h.status = CAM_REQ_CMP;
> >> +               cpi->maxio = mps_maxio;
> >>                break;
> >>        }
> >>        case XPT_GET_TRAN_SETTINGS:
> >
> >
> > We can. but could you explain why? Have you found any problems this 
change?
> 
>     It would make it nice when dealing with different controllers -- a
> similar example is that mfi(4) has a tunable called hw.mfi.max_cmds
> which controls the I/O command queue size as not all MegaRAID cards
> have the same I/O queue size capabilities.

Yeah, but that's more a debugging aid.  mfi(4) has a firmware interface
that tells you how many command slots it supports dynamically.  mfi also
uses a better way to compute maxio:

        sc->ld_disk->d_maxsize = min(sc->ld_controller->mfi_max_io * secsize,
            (sc->ld_controller->mfi_max_sge - 1) * PAGE_SIZE);

It would be nice if mps could use a similar formula that was actually
limited by the device's capabilities.  The upper layers will cap transfers
to MAXPHYS elsewhere.

-- 
John Baldwin


More information about the svn-src-head mailing list