6949843046
This allows net to restart the device backend to configure SVQ on it. Ideally, these changes should not be net specific and they could be done in: * vhost_vdpa_set_features (with VHOST_F_LOG_ALL) * vhost_vdpa_set_vring_addr (with .enable_log) * vhost_vdpa_set_log_base. However, the vdpa net backend is the one with enough knowledge to configure everything because of some reasons: * Queues might need to be shadowed or not depending on its kind (control vs data). * Queues need to share the same map translations (iova tree). Also, there are other problems that may have solutions but complicates the implementation at this stage: * We're basically duplicating vhost_dev_start and vhost_dev_stop, and they could go out of sync. If we want to reuse them, we need a way to skip some function calls to avoid recursiveness (either vhost_ops -> vhost_set_features, vhost_set_vring_addr, ...). * We need to traverse all vhost_dev of a given net device twice: one to stop and get the vq state and another one after the reset to configure properties like address, fd, etc. Because of that it is cleaner to restart the whole net backend and configure again as expected, similar to how vhost-kernel moves between userspace and passthrough. If more kinds of devices need dynamic switching to SVQ we can: * Create a callback struct like VhostOps and move most of the code there. VhostOps cannot be reused since all vdpa backend share them, and to personalize just for networking would be too heavy. * Add a parent struct or link all the vhost_vdpa or vhost_dev structs so we can traverse them. Signed-off-by: Eugenio Pérez <eperezma@redhat.com> Message-Id: <20230303172445.1089785-9-eperezma@redhat.com> Tested-by: Lei Yang <leiyang@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com> |
||
---|---|---|
.. | ||
can | ||
announce.c | ||
checksum.c | ||
clients.h | ||
colo-compare.c | ||
colo-compare.h | ||
colo.c | ||
colo.h | ||
dgram.c | ||
dump.c | ||
eth.c | ||
filter-buffer.c | ||
filter-mirror.c | ||
filter-replay.c | ||
filter-rewriter.c | ||
filter.c | ||
hub.c | ||
hub.h | ||
l2tpv3.c | ||
meson.build | ||
net-hmp-cmds.c | ||
net.c | ||
netmap.c | ||
queue.c | ||
slirp.c | ||
socket.c | ||
stream.c | ||
tap_int.h | ||
tap-bsd.c | ||
tap-linux.c | ||
tap-linux.h | ||
tap-solaris.c | ||
tap-stub.c | ||
tap-win32.c | ||
tap.c | ||
trace-events | ||
trace.h | ||
util.c | ||
util.h | ||
vde.c | ||
vhost-user-stub.c | ||
vhost-user.c | ||
vhost-vdpa-stub.c | ||
vhost-vdpa.c | ||
vmnet_int.h | ||
vmnet-bridged.m | ||
vmnet-common.m | ||
vmnet-host.c | ||
vmnet-shared.c |