Hi

On Mon, Oct 22, 2018 at 5:24 PM Yury Kotov <yury-ko...@yandex-team.ru> wrote:
>
> Hi,
>
> I examined vhost-user devices and found some chardev using strangeness.
>
> Is it ok, that vhost-user's set_status do sync chardev io ops from KVM thread?
> It seems that chardev doesn't support working with different threads.
>
> For example, I think such race is possible (two simultaneous events):
> 1) Vhost-user server was killed (main thread will handle G_IO_HUP),
> 2) Virtio-pci bus handles guest driver's set_status command.
>    Some io op from vhost-user backend will fail because of 1).
>
> So, it is possible to enter tcp_chr_disconnect twice from the main thread and
> from KVM thread.
>
> Backtrace examples:
>
> KVM thread (handle set_status of guest):
> tcp_chr_disconnect
> tcp_chr_write (cc->chr_write)
> qemu_chr_write_buffer
> qemu_chr_write
> qemu_chr_fe_write_all
> vhost_user_write
> vhost_user_set_mem_table (hdev->vhost_ops->vhost_set_mem_table)
> vhost_dev_start
> vhost_user_blk_start (or another vhost-user device)
> vhost_user_blk_set_status (vdc->set_status)
>
> Main thread (handle vhost server disconnect):
> tcp_chr_disconnect
> tcp_chr_hup
> g_main_context_dispatch
> glib_pollfds_poll
> os_host_main_loop_wait
> main_loop_wait
> main_loop
> main
>
> Is it really a problem or do I misunderstand?

I think you are correct, it's a problem. Are you working on a
solution? (either using the chardev lock, or perhaps relying on main
thread HUP handler only, or a combination of both approaches)

thanks

-- 
Marc-André Lureau

Reply via email to