On Fri, Dec 17, 2021 at 05:59:48PM +0000, Jag Raman wrote: > > > > On Dec 16, 2021, at 6:17 AM, Stefan Hajnoczi <stefa...@redhat.com> wrote: > > > > On Wed, Dec 15, 2021 at 10:35:31AM -0500, Jagannathan Raman wrote: > >> @@ -114,6 +118,62 @@ static void vfu_object_set_device(Object *obj, const > >> char *str, Error **errp) > >> vfu_object_init_ctx(o, errp); > >> } > >> > >> +static void vfu_object_ctx_run(void *opaque) > >> +{ > >> + VfuObject *o = opaque; > >> + int ret = -1; > >> + > >> + while (ret != 0) { > >> + ret = vfu_run_ctx(o->vfu_ctx); > >> + if (ret < 0) { > >> + if (errno == EINTR) { > >> + continue; > >> + } else if (errno == ENOTCONN) { > >> + qemu_set_fd_handler(o->vfu_poll_fd, NULL, NULL, NULL); > >> + o->vfu_poll_fd = -1; > >> + object_unparent(OBJECT(o)); > >> + break; > > > > If nothing else logs a message then I think that should be done here so > > users know why their vfio-user server object disappeared. > > Sure will do. > > Do you prefer a trace, or a message to the console? Trace makes sense to me. > Presently, the client could unplug the vfio-user device which would trigger > the > deletion of this object. This process could happen quietly.
If there is no way to differentiate graceful disconnect from unexpected disconnect then logging might be too noisy. Regarding the automatic deletion of the object, that might not be desirable for two reasons: 1. It prevents reconnection or another client connecting. 2. Management tools are in the dark about it. For #2 there are monitor events that QEMU emits to notify management tools about state changes like disconnections. It's worth thinking about current and future use cases before baking in a policy like automatically deleting VfuObject on disconnect because it's inflexible and would require a QEMU update in the future to support a different policy. One approach is to emit a disconnect event but leave the VfuObject in a disconnected state. The management tool can then restart or clean up, depending on its policy. I'm not sure what's best because it depends on the use cases, but maybe you and others have ideas here. > >> @@ -208,6 +284,8 @@ static void vfu_object_init(Object *obj) > >> TYPE_VFU_OBJECT, TYPE_REMOTE_MACHINE); > >> return; > >> } > >> + > >> + o->vfu_poll_fd = -1; > >> } > > > > This must call qemu_set_fd_handler(o->vfu_poll_fd, NULL, NULL, NULL) > > when o->vfu_poll_fd != -1 to avoid leaving a dangling fd handler > > callback registered. > > This is during the init phase, and the FD handlers are not set. Do you mean > to add this at finalize? > > I agree it’s good to explicitly add this at finalize. But vfu_destroy_ctx() > should > trigger a ENOTCONN, which would do it anyway. I'm not sure my comment makes sense since this is the init function, not finalize. However, it's not clear to me that the o->vfu_poll_fd fd handler is unregistered from the event loop when VfuObject is finalized (e.g. by the object-del monitor command). You say vfu_destroy_ctx() triggers ENOTCONN, but the VfuObject is freed after finalize returns so when is the fd handler deregistered? Stefan
signature.asc
Description: PGP signature