]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - block/cfq-iosched.c
cfq: change the meaning of the cfqq_coop flag
[net-next-2.6.git] / block / cfq-iosched.c
index f0994aedb3907e207cf1bbb5a45a5b12a5fa0d29..5e01a0a92c02a0893714d0fd9e85e747fdde4db6 100644 (file)
@@ -202,7 +202,7 @@ enum cfqq_state_flags {
        CFQ_CFQQ_FLAG_prio_changed,     /* task priority has changed */
        CFQ_CFQQ_FLAG_slice_new,        /* no requests dispatched in slice */
        CFQ_CFQQ_FLAG_sync,             /* synchronous queue */
-       CFQ_CFQQ_FLAG_coop,             /* has done a coop jump of the queue */
+       CFQ_CFQQ_FLAG_coop,             /* cfqq is shared */
 };
 
 #define CFQ_CFQQ_FNS(name)                                             \
@@ -950,11 +950,8 @@ static struct cfq_queue *cfq_get_next_queue(struct cfq_data *cfqd)
 static struct cfq_queue *cfq_set_active_queue(struct cfq_data *cfqd,
                                              struct cfq_queue *cfqq)
 {
-       if (!cfqq) {
+       if (!cfqq)
                cfqq = cfq_get_next_queue(cfqd);
-               if (cfqq)
-                       cfq_clear_cfqq_coop(cfqq);
-       }
 
        __cfq_set_active_queue(cfqd, cfqq);
        return cfqq;
@@ -1035,8 +1032,7 @@ static struct cfq_queue *cfqq_close(struct cfq_data *cfqd,
  * assumption.
  */
 static struct cfq_queue *cfq_close_cooperator(struct cfq_data *cfqd,
-                                             struct cfq_queue *cur_cfqq,
-                                             bool probe)
+                                             struct cfq_queue *cur_cfqq)
 {
        struct cfq_queue *cfqq;
 
@@ -1055,11 +1051,6 @@ static struct cfq_queue *cfq_close_cooperator(struct cfq_data *cfqd,
        if (!cfq_cfqq_sync(cfqq))
                return NULL;
 
-       if (cfq_cfqq_coop(cfqq))
-               return NULL;
-
-       if (!probe)
-               cfq_mark_cfqq_coop(cfqq);
        return cfqq;
 }
 
@@ -1243,7 +1234,7 @@ static struct cfq_queue *cfq_select_queue(struct cfq_data *cfqd)
         * cooperators and put the close queue at the front of the service
         * tree.  If possible, merge the expiring queue with the new cfqq.
         */
-       new_cfqq = cfq_close_cooperator(cfqd, cfqq, 0);
+       new_cfqq = cfq_close_cooperator(cfqd, cfqq);
        if (new_cfqq) {
                if (!cfqq->new_cfqq)
                        cfq_setup_merge(cfqq, new_cfqq);
@@ -2294,7 +2285,7 @@ static void cfq_completed_request(struct request_queue *q, struct request *rq)
                 */
                if (cfq_slice_used(cfqq) || cfq_class_idle(cfqq))
                        cfq_slice_expired(cfqd, 1);
-               else if (cfqq_empty && !cfq_close_cooperator(cfqd, cfqq, 1) &&
+               else if (cfqq_empty && !cfq_close_cooperator(cfqd, cfqq) &&
                         sync && !rq_noidle(rq))
                        cfq_arm_slice_timer(cfqd);
        }
@@ -2395,6 +2386,7 @@ cfq_merge_cfqqs(struct cfq_data *cfqd, struct cfq_io_context *cic,
 {
        cfq_log_cfqq(cfqd, cfqq, "merging with queue %p", cfqq->new_cfqq);
        cic_set_cfqq(cic, cfqq->new_cfqq, 1);
+       cfq_mark_cfqq_coop(cfqq->new_cfqq);
        cfq_put_queue(cfqq);
        return cic_to_cfqq(cic, 1);
 }