vhost: support dynamically registering server
authorHuawei Xie <huawei.xie@intel.com>
Mon, 23 Feb 2015 17:36:33 +0000 (17:36 +0000)
committerThomas Monjalon <thomas.monjalon@6wind.com>
Tue, 24 Feb 2015 00:38:17 +0000 (01:38 +0100)
commitdbfa62d63f167f8b8aee86a717bafc438e7144ff
tree569c6a51382c91df6d920c36f400a1bd890526ef
parent54292e9520e0141b691579868c6e29a7a0628915
vhost: support dynamically registering server

* support calling rte_vhost_driver_register after rte_vhost_driver_session_start
* add mutext to protect fdset from concurrent access
* add busy flag in fdentry. this flag is set before cb and cleared after cb is finished.

mutex lock scenario in vhost:

* event_dispatch(in rte_vhost_driver_session_start) runs in a separate thread, infinitely
processing vhost messages through cb(callback).
* event_dispatch acquires the lock, get the cb and its context, mark the busy flag,
and releases the mutex.
* vserver_new_vq_conn cb calls fdset_add, which acquires the mutex and add new fd into fdset.
* vserver_message_handler cb frees data context, marks remove flag to request to delete
connfd(connection fd) from fdset.
* after cb returns, event_dispatch
  1. clears busy flag.
  2. if there is remove request, call fdset_del, which acquires mutex, checks busy flag, and
removes connfd from fdset.
* rte_vhost_driver_unregister(not implemented) runs in another thread, acquires the mutex,
calls fdset_del to remove fd(listenerfd) from fdset. Then it could free data context.

The above steps ensures fd data context isn't freed when cb is using.

VM(s) should have been shutdown before rte_vhost_driver_unregister.

Signed-off-by: Huawei Xie <huawei.xie@intel.com>
Acked-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
Acked-by: Tetsuya Mukawa <mukawa@igel.co.jp>
lib/librte_vhost/vhost_user/fd_man.c
lib/librte_vhost/vhost_user/fd_man.h
lib/librte_vhost/vhost_user/vhost-net-user.c