Author: mav
Date: Sun Sep 19 19:52:26 2010
New Revision: 212876
URL: http://svn.freebsd.org/changeset/base/212876

Log:
  MFC r201264:
  Call wakeup() only for the first request on the queue.

Modified:
  stable/7/sys/geom/geom_io.c
Directory Properties:
  stable/7/sys/   (props changed)
  stable/7/sys/cddl/contrib/opensolaris/   (props changed)
  stable/7/sys/contrib/dev/acpica/   (props changed)
  stable/7/sys/contrib/pf/   (props changed)

Modified: stable/7/sys/geom/geom_io.c
==============================================================================
--- stable/7/sys/geom/geom_io.c Sun Sep 19 19:51:14 2010        (r212875)
+++ stable/7/sys/geom/geom_io.c Sun Sep 19 19:52:26 2010        (r212876)
@@ -322,6 +322,7 @@ void
 g_io_request(struct bio *bp, struct g_consumer *cp)
 {
        struct g_provider *pp;
+       int first;
 
        KASSERT(cp != NULL, ("NULL cp in g_io_request"));
        KASSERT(bp != NULL, ("NULL bp in g_io_request"));
@@ -388,12 +389,14 @@ g_io_request(struct bio *bp, struct g_co
 
        pp->nstart++;
        cp->nstart++;
+       first = TAILQ_EMPTY(&g_bio_run_down.bio_queue);
        TAILQ_INSERT_TAIL(&g_bio_run_down.bio_queue, bp, bio_queue);
        g_bio_run_down.bio_queue_length++;
        g_bioq_unlock(&g_bio_run_down);
 
        /* Pass it on down. */
-       wakeup(&g_wait_down);
+       if (first)
+               wakeup(&g_wait_down);
 }
 
 void
@@ -401,6 +404,7 @@ g_io_deliver(struct bio *bp, int error)
 {
        struct g_consumer *cp;
        struct g_provider *pp;
+       int first;
 
        KASSERT(bp != NULL, ("NULL bp in g_io_deliver"));
        pp = bp->bio_to;
@@ -454,11 +458,13 @@ g_io_deliver(struct bio *bp, int error)
        pp->nend++;
        if (error != ENOMEM) {
                bp->bio_error = error;
+               first = TAILQ_EMPTY(&g_bio_run_up.bio_queue);
                TAILQ_INSERT_TAIL(&g_bio_run_up.bio_queue, bp, bio_queue);
                bp->bio_flags |= BIO_ONQUEUE;
                g_bio_run_up.bio_queue_length++;
                g_bioq_unlock(&g_bio_run_up);
-               wakeup(&g_wait_up);
+               if (first)
+                       wakeup(&g_wait_up);
                return;
        }
        g_bioq_unlock(&g_bio_run_up);
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to