On 07/06/2021 11:23, Paolo Bonzini wrote:
On 04/06/21 18:16, Eric Blake wrote:
On Fri, Jun 04, 2021 at 12:07:36PM +0200, Emanuele Giuseppe Esposito wrote:
Extract to a separate function.  Do not rely on FOREACH_SAFE, which is
only "safe" if the *current* node is removed---not if another node is
removed.  Instead, just walk the entire list from the beginning when
asked to resume all suspended requests with a given tag.
-    QLIST_FOREACH_SAFE(r, &s->suspended_reqs, next, next) {
+retry:
+    QLIST_FOREACH(r, &s->suspended_reqs, next) {
          if (!strcmp(r->tag, tag)) {
+            QLIST_REMOVE(r, next);
Isn't the whole point of using QLIST_FOREACH_SAFE the ability to call
QLIST_REMOVE on an element in that list while still iterating?

              qemu_coroutine_enter(r->co);
+            if (all) {
+                goto retry;
+            }
              return 0;
Oh, I see - you abandon the iteration in all control flow paths, so
the simpler loop is still okay.  Still, this confused me enough on
first read that it may be worth a comment, maybe:

/* No need for _SAFE, because iteration stops on first hit */
This is a bit confusing too because it sounds like not using _SAFE is an 
optimization, but it's actually wrong (see commit message).
What about:

/* No need for _SAFE, since a different coroutine can remove another node (not the current one) in this list, and when the current one is removed the iteration starts back from beginning anyways. */
Alternatively, no comment at all.

Thank you,
Emanuele


Reply via email to