On 16.04.2019 12:45, David Marchand wrote:
> Rather than poll all disabled queues and waste some memory for vms that
> have been shutdown, we can reconfigure when receiving a destroy
> connection notification from the vhost library.
>
> $ while true; do
> ovs-appctl dpif-netdev/pmd-rxq-show |awk '
> /port: / {
> tot++;
> if ($NF == "disabled") {
> dis++;
> }
> }
> END {
> print "total: " tot ", enabled: " (tot - dis)
> }'
> sleep 1
> done
>
> total: 66, enabled: 66
> total: 6, enabled: 2
>
> Note: this patch requires a fix for the vhost library submitted here:
> http://patchwork.dpdk.org/patch/52680/
>
> Without it, this change will do nothing but have openvswitch complain
> that the vhost device is unknown:
>
> dpdk|INFO|VHOST_CONFIG: vhost peer closed
> dpdk|ERR|VHOST_CONFIG: (0) device not found.
>
> dpdk|INFO|VHOST_CONFIG: vhost peer closed
> dpdk|ERR|VHOST_CONFIG: (1) device not found.
>
> Signed-off-by: David Marchand <[email protected]>
> ---
> lib/netdev-dpdk.c | 35 ++++++++++++++++++++++++++++++++++-
> 1 file changed, 34 insertions(+), 1 deletion(-)
>
> diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
> index fc554db..a7fae4f 100644
> --- a/lib/netdev-dpdk.c
> +++ b/lib/netdev-dpdk.c
> @@ -186,12 +186,15 @@ static const struct rte_eth_conf port_conf = {
> static int new_device(int vid);
> static void destroy_device(int vid);
> static int vring_state_changed(int vid, uint16_t queue_id, int enable);
> +static void destroy_connection(int vid);
> static const struct vhost_device_ops virtio_net_device_ops =
> {
> .new_device = new_device,
> .destroy_device = destroy_device,
> .vring_state_changed = vring_state_changed,
> - .features_changed = NULL
> + .features_changed = NULL,
> + .new_connection = NULL,
> + .destroy_connection = destroy_connection,
> };
>
> enum { DPDK_RING_SIZE = 256 };
> @@ -3661,6 +3664,36 @@ vring_state_changed(int vid, uint16_t queue_id, int
> enable)
> return 0;
> }
>
> +static void
> +destroy_connection(int vid)
> +{
> + struct netdev_dpdk *dev;
> + char ifname[IF_NAME_SZ];
> +
> + rte_vhost_get_ifname(vid, ifname, sizeof ifname);
> +
> + ovs_mutex_lock(&dpdk_mutex);
> + /* Add device to the vhost port with the same name as that passed down.
> */
This comment is a leftover from the 'new_device'. It could be dropped.
> + LIST_FOR_EACH (dev, list_node, &dpdk_list) {
> + ovs_mutex_lock(&dev->mutex);
> + if (nullable_string_is_equal(ifname, dev->vhost_id)) {
> + uint32_t qp_num = NR_QUEUE;
> +
It might be good to check if device is destroyed here and log an error
otherwise.
> + /* Restore the number of queue pairs to default. */
> + if (dev->requested_n_txq != qp_num
> + || dev->requested_n_rxq != qp_num) {
> + dev->requested_n_rxq = qp_num;
> + dev->requested_n_txq = qp_num;
> + netdev_request_reconfigure(&dev->up);
> + }
> + ovs_mutex_unlock(&dev->mutex);
> + break;
> + }
> + ovs_mutex_unlock(&dev->mutex);
> + }
> + ovs_mutex_unlock(&dpdk_mutex);
> +}
> +
> /*
> * Retrieve the DPDK virtio device ID (vid) associated with a vhostuser
> * or vhostuserclient netdev.
>
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev