The code that combines adjacent ranges for BIO_DELETEs to optimize

trims to the device assumes the list is sorted. Don't apply the
optimization of not sorting the queue when we have SSDs to the
delete_queue, since it causes more discard traffic to the drive. While
one could argue that the higher levels should coalesce the trims,
that's not done today, so some optimization at this level is needed.

CR: https://phabric.freebsd.org/D142
This commit is contained in:
imp 2014-06-05 17:13:42 +00:00
parent 47370c0263
commit f193c143d5
2 changed files with 5 additions and 18 deletions

View File

@ -729,10 +729,7 @@ adastrategy(struct bio *bp)
*/
if (bp->bio_cmd == BIO_DELETE &&
(softc->flags & ADA_FLAG_CAN_TRIM)) {
if (ADA_SIO)
bioq_disksort(&softc->trim_queue, bp);
else
bioq_insert_tail(&softc->trim_queue, bp);
bioq_disksort(&softc->trim_queue, bp);
} else {
if (ADA_SIO)
bioq_disksort(&softc->bio_queue, bp);

View File

@ -1383,10 +1383,7 @@ dastrategy(struct bio *bp)
* Place it in the queue of disk activities for this disk
*/
if (bp->bio_cmd == BIO_DELETE) {
if (DA_SIO)
bioq_disksort(&softc->delete_queue, bp);
else
bioq_insert_tail(&softc->delete_queue, bp);
bioq_disksort(&softc->delete_queue, bp);
} else if (DA_SIO) {
bioq_disksort(&softc->bio_queue, bp);
} else {
@ -2805,16 +2802,9 @@ cmd6workaround(union ccb *ccb)
da_delete_method_desc[old_method],
da_delete_method_desc[softc->delete_method]);
if (DA_SIO) {
while ((bp = bioq_takefirst(&softc->delete_run_queue))
!= NULL)
bioq_disksort(&softc->delete_queue, bp);
} else {
while ((bp = bioq_takefirst(&softc->delete_run_queue))
!= NULL)
bioq_insert_tail(&softc->delete_queue, bp);
}
bioq_insert_tail(&softc->delete_queue,
while ((bp = bioq_takefirst(&softc->delete_run_queue)) != NULL)
bioq_disksort(&softc->delete_queue, bp);
bioq_disksort(&softc->delete_queue,
(struct bio *)ccb->ccb_h.ccb_bp);
ccb->ccb_h.ccb_bp = NULL;
return (0);