Am 28.10.2025 um 17:33 hat Hanna Czenczek geschrieben: > For rbd (and others), as described in “rbd: Run co BH CB in the > coroutine’s AioContext”, the pattern of setting a completion flag and > waking a coroutine that yields while the flag is not set can only work > when both run in the same thread. > > iscsi has the same pattern, but the details are a bit different: > iscsi_co_generic_cb() can (as far as I understand) only run through > iscsi_service(), not just from a random thread at a random time. > iscsi_service() in turn can only be run after iscsi_set_events() set up > an FD event handler, which is done in iscsi_co_wait_for_task(). > > As a result, iscsi_co_wait_for_task() will always yield exactly once, > because iscsi_co_generic_cb() can only run after iscsi_set_events(), > after the completion flag has already been checked, and the yielding > coroutine will then be woken only once the completion flag was set to > true. So as far as I can tell, iscsi has no bug and already works fine. > > Still, we don’t need the completion flag because we know we have to > yield exactly once, so we can drop it. This simplifies the code and > makes it more obvious that the “rbd bug” isn’t present here. > > This makes iscsi_co_generic_bh_cb() and iscsi_retry_timer_expired() a > bit boring, and actually, for the former, we could drop it and run > aio_co_wake() directly from scsi_co_generic_cb() to the same effect; but > that would remove the replay_bh_schedule_oneshot_event(), and I assume > we shouldn’t do that. At least schedule both the BH and the timer in > the coroutine’s AioContext to make them simple wrappers around > qemu_coroutine_enter(), without a further BH indirection.
I don't think we have to keep the BH. Is your concern about replay? I doubt that this works across different QEMU versions anyway, and if it does, it's pure luck. > Finally, remove the iTask->co != NULL checks: This field is set by > iscsi_co_init_iscsitask(), which all users of IscsiTask run before even > setting up iscsi_co_generic_cb() as the callback, and it is never set or > cleared elsewhere, so it is impossible to not be set in > iscsi_co_generic_cb(). > > Signed-off-by: Hanna Czenczek <[email protected]> Kevin
