]> xenbits.xensource.com Git - people/dstodden/blktap.git/commitdiff
PR-1053: Iterate VBD runs between schedules.
authorDaniel Stodden <daniel.stodden@citrix.com>
Tue, 15 Feb 2011 09:37:45 +0000 (01:37 -0800)
committerDaniel Stodden <daniel.stodden@citrix.com>
Tue, 15 Feb 2011 09:37:45 +0000 (01:37 -0800)
Request queues are only processed once per iteration, once after
select. Presently, request completion goes last, after after new I/O.

As a consequence, vreq completion in filter drivers cannot easily
drive new requests without some pipe loop hooked into the event loop.

Fixed by iterating VBD runs. Iteration stops once all VBDs stop
indicating progress.

Iteration runs a dedicated vbd_recheck_state, because normal
vbd_check_state contains which should not be iterated (most notably
-EBUSY failures).

Signed-off-by: Daniel Stodden <daniel.stodden@citrix.com>
drivers/tapdisk-server.c
drivers/tapdisk-vbd.c
drivers/tapdisk-vbd.h

index 3291160cc437e9d25c36a27566052538fd2a7190..e59ca4e20acc81a720ec0fa451e1cf46bd098809 100644 (file)
@@ -216,6 +216,18 @@ tapdisk_server_check_vbds(void)
                tapdisk_vbd_check_state(vbd);
 }
 
+static int
+tapdisk_server_recheck_vbds(void)
+{
+       td_vbd_t *vbd, *tmp;
+       int rv = 0;
+
+       tapdisk_server_for_each_vbd(vbd, tmp)
+               rv += tapdisk_vbd_recheck_state(vbd);
+
+       return rv;
+}
+
 static void
 tapdisk_server_stop_vbds(void)
 {
@@ -303,8 +315,12 @@ tapdisk_server_iterate(void)
                DBG(TLOG_WARN, "server wait returned %d\n", ret);
 
        tapdisk_server_check_vbds();
-       tapdisk_server_submit_tiocbs();
-       tapdisk_server_kick_responses();
+       do {
+               tapdisk_server_submit_tiocbs();
+               tapdisk_server_kick_responses();
+
+               ret = tapdisk_server_recheck_vbds();
+       } while (ret);
 }
 
 static void
index 1ec1a17b7f2a219b436dfe9be858038b8db60f5e..03bbcb3b7c4d906ae1afb54098961d9d1372dac5 100644 (file)
@@ -1263,6 +1263,17 @@ tapdisk_vbd_issue_new_requests(td_vbd_t *vbd)
        return 0;
 }
 
+int
+tapdisk_vbd_recheck_state(td_vbd_t *vbd)
+{
+       if (list_empty(&vbd->new_requests))
+               return 0;
+
+       tapdisk_vbd_issue_new_requests(vbd);
+
+       return 1;
+}
+
 static int
 tapdisk_vbd_kill_requests(td_vbd_t *vbd)
 {
index 3fc1ff039d42ff0f3daecb5daecb4cf0bad6d306..bfcee0f0bf637fef7e670d20666dd4ebc8ab3a0c 100644 (file)
@@ -174,6 +174,7 @@ int tapdisk_vbd_pause(td_vbd_t *);
 int tapdisk_vbd_resume(td_vbd_t *, const char *);
 void tapdisk_vbd_kick(td_vbd_t *);
 void tapdisk_vbd_check_state(td_vbd_t *);
+int tapdisk_vbd_recheck_state(td_vbd_t *);
 void tapdisk_vbd_check_progress(td_vbd_t *);
 void tapdisk_vbd_debug(td_vbd_t *);
 void tapdisk_vbd_stats(td_vbd_t *, td_stats_t *);