+static int
+mlx5_vdpa_mtu_set(struct mlx5_vdpa_priv *priv)
+{
+ struct ifreq request;
+ uint16_t vhost_mtu = 0;
+ uint16_t kern_mtu = 0;
+ int ret = rte_vhost_get_mtu(priv->vid, &vhost_mtu);
+ int sock;
+ int retries = MLX5_VDPA_MAX_RETRIES;
+
+ if (ret) {
+ DRV_LOG(DEBUG, "Cannot get vhost MTU - %d.", ret);
+ return ret;
+ }
+ if (!vhost_mtu) {
+ DRV_LOG(DEBUG, "Vhost MTU is 0.");
+ return ret;
+ }
+ ret = mlx5_get_ifname_sysfs(priv->ctx->device->ibdev_path,
+ request.ifr_name);
+ if (ret) {
+ DRV_LOG(DEBUG, "Cannot get kernel IF name - %d.", ret);
+ return ret;
+ }
+ sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
+ if (sock == -1) {
+ DRV_LOG(DEBUG, "Cannot open IF socket.");
+ return sock;
+ }
+ while (retries--) {
+ ret = ioctl(sock, SIOCGIFMTU, &request);
+ if (ret == -1)
+ break;
+ kern_mtu = request.ifr_mtu;
+ DRV_LOG(DEBUG, "MTU: current %d requested %d.", (int)kern_mtu,
+ (int)vhost_mtu);
+ if (kern_mtu == vhost_mtu)
+ break;
+ request.ifr_mtu = vhost_mtu;
+ ret = ioctl(sock, SIOCSIFMTU, &request);
+ if (ret == -1)
+ break;
+ request.ifr_mtu = 0;
+ usleep(MLX5_VDPA_USEC);
+ }
+ close(sock);
+ return kern_mtu == vhost_mtu ? 0 : -1;
+}
+