svn commit: r280757 - in head/sys/geom: mirror raid
Alexander Motin
mav at FreeBSD.org
Fri Mar 27 12:44:30 UTC 2015
Author: mav
Date: Fri Mar 27 12:44:28 2015
New Revision: 280757
URL: https://svnweb.freebsd.org/changeset/base/280757
Log:
Remove request sorting from GEOM_MIRROR and GEOM_RAID.
When CPU is not busy, those queues are typically empty. When CPU is busy,
then one more extra sorting is the last thing it needs. If specific device
(HDD) really needs sorting, then it will be done later by CAM.
This supposed to fix livelock reported for mirror of two SSDs, when UFS
fires zillion of BIO_DELETE requests, that totally blocks I/O subsystem by
pointless sorting of requests and responses under single mutex lock.
MFC after: 2 weeks
Modified:
head/sys/geom/mirror/g_mirror.c
head/sys/geom/raid/g_raid.c
Modified: head/sys/geom/mirror/g_mirror.c
==============================================================================
--- head/sys/geom/mirror/g_mirror.c Fri Mar 27 11:14:12 2015 (r280756)
+++ head/sys/geom/mirror/g_mirror.c Fri Mar 27 12:44:28 2015 (r280757)
@@ -888,7 +888,7 @@ g_mirror_done(struct bio *bp)
sc = bp->bio_from->geom->softc;
bp->bio_cflags = G_MIRROR_BIO_FLAG_REGULAR;
mtx_lock(&sc->sc_queue_mtx);
- bioq_disksort(&sc->sc_queue, bp);
+ bioq_insert_tail(&sc->sc_queue, bp);
mtx_unlock(&sc->sc_queue_mtx);
wakeup(sc);
}
@@ -975,7 +975,7 @@ g_mirror_regular_request(struct bio *bp)
else {
pbp->bio_error = 0;
mtx_lock(&sc->sc_queue_mtx);
- bioq_disksort(&sc->sc_queue, pbp);
+ bioq_insert_tail(&sc->sc_queue, pbp);
mtx_unlock(&sc->sc_queue_mtx);
G_MIRROR_DEBUG(4, "%s: Waking up %p.", __func__, sc);
wakeup(sc);
@@ -1015,7 +1015,7 @@ g_mirror_sync_done(struct bio *bp)
sc = bp->bio_from->geom->softc;
bp->bio_cflags = G_MIRROR_BIO_FLAG_SYNC;
mtx_lock(&sc->sc_queue_mtx);
- bioq_disksort(&sc->sc_queue, bp);
+ bioq_insert_tail(&sc->sc_queue, bp);
mtx_unlock(&sc->sc_queue_mtx);
wakeup(sc);
}
@@ -1144,7 +1144,7 @@ g_mirror_start(struct bio *bp)
return;
}
mtx_lock(&sc->sc_queue_mtx);
- bioq_disksort(&sc->sc_queue, bp);
+ bioq_insert_tail(&sc->sc_queue, bp);
mtx_unlock(&sc->sc_queue_mtx);
G_MIRROR_DEBUG(4, "%s: Waking up %p.", __func__, sc);
wakeup(sc);
Modified: head/sys/geom/raid/g_raid.c
==============================================================================
--- head/sys/geom/raid/g_raid.c Fri Mar 27 11:14:12 2015 (r280756)
+++ head/sys/geom/raid/g_raid.c Fri Mar 27 12:44:28 2015 (r280757)
@@ -1132,7 +1132,7 @@ g_raid_start(struct bio *bp)
return;
}
mtx_lock(&sc->sc_queue_mtx);
- bioq_disksort(&sc->sc_queue, bp);
+ bioq_insert_tail(&sc->sc_queue, bp);
mtx_unlock(&sc->sc_queue_mtx);
if (!dumping) {
G_RAID_DEBUG1(4, sc, "Waking up %p.", sc);
@@ -1344,7 +1344,7 @@ g_raid_unlock_range(struct g_raid_volume
(intmax_t)(lp->l_offset+lp->l_length));
mtx_lock(&sc->sc_queue_mtx);
while ((bp = bioq_takefirst(&vol->v_locked)) != NULL)
- bioq_disksort(&sc->sc_queue, bp);
+ bioq_insert_tail(&sc->sc_queue, bp);
mtx_unlock(&sc->sc_queue_mtx);
free(lp, M_RAID);
return (0);
@@ -1438,7 +1438,7 @@ g_raid_disk_done(struct bio *bp)
sd = bp->bio_caller1;
sc = sd->sd_softc;
mtx_lock(&sc->sc_queue_mtx);
- bioq_disksort(&sc->sc_queue, bp);
+ bioq_insert_tail(&sc->sc_queue, bp);
mtx_unlock(&sc->sc_queue_mtx);
if (!dumping)
wakeup(sc);
More information about the svn-src-head
mailing list