On 2020/5/13 下午5:47, Dima Stepanov wrote:
     case CHR_EVENT_CLOSED:
         /* a close event may happen during a read/write, but vhost
          * code assumes the vhost_dev remains setup, so delay the
          * stop & clear to idle.
          * FIXME: better handle failure in vhost code, remove bh
          */
         if (s->watch) {
             AioContext *ctx = qemu_get_current_aio_context();

             g_source_remove(s->watch);
             s->watch = 0;
             qemu_chr_fe_set_handlers(&s->chr, NULL, NULL, NULL, NULL,
                                      NULL, NULL, false);

             aio_bh_schedule_oneshot(ctx, chr_closed_bh, opaque);
         }
         break;

I think it's time we dropped the FIXME and moved the handling to common
code. Jason? Marc-André?
I agree. Just to confirm, do you prefer bh or doing changes like what is
done in this series? It looks to me bh can have more easier codes.
Could it be a good idea just to make disconnect in the char device but
postphone clean up in the vhost-user-blk (or any other vhost-user
device) itself? So we are moving the postphone logic and decision from
the char device to vhost-user device. One of the idea i have is as
follows:
   - Put ourself in the INITIALIZATION state
   - Start these vhost-user "handshake" commands
   - If we got a disconnect error, perform disconnect, but don't clean up
     device (it will be clean up on the roll back). I can be done by
     checking the state in vhost_user_..._disconnect routine or smth like it


Any issue you saw just using the aio bh as Michael posted above.

Then we don't need to deal with the silent vhost_dev_stop() and we will have codes that is much more easier to understand.

Thank


   - vhost-user command returns error back to the _start() routine
   - Rollback in one place in the start() routine, by calling this
     postphoned clean up for the disconnect



Reply via email to