svn commit: r298002 - in head/sys: cam cam/ata cam/scsi conf dev/ahci

Warner Losh imp at bsdimp.com
Fri Apr 15 05:01:36 UTC 2016


On Thu, Apr 14, 2016 at 10:48 PM, Steven Hartland <
steven.hartland at multiplay.co.uk> wrote:

> Great to see this hitting the tree Warner, I have a few questions inline
> below.
>
>
> On 14/04/2016 22:47, Warner Losh wrote:
>
>> Author: imp
>> Date: Thu Apr 14 21:47:58 2016
>> New Revision: 298002
>> URL: https://svnweb.freebsd.org/changeset/base/298002
>>
>> Log:
>>    New CAM I/O scheduler for FreeBSD. The default I/O scheduler is the
>> same
>>    as before. The common scheduling bits have moved from inline code in
>>    each of the CAM periph drivers into a library that implements the
>>    default scheduling.
>>       In addition, a number of rate-limiting and I/O preference options
>> can
>>    be enabled by adding CAM_IOSCHED_NETFLIX to your config file. A number
>>    of extra stats are also maintained. CAM_IOSCHED_NETFLIX isn't on by
>>    default because it uses a separate BIO_READ and BIO_WRITE queue, so
>>    doesn't honor BIO_ORDERED between these two types of operations. We
>>    already didn't honor it for BIO_DELETE, and we don't depend on
>>    BIO_ORDERED between reads and writes anywhere in the system (it is
>>    currently used with BIO_FLUSH in ZFS to make sure some writes are
>>    complete before others start and as a poor-man's soft dependency in
>>    one place in UFS where we won't be issuing READs until after the
>>    operation completes). However, out of an abundance of caution, it
>>    isn't enabled by default.
>>       Plus, this also brings in NCQ TRIM support for those SSDs that
>> support
>>    it. A black list is also provided for known rogues that use NCQ trim
>>    as an excuse to corrupt the drive. It was difficult to separate out
>>    into a separate commit.
>>       This code has run in production at Netflix for over a year now.
>>       Sponsored by: Netflix, Inc
>>    Differential Revision: https://reviews.freebsd.org/D4609
>>
> snip...
>
>> @@ -844,7 +920,7 @@ adadump(void *arg, void *virtual, vm_off
>>                                     0,
>>                                     NULL,
>>                                     0,
>> -                                   ada_default_timeout*1000);
>> +                                   5*1000);
>>
> Not a fan of random constants, is there a reason why this is now just 5
> instead if ada_default_timeout, merge issue perhaps?
>

Already added a comment here. thanks for the suggestion.


> snip...
>
> @@ -1898,6 +2154,31 @@ out:
>>   static int
>>   adaerror(union ccb *ccb, u_int32_t cam_flags, u_int32_t sense_flags)
>>   {
>> +       struct ada_softc *softc;
>> +       struct cam_periph *periph;
>> +
>> +       periph = xpt_path_periph(ccb->ccb_h.path);
>> +       softc = (struct ada_softc *)periph->softc;
>> +
>> +       switch (ccb->ccb_h.status & CAM_STATUS_MASK) {
>> +       case CAM_CMD_TIMEOUT:
>> +#ifdef CAM_IO_STATS
>> +               softc->timeouts++;
>> +#endif
>> +               break;
>> +       case CAM_REQ_ABORTED:
>> +       case CAM_REQ_CMP_ERR:
>> +       case CAM_REQ_TERMIO:
>> +       case CAM_UNREC_HBA_ERROR:
>> +       case CAM_DATA_RUN_ERR:
>> +       case CAM_ATA_STATUS_ERROR:
>> +#ifdef CAM_IO_STATS
>> +               softc->errors++;
>> +#endif
>> +               break;
>> +       default:
>> +               break;
>> +       }
>>
> Am I missing something or does this entire switch do nothing unless
> CAM_IO_STATS is set and hence could all be under the #ifdef?
>

Looks like you are correct. I'll tweak it.

Warner


More information about the svn-src-head mailing list